Installing StumpWM on FreeBSD
Installing StumpWM on FreeBSD
There is an excellent guide describing in details how to install StumpWM and start playing with it interactively through emacs and SLIME. There are, however, a few things that have changed since this guide has been written, or just some traps I fell into that I thought I should describe as well.
How to install StumpWM
The official documentation recommends checking out the code from the repository, installing the dependencies with Quicklisp and configure-make-make-installing the source code. I used to do just that for years and it works very well. However, before I read the guide, I did not realise there was another option: installing StumpWM itself through Quicklisp. That way, you obtain a proper release (not just whatever current code happens to be in GitHub), a clean installation in your Quicklisp repository and an easy way to hook up an interactive session to it.
Install SBCL
The first step is indeed to install a Lisp compiler. David Bjergaard, StumpWM's current maintainer and main developer has recently announced that only SBCL will be supported in the future, which has the merit of cutting short the question of which implementation to choose. There is a catch however: there used to be some problems with threading support for SBCL on FreeBSD. Everything is fine now, and one can now build SBCL and get a multithreaded environment. Note that I said build: for some reason, the pre-built packages don't have threading support activated. The only option left to us is then to install the port:
# cd /usr/ports/lang/sbcl # make sure you select Threading in the options # make config # make install
As of writing, the above gets you SBCL version 1.3.13. Note that as a
test, I also downloaded the latest vanilla source code from the
official site (version 1.3.14), built and installed the thing in a
hierarchy in my home directory. This builds fine, including
multithreading, but I noted a difference where the Quicklisp
dependencies are stored: my sbcl 1.3.13 from ports put them in
~/quicklisp
, whereas the vanilla 1.3.14 put them in ~/.quicklisp
. I
haven't checked whether this is a change in the defaults, or just some
configuration option that differs between the ports and the official
release. Keep this in mind when you set up emacs to load the
slime-helper, for example. For the remainder of this guide, I consider
that sbcl was installed from the ports and that quicklisp dependencies
are written to ~/quicklisp
.
Install Quicklisp
Quicklisp can be installed exactly as described by Kaashif Hymabaccus:
$ curl -O https://beta.quicklisp.org/quicklisp.lisp $ sbcl --load /path/to/quicklisp.lisp
And then in the REPL:
* (quicklisp-quickstart:install) * (ql:add-to-init-file)
Install StumpWM
There are two options here: either clone the official GitHub repository and follow the instructions given in the manual, or just trust Quicklisp to do the right thing and install everything. I find the latter easier to manage in the long run: Quicklisp installs all the dependencies, and is able to update the project automatically and cleanly. No surprises with dependencies or anything.
* (ql:quickload "stumpwm")
This will install StumpWM along with its dependencies (that is, clx
,
cl-ppcre
and alexandria
) and will proceed recursively down the
dependency chain to install everyting needed to run StumpWM.
Get emacs hook up to StumpWM sessions
A major aspect of Lisp development is the ability to connect to a session and interact with it, modifying code straight on the live system. In the case of StumpWM, this means the ability to configure the whole system, adding or removing features and behaviours, changing the keybindings and controlling the whole Window manager from within emacs. All without restarting StumpWM, just like you never have to restart emacs when you modify it.
The setup requires on the server side sbcl to create a swank server and on the client side emacs to communicate with the Lisp session through SLIME. Installing everything is made very simple by Quicklisp.
In an sbcl REPL:
* (ql:quickload "swank") * (ql:quickload "quicklisp-slime-helper")
You can then instruct StumpWM to create the server. Following the good
advice in the blog post, have it listen to port 4004
instead of the
standard 4005
, so you won't connect to this session by accident. In
your ~/.stumpwmrc
, write the following:
(in-package :stumpwm) (require :swank) (swank-loader:init) (swank:create-server :port 4004 :style swank:*communication-style* :dont-close t)
Now, in you emacs config, write the following:
(load (expand-file-name "~/quicklisp/slime-helper.el"))
Configure your X session
Starting X in our case means starting sbcl and asking it to load
stumpwm. Create the file startstumpwm
with the following content:
(require :stumpwm) (stumpwm:stumpwm)
I must confess here that since I've been using Unix, I've never used
anything like a Desktop Environment, which means that I don't know how
to tell KDE or Gnome to use StumpWM for windows management. If, like
me, you still rely on startx
and friends, write the following in your
~/.xinitrc
:
exec sbcl --load ~/bin/startstumpwm --eval '(quit)'
Note that we explictly ask sbcl to quit by passing
--eval '(quit)'
Otherwise, after you quit StumpWM, sbcl would leave the REPL open, and your X session would keep running forever. Again, it's very possible this last bit isn't necessary if you start your X session through other means.