Title: My Stumpwm config on OpenBSD
       Author: Solène
       Date: 06 June 2016
       Tags: window-manager lisp
       Description: 
       
       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)))))
       
             (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* "nil")
       
           (stumpwm:run-shell-command "setxkbmap fr")
           (stumpwm:run-shell-command "feh --bg-fill
       red_damask-wallpaper-1920x1080.jpg")
       
           (defvar color2 "#222222")
       
            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:grename "Alpha")
           (stumpwm:gnewbg "Beta")
           (stumpwm:gnewbg "Tau")
           (stumpwm:gnewbg "Pi")
           (stumpwm:gnewbg "Zeta")
           (stumpwm:gnewbg "Teta")
           (stumpwm:gnewbg "Phi")
           (stumpwm:gnewbg "Rho")
       
       (stumpwm:current-head))
       
       
           (define-key *root-map* (kbd "RET")          "move-window down")
           (define-key *root-map* (kbd "z")            "fullscreen")
       
           (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-t")           "exec urxvtc")
           (define-key *top-map* (kbd "M-S-RET")       "exec urxvtc")
           (define-key *top-map* (kbd "M-C")           "exec urxvtc")
       
       /home/solene/dev/screen_up.sh")
       
           (define-key *top-map* (kbd "s-Right")       "gnext")
       
           (define-key *top-map* (kbd "M-TAB")         "fnext")
           (define-key *top-map* (kbd "M-twosuperior") "next-in-frame")
       
           (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/)