#+TITLE: Scheme layer #+TAGS: dsl|layer|lisp|programming * Table of Contents :TOC_5_gh:noexport: - [[#description][Description]] - [[#features][Features:]] - [[#install][Install]] - [[#structuraly-safe-editing][Structuraly safe editing]] - [[#key-bindings][Key bindings]] - [[#compiling][Compiling]] - [[#navigation][Navigation]] - [[#documentation][Documentation]] - [[#insertion][Insertion]] - [[#macroexpansion][Macroexpansion]] - [[#repl][REPL]] - [[#evaluation][Evaluation]] * Description This layer adds support for Scheme via [[http://geiser.nongnu.org][Geiser]]. Note that combined usage of racket-mode and geiser has not been tested. ** Features: - Support the Scheme compiler [[https://www.call-cc.org/][Chicken]] - Support for the extension language platform [[https://www.gnu.org/software/guile/][Guile]] - Structuraly 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 =scheme= to the existing =dotspacemacs-configuration-layers= list in this file. For full Chicken support, the following commands should be run: #+BEGIN_SRC shell $ chicken-install -s apropos chicken-doc $ cd `csi -p '(chicken-home)'` $ curl https://3e8.org/pub/chicken-doc/chicken-doc-repo.tgz | sudo tar zx #+END_SRC *Note:* Chicken 5 does not have =chicken-home= imported by default, so the command for changing to that directory can be accomplished with this: #+BEGIN_SRC shell $ cd `csi -b -e "(import (chicken platform))" -p "(chicken-home)"` #+END_SRC Additionally, as of 2018-12-12 there is a [[https://git.archlinux.org/svntogit/community.git/commit/trunk?h=packages/chicken&id=8b9a65eb88d899f7c9c78b56bba5bea5cdba534a][naming conflict]] in some of the Linux package repos: #+BEGIN_EXAMPLE # Chicken had csc and csi first, but then mono introduced a conflict and # does not seem to want to change this. OpenBSD renamed csc and csi to # chicken-csc and chicken-csi 2018-12-12. #+END_EXAMPLE You may need to modify the =csi= command accordingly. If the name of the REPL binary on your system is =chicken-csi=, you will also need to add #+BEGIN_SRC emacs-lisp (setq geiser-chicken-binary "chicken-csi") #+END_SRC to your =dotspacemacs/user-config= in order for the REPL to start in spacemacs. * Structuraly 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 =scheme= 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-scheme-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 ** Compiling | Key binding | Description | |-------------+----------------------------| | ~SPC m c c~ | Compile current buffer | | ~SPC m c p~ | Add directory to load path | ** Navigation | Key binding | Description | |-------------+---------------------| | ~SPC m g g~ | Goto Definition | | ~SPC m g b~ | Go Back | | ~SPC m g m~ | Goto Module | | ~SPC m g n~ | Goto next error | | ~SPC m g N~ | Goto previous error | ** Documentation | Key binding | Description | |-------------+------------------------------------------| | ~SPC m h h~ | Docs for symbol at point | | ~SPC m h d~ | Look up manual entry for symbol at point | | ~SPC m h m~ | Display exports for module | | ~SPC m h <~ | Display callers | | ~SPC m h >~ | Display callees | ** Insertion | Key binding | Description | |-------------+---------------| | ~SPC m i l~ | Insert Lambda | ** Macroexpansion | Key binding | Description | |-------------+------------------------------| | ~SPC m m e~ | Macroexpand last sexp | | ~SPC m m f~ | Macroexpand surrounding sexp | | ~SPC m m r~ | Macroexpand region | ** REPL | Key binding | Description | |-------------+------------------------------------------| | ~SPC m s i~ | Start or switch to the REPL | | ~SPC m s s~ | Select Scheme implementation | | ~SPC m s b~ | Send buffer to the REPL | | ~SPC m s B~ | Send buffer to the REPL and focus it | | ~SPC m s f~ | Send definition to the REPL | | ~SPC m s F~ | Send definition to the REPL and focus it | | ~SPC m s e~ | Send last sexp to the REPL | | ~SPC m s r~ | Send region to the REPL | | ~SPC m s R~ | Send region to the REPL and focus it | ** Evaluation | Key binding | Description | |-------------+---------------------------| | ~SPC m e b~ | Evaluate the whole buffer | | ~SPC m e e~ | Evaluate last sexp | | ~SPC m e f~ | Evaluate current function | | ~SPC m e l~ | Evaluate line | | ~SPC m e r~ | Evaluate region |