Skip to content
my common lisp window manager
Pull request Compare This branch is 68 commits behind mgi:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


Here is a set of goals for this window manager:

  • Common Lisp;
  • Just the features I want;
  • Simple and easy to maintain code;
  • No more than 500 SLOC;
  • No configuration outside the main program. Don’t do anything fancy (text, icon, cursor or color) to avoid the temptation;
  • No EWMH as implementing this shit would bloat the code for little (if any) improvements.



  • Install SBCL or CLISP on your system (should be available via your system’s packages);
  • Install quicklisp;
  • Tweak line 4 of wm.lisp to point to your quicklisp directory.

with SBCL

Append sbcl --script [your path to]/wm.lisp to your .xinitrc or .xsession.

with CLISP

Append xhost local:local and clisp [your path to]/wm.lisp to your .xinitrc or .xsession.


Control-t is the prefix key. Every shortcut starts with it.

  • n or C-n is next managed window;
  • p or C-p is previous managed window;
  • C-t is last used window;
  • t sends a C-t to current window;
  • c runs a xterm;
  • e runs or raise an emacs;
  • w runs or raise a web browser (configurable in wm.lisp);
  • C-l locks the screen with xlock;
  • a is the app launcher: keys hit after will look for the correct app;
  • =’= is the class finder: works like the app launcher but fetch the first window of the given class;
  • f toggles the current window to fullscreen (and revert size/position when changing focus);
  • . centers the current window;
  • m toggles mosaic mode of windows.


Meta (or Alt) is the prefix for the mouse.

  • left button moves the window;
  • right button resize the window;
  • C-middle button close the window.


With SBCL, one of the first thing that wm.lisp does is to create a swank server on port 4005. You can then connect Emacs/SLIME to it (M-x slime-connect) and hack the window manager live.

Something went wrong with that request. Please try again.