:Author: Luis Osa
:Date: Fri Dec 4 18:24:35 2020
:tags: scheme, emacs
=====================================================================
Setting up a development environment for Gerbil Scheme and Doom Emacs
=====================================================================
There is an `installation guide `_ and a `page `_ about development with Emacs in the
Gerbil Scheme website, but I felt it was centered on plain Emacs and not on
variants like Doom Emacs -- which is fine, of course, I just happen to prefer Doom
because it has a focus on Vim keybindings and I am much more used to them than
to plain Emacs chords.
Install Gerbil
--------------
This one is easy: use the Hombrew formula. It also pulls in the underlying
Gambit Scheme dependency.
.. code:: console
$ brew install gerbil-scheme
Install ``gerbil-mode`` and ``gambit-mode``
-------------------------------------------
Both Gerbil and Gambit offer Emacs support as single Elisp files that live
inside their respective project directory tree. They intend these files to be
copied or symlinked into ``~/.emacs.d`` and required in ``.emacs``.
I found it easier to install them as “Github recipes” with Doom’s ``package!``
macro.
Within ``.doom.d/packages.el``, add:
.. code:: elisp
(package! gerbil-mode
:recipe (:host github :repo "vyzo/gerbil"
:files ("etc/gerbil-mode.el")))
(package! gambit-mode
:recipe (:host github :repo "gambit/gambit"
:files ("misc/gambit.el")))
Configure the new modes
-----------------------
There is a full example of a ``use-package`` configuration in the page linked
above from Gerbil’s documentation. I have adapted it to configure separately
both modes, only taking the minimal required setups.
Within ``.doom.d/config.el``, add:
.. code:: elisp
(use-package gambit-mode
:defer t
:config
(add-hook 'inferior-scheme-mode-hook 'gambit-inferior-mode))
(use-package gerbil-mode
:defer t
:config
(defvar gerbil-program-name
;; depending on your env setup, this can probably be just "gxi"
(expand-file-name "/usr/local/bin/gxi"))
(setq scheme-program-name gerbil-program-name))
Redefine key bindings
---------------------
Most of the useful key bindings that Gerbil-mode and Gambit-mode expose are
behind a “C-c” prefix. In Doom, hitting that key chord with a Schme file open
(file extension “.scm” or “.ss”) will show all available key bindings on a
``which-key`` minibuffer. I have redfined some of them to be also available under
the local leader key, which is defined elsewhere in my config to ``,``.
Within ``.doom.d/config.el``, add:
.. code:: elisp
(after! gerbil-mode
(map! :map gerbil-mode-map
:localleader :desc "Run Scheme REPL"
"'" (cmd! (pop-to-buffer "*scheme*")
(run-scheme scheme-program-name))
:desc "Send region"
"," #'scheme-send-region
:desc "Send definition"
"e" #'scheme-send-definition
:desc "Send definition and go"
"E" #'scheme-send-definition-and-go
:desc "Load a file"
"l" #'scheme-load-file))