This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
spacemacs/layers/+lang/scheme
Daniel Nicolai 41f8430c1f
Evilify geiser-doc-mode-map and add keybindings in scheme layer (#14758)
In the scheme REPL, RET is bound to `geiser-repl--maybe-send` which most times
sends the input instead of inserting a newline. Therefore this separate
keybinding for that will always insert the newline is required.

Also the geiser-doc-mode is a read-only mode which should get evilified to
unshadow the convenient evil-like default Emacs keybindings.
2021-05-26 19:49:06 +00:00
..
config.el Fix scheme layer support for scheme implementations 2021-04-15 21:54:36 +02:00
packages.el Evilify geiser-doc-mode-map and add keybindings in scheme layer (#14758) 2021-05-26 19:49:06 +00:00
README.org Evilify geiser-doc-mode-map and add keybindings in scheme layer (#14758) 2021-05-26 19:49:06 +00:00

Scheme layer

Description

This layer adds support for Scheme via Geiser. Note that combined usage of racket-mode and geiser has not been tested.

Features:

  • Support the Scheme compiler Chicken
  • Support for the extension language platform Guile
  • Structurally safe editing using optional 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.

Additionally, before geiser can be used with a scheme implementation, support for the implementation must be enabled by adding its name to the list of scheme-implementations. It is recommended to set the value of the list directly in the dotspacemacs-configuration-layers list as shown in the following example for guile and racket:

  dotspacemacs-configuration-layers
  '((scheme :variables
             scheme-implementations '(guile racket)))

Currently support is available for the following scheme implementations: chez, chibi, chicken, gambit, gauche, guile, kawa, mit and racket.

Finally, to use a scheme implementation its binary must be available in your PATH (or you can manually set the location of the binary as explained in this section of the geiser documentation).

The following subsection shows how to install Chicken scheme and activate geiser support.

Install Chicken scheme example

First add chicken to the list of scheme-implementations as explained above.

For full Chicken support, the following commands should be run:

  $ 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

Note: Chicken 5 does not have chicken-home imported by default, so the command for changing to that directory can be accomplished with this:

  $ cd `csi -b -e "(import (chicken platform))" -p "(chicken-home)"`

Note: Chicken 5 also requires SRFI-18

  $ chicken-install -s srfi-18

Additionally, as of 2018-12-12 there is a naming conflict in some of the Linux package repos:

  # 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.

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

  (setq geiser-chicken-binary "chicken-csi")

to your dotspacemacs/user-config in order for the REPL to start in spacemacs.

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 scheme buffers call the following function in your dotspacemacs/user-config function:

  (spacemacs/toggle-evil-safe-lisp-structural-editing-on-register-hook-scheme-mode)

or to enable it for all supported modes:

  (spacemacs/toggle-evil-safe-lisp-structural-editing-on-register-hooks)

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 d 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 interaction

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

REPL-mode

Insert state

Key binding Description
S-RET Insert newline
C-l Clear buffer
C-d Exit

Normal state

Key binding Description
g j / ]] Goto next prompt
g k / [[ Goto previous prompt
SPC m h h Show documentation for symbol at point
SPC m C Clear buffer
SPC m i l Insert lambda
SPC m i m Import module
SPC m u Unload function
SPC m s Toggle surrounding parenthesis <-> brackets
SPC m k REPL interrupt
SPC m q REPL exit

Geiser-doc-mode

Key binding Description
o Follow link
]]/[[ Next/previous-section
g p / < Previous page
g n / > Next page
g d Goto definition
g z Switch to repl
TAB / C-j Next button
S-TAB~ / C-k Previous button