Title : My Stumpwm config on OpenBSD
Author: Solène
Date  : 06 June 2016
Tags  : window-manager lisp

I want to talk about _stumpwm_, a window manager written in Common
LISP. I think one must at least like emacs to like stumpwm. Stumpwm is
a tiling window manager one which you create "panes" on the screen
like windows on Emacs. A single pane takes 100% of the screen, then
you can split it into 2 panes vertically or horizontally and resize
it, and you can split again and again. **There is no "automatic"
tiling**. By default, if you have ONE pane, you will only have ONE
window displayed, this is a bit different that others tiling wm I had
tried. Also, virtual desktops are named groups, nothing special here,
you can create/delete groups and rename it. Finally, stumpwm **is not
minimalistic**.

To install it, you need to get the sources of stumpwm, install a
common lisp interpreter (sbcl, clisp, ecl etc...), install quicklisp
(which is not in packages), install the quicklisp packages cl-ppcre
and clx and then you can compile stumpwm, that will produce a huge
binary which embedded a common lisp interpreter (that's a way to share
common lisp executables, the interpreter can create an executable from
itself and include the files you want to execute). I would like to
make a package for OpenBSD but packaging quicklisp and its packages
seems too difficult for me at the moment.

Here is my config file in ~/.stumpwmrc.

**Updated: 23th january 2018**

    (defun chomp(text) (subseq text 0 (- (length text) 1)))
    (defmacro cmd(command) `(progn `(:eval (chomp (stumpwm:run-shell-command ,,command t)))))
    
    (defun get-latence()
      (let ((now (get-universal-time)))
        (when (> (- now *latence-last-update* ) 30)
          (setf *latence-last-update* now)
          (when (probe-file "/tmp/latenceresult")
            (with-open-file (x "/tmp/latenceresult"
                               :direction :input)
              (setf *latence* (read-line x))))))
      *latence*)
    
    (defvar *latence-last-update* (get-universal-time))
    (defvar *latence* "nil")
    
    
    (set-module-dir "~/dev/stumpwm-contrib/")
    (stumpwm:run-shell-command "setxkbmap fr")
    (stumpwm:run-shell-command "feh --bg-fill red_damask-wallpaper-1920x1080.jpg")
    
    (defvar color1 "#886666")
    (defvar color2 "#222222")
    
    (setf
     stumpwm:*mode-line-background-color* color2 
     stumpwm:*mode-line-foreground-color* color1
     stumpwm:*mode-line-border-color* "#555555"
     stumpwm:*screen-mode-line-format* (list "%g | %v ^>^7 %B | " '(:eval (get-latence)) "ms %d    ")
     stumpwm:*mode-line-border-width* 1
     stumpwm:*mode-line-pad-x* 6
     stumpwm:*mode-line-pad-y* 1
     stumpwm:*mode-line-timeout* 5
     stumpwm:*mouse-focus-policy* :click
     ;;stumpwm:*group-format* "%n·%t
     stumpwm:*group-format* "%n"
     stumpwm:*time-modeline-string* "%H:%M"
     stumpwm:*window-format* "^b^(:fg \"#7799AA\")<%25t>"
     stumpwm:*window-border-style* :tight
     stumpwm:*normal-border-width* 1
     )
    
    
    (stumpwm:set-focus-color "#7799CC")
    (stumpwm:grename "Alpha")
    (stumpwm:gnewbg "Beta")
    (stumpwm:gnewbg "Tau")
    (stumpwm:gnewbg "Pi")
    (stumpwm:gnewbg "Zeta")
    (stumpwm:gnewbg "Teta")
    (stumpwm:gnewbg "Phi")
    (stumpwm:gnewbg "Rho")
    
    (stumpwm:toggle-mode-line (stumpwm:current-screen) (stumpwm:current-head))
    
    (set-prefix-key (kbd "M-a"))
    
    (define-key *root-map* (kbd "c")            "exec urxvtc")
    (define-key *root-map* (kbd "RET")          "move-window down")
    (define-key *root-map* (kbd "z")            "fullscreen")
    
    (define-key *top-map* (kbd "M-&")           "gselect 1")
    (define-key *top-map* (kbd "M-eacute")      "gselect 2")
    (define-key *top-map* (kbd "M-\"")          "gselect 3")
    (define-key *top-map* (kbd "M-quoteright")  "gselect 4")
    (define-key *top-map* (kbd "M-(")           "gselect 5")
    (define-key *top-map* (kbd "M--")           "gselect 6")
    (define-key *top-map* (kbd "M-egrave")      "gselect 7")
    (define-key *top-map* (kbd "M-underscore")  "gselect 8")
    					    
    (define-key *top-map* (kbd "s-l")           "exec slock")
    (define-key *top-map* (kbd "s-t")           "exec urxvtc")
    (define-key *top-map* (kbd "M-S-RET")       "exec urxvtc")
    (define-key *top-map* (kbd "M-C")           "exec urxvtc")
    
    (define-key *top-map* (kbd "s-s")           "exec /home/solene/dev/screen_up.sh")
    
    (define-key *top-map* (kbd "s-Left")        "gprev")
    (define-key *top-map* (kbd "s-Right")       "gnext")
    
    (define-key *top-map* (kbd "M-ISO_Left_Tab")"other")
    (define-key *top-map* (kbd "M-TAB")         "fnext")
    (define-key *top-map* (kbd "M-twosuperior") "next-in-frame")
    
    (load-module "battery-portable")
    (load-module "stumptray")


I use a function to get latency from a script that is started every 20
seconds to display the network latency or nil if I don't have internet
access.

I use rxvt-unicode daemon (urxvtd) as a terminal emulator, so the
terminal command is urxvtc (for client), it's lighter and faster to
load.

I also use a weird "alt+tab" combination:

- Alt+tab switch between panes 
- Alt+² (the key above tab) circles windows in the current pane 
- Alt+Shift+Tab switch to the previous windows selected 

[StumpWM website](https://stumpwm.github.io/)