#+TITLE: Racket layer #+TAGS: general|layer|multi-paradigm|programming [[file:img/racket.png]] * Table of Contents :TOC_5_gh:noexport: - [[#description][Description]] - [[#features][Features:]] - [[#install][Install]] - [[#structurally-safe-editing][Structurally safe editing]] - [[#key-bindings][Key bindings]] - [[#navigation][Navigation]] - [[#documentation][Documentation]] - [[#tests][Tests]] - [[#repl][REPL]] - [[#other-key-bindings][Other key bindings]] * Description Adds support for the [[http://racket-lang.org/][Racket]] programming language. ** Features: - Syntax highlighting with =racket-mode= - Test runner - Interactive REPL - Code navigation with =gtags= - Structurally safe editing using optional [[https://github.com/luxbock/evil-cleverparens][evil-cleverparens]] * Install To use this configuration layer, add it to your =~/.spacemacs=. You will need to add =racket= to the existing =dotspacemacs-configuration-layers= list in this file. You will also need DrRacket installed. Alternatively, one can use the "Minimal Racket" installation, and then run the following command. #+BEGIN_SRC Bash raco pkg install drracket #+END_SRC * Structurally safe editing This layer adds support for =evil-cleverparens= which allows to safely edit lisp code by keeping the s-expressions balanced. By default this mode is not activated. You can turn it on locally on the active buffer with ~SPC m T s~ (=s= for safe). To turn it on automatically for all =racket= buffers call the following function in your =dotspacemacs/user-config= function: #+BEGIN_SRC emacs-lisp (spacemacs/toggle-evil-safe-lisp-structural-editing-on-register-hook-racket-mode) #+END_SRC or to enable it for all supported modes: #+BEGIN_SRC emacs-lisp (spacemacs/toggle-evil-safe-lisp-structural-editing-on-register-hooks) #+END_SRC When enabled the symbol =🆂= should be displayed in the mode-line. * Key bindings ** Navigation | Key binding | Description | |-------------+-------------------------------------| | ~SPC m g `~ | Return to previous location | | ~SPC m g g~ | Go to definition of symbol at point | | ~SPC m g m~ | Go to module at point | | ~SPC m g r~ | Open require path | ** Documentation | Key binding | Description | |-------------+---------------------------------------------------------------| | ~SPC m h d~ | Describes the function at point in a =Racket Describe= buffer | | ~SPC m h h~ | View documentation of the identifier or string at point. | ** Tests | Key binding | Description | |-------------+-----------------------------------| | ~SPC m t b~ | Run tests of buffer | | ~SPC m t B~ | Run tests of buffer with coverage | ** REPL | Key binding | Description | |-------------+-----------------------------------------------------------------| | ~SPC m s b~ | Send buffer to REPL | | ~SPC m s B~ | Send buffer to REPL and switch to REPL buffer in =insert state= | | ~SPC m s e~ | Send last sexp to REPL | | ~SPC m s E~ | Send last sexp to REPL and switch to REPL in =insert state= | | ~SPC m s f~ | Send function at point to REPL | | ~SPC m s F~ | Send function at point and switch to REPL in =insert state= | | ~SPC m s i~ | Start a REPL or switch to REPL buffer | | ~SPC m s r~ | Send region to REPL | | ~SPC m s R~ | Send region to REPL and switch to REPL in =insert state= | | ~SPC m s s~ | Show and switch to REPL buffer | ** Other key bindings | Key binding | Description | |-------------+---------------------------------------------------------------------------------| | ~SPC m i l~ | Insert lambda character | | ~H-r~ | Run current file and open REPL (=H= is hyper, *may* be bound to command on macOS) |