Magic Racket Student Language for VS Code
This extension adds support for Racket to VS Code with a focus on
the How to Design Programs (HTDP) Student Languages
Setting up
Install Magic Racket. You can do that from the VS Code extension marketplace, or from the Open VSX Registry if you're using VS Codium.
Make sure you have raco
on your path (see section Troubleshooting)
Install the racket-langserver by running the following command in the terminal:
raco pkg install racket-langserver
Or update it using
raco pkg update racket-langserver
If don't want to use the lang-server at all, you don't have to. Just set "magicRacketStudent.languageServer.enabled": false
in your configuration file. But note that if you do so, you won't get the “smart” features like autocomplete, formatting, etc.
If you are running VSCode on WSL or a headless Linux server, please see the Troubleshooting section below.
Changes in this fork
- Grammar definitions are modified to support the HTDP student languages
- Considers the semantic rather than syntactic meaning for Syntax Highlighting
- More accurately follows Textmate Grammar naming conventions
- Supports running HTDP tests with a dedicated button (replaces the REPL button)
Features
Magic Racket does
- Support Racket LSP through racket-langserver, which brings jump to definition, hover information, formatting, and more
- Have nearly complete support for every valid Racket syntax: byte strings, regexps, define clauses, vectors... You name it, we have it
- Support highlighting of all of the standard functions in ~~
#lang racket
~~ #lang htdp/bsl
- #lang htdp/asl
- Turn many little VS Code knobs and switches to provide you the best possible Racket-writing experience
...but at the same time doesn't:
- Get in your way by providing useless snippets
- Throw around colorization just for the sake of it
- Try to do everything. What can be left up on the LSP, or some other package, will be. Focus is key
LSP Support
This fork of Magic Racket supports racket-langserver. The current features are:
- Underline errors
- Jump to definition
- Find references
- Hover information
Syntax highlighting
This fork of Magic Racket strives to be correct and consistent — and it supports most of the language features as well.
It does not aim to mimic highlighting in DrRacket, but rather to ensure accuracy.
REPL support
You can load and execute files in Magic Racket by using the icons in the top right corner of your editor (see the image below), or from the commands console in VS Code. You can open the list of all commands by pressing Cmd+Shift+P
(Ctrl+Shift+P
if you're on Linux or Windows) and then search through them by typing. All of Magic Racket's commands are prefixed by Racket:
to make the searching easier.
In Magic Racket, each file will have its own REPL in which it'll load every time you use the Racket: Load file in REPL
command. You can choose to mimic this behavior also for Racket: Run file in terminal
, or you can run all files in one output terminal.
The list of commands added by Magic Racket:
Racket: Execute selection in REPL
- Executes the selection(s) in the REPL. Available also by right-clicking the selection or by using the shortcut Alt+Enter.
Racket: Load file in REPL
- Loads the current file into its REPL, creating a new REPL in the process if the file doesn't have one yet. Does have its icon in the top right corner.
Racket: Run file in terminal
- Runs the whole file in a terminal, outside of REPL environment. Depending on user settings, the terminal will be either shared among all files (default), or the one that belongs to the file.
Racket: Test file in terminal
- Runs
raco test
on the file
Racket: Open the REPL for the current file
- Shows the REPL belonging to the current file, or opens a new one if the file doesn't have one yet.
Racket: Show the output terminal for the current file
- Similarly to the command above, this one shows the output terminal of the current file.
You can set the names of the REPLs and output terminals in the settings.
Minor QoL features
These aren't game-changers, but they certainly help.
- You can write a λ (lambda) by using the included snippet
lmb
or the shortcut
Option+\ (Alt+\ on Windows and Linux)
- VS Code recognizes the "words" in Racket correctly, meaning that moving among
words using Option+Left and Option+Right
(Ctrl+Left and Ctrl+Right on Windows and Linux) works as
expected, and so does the double-click word selection
Configuration
Magic Racket's options can be found in the Magic Racket Student Language
section in VSCode preferences.
However, if you would like to change some VSCode option only for Racket (e.g. if you don't like the predefined editor rulers), you can do so by directly adding them into a [racket]
section in settings.json
:
"[racket]": {
"editor.rulers": [],
// some further Racket-specific configuration
}
Troubleshooting
GTK, other GUI dependencies
If you're trying to use Magic Racket on Windows, especially under Docker or WSL,
you might be getting some errors regarding GTK or other missing dynamic
libraries. This is caused by the langserver
depending on GTK to function properly, please see issue
https://github.com/Eugleo/magic-racket/issues/51 for a workaround.
Similar problems can be sometimes encountered on Linux, especially if your
Racket installation is sandboxed via Snap or a similar style of alternative
packaging. See https://github.com/Eugleo/magic-racket/issues/109 for more info.
These issues likely indicate a packaging issue, so you may want to try
installing Racket without any sandboxing layers like this.
On both Linux and WSL, there is sometimes error about header being required to
have a content-length property. For a fix, see issue
https://github.com/Eugleo/magic-racket/issues/77.
Setting up raco
properly
We need raco to install the language server package. The good news is, raco
is automatically installed during the installation of Racket. On MacOS, it can be found in the /Applications/[Racket folder]/bin
directory, on Windows (or so I am told) it's directly in the Racket install directory.
However, after the installation, your computer doesn't know where the command raco
is, so you need to do either of the following things:
(recommended) add the directory where raco
is located (instructions for Unix, and something like this for PowerShell on Windows)
first move to the directory where raco
is located (by using cd
, for example), and then run it by prefixing the raco
command with ./
(Unix) or .\
(Windows), like this:
./raco pkg update racket-langserver
or, on Windows,
.\raco pkg update racket-langserver
Release notes
Please see the changelog for the information about the latest updates.