Set Up Neovim For Lisp Development on Arch Linux



Published June 26, 2021

I am currently learning lisp, and setting up neovim on Arch Linux to do so. These are my notes to get a development environment up and running, heavily indebted to jdhao’s post.

Installing sbcl

sbcl is a lisp interpreter that allows you to do actual REPL. Easily installed through pacman:

sudo pacman -S sbcl

Done.

Install quicklisp

Quicklisp is the lisp package manager, allowing you to easily install external libraries. It is available in AUR, but I found the easier way to install and use it to be the official way:

curl -O https://beta.quicklisp.org/quicklisp.lisp
sbcl --load quicklisp.lisp

Fire up sbcl and run:

(quicklisp-quickstart:install)

followed by

(ql:add-to-init-file)

This will add quicklisp to your .sbclrc file:

;;; The following lines added by ql:add-to-init-file:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

Fixing Arrow Keys and Tab Completion

Run this inside sbcl:

(ql:quickload "linedit")

and add this to .sbclrc:

;;; Check for --no-linedit command-line option.
(if (member "--no-linedit" sb-ext:*posix-argv* :test 'equal)
    (setf sb-ext:*posix-argv*
      (remove "--no-linedit" sb-ext:*posix-argv* :test 'equal))
    (when (interactive-stream-p *terminal-io*)
      (require :sb-aclrepl)
      (require :linedit)
      (funcall (intern "INSTALL-REPL" :linedit) :wrap-current t)))

Install Vlime With Packer

use {
    'vlime/vlime',
    config = function()
        rtp = 'vim/'
    end
}

Create REPL Server

For convenience I created this alias in .zshrc:

alias vlime='sbcl --load ~/.local/share/nvim/site/pack/packer/start/vlime/lisp/start-vlime.lisp'

This allows you to type vlime into a terminal and give you a server.

Connect to the REPL Server

Open a .lisp file, and type <localleader>cc to establish a connection between nvim and sbcl. <localleader> is mapped to \ by default. To send a line to sbcl for evaluation, type <localleader>ss, or toggle interactive mode by typing <localleader>i. This lets you evaluate any block of code by hitting <cr>.

Fix Autocompletion

vlime ships with its own completion engine, which seems to conflict with my preferred autocompletion plugin, nvim-compe. For now I have decided to simply disable nvim-compe for lisp files by creating ~/.config/nvim/after/ftplugin/lisp.vim and adding

lua <<EOF
require'compe'.setup { enabled = false }
EOF

Additionally, ervandew/supertab, a fantastic plugin in many ways, is stomping on the vlime autocompletion, and there is no way to disable supertab per buffer. I must admit, there’s been more than once where I’ve thinking that it’s time to let supertab go, and I think this might have finally pushed me over the edge.

That’s it for now, I will keep updating this post if and when I learn more tricks to leverage the power of lisp, nvim and sbcl…

Happy parenthesizing!