This is my StumpWM personal config. Do what you want with it. Summary of its contents follows.
This allows me to write system specific hooks to customize StumpWM inside of local.lisp
.
(in-package :hfj)
(after-load-conf ("clean.lisp")
(message "clean.lisp has been processed!"))
Removes the various hooks I use so I don’t have left-over hooks that are called after I’ve done a “loadrc”.
Add an after-load-conf
hook to override these.
List of group names to be created.
List of preferences to pass to define-frame-preference.
Simple logging to a specific file.
(my-debug "Window:" window "Frame:" frame)
Menu on super-o
. Has wrappers for defcommand
to add commands to the menu when they are defined.
For example, I can add a “Browser” under “Apps” in the default menu.
(defapp run-firefox () () ("Browser")
"Run Firefox"
(run-or-raise "firefox-bin" '(:class "Firefox")))
I can add a program that disables the touchpad under “Utility” in the default menu.
(defutil toggle-touchpad () () ("Toggle touchpad")
"Enable/Disable touchpad"
(run-shell-command "toggle-touchpad"))
Or to any menu I’ve defined with any level of sub-menus.
(def-menu-command pick-me-command () () (*default-menu* "Top" "Middle" "Pick Me!")
"Example!"
(message "Picked!"))
Even comes with a StumpWM menu for reloading, restarting, and starting/stopping swank.
Commands to start and stop swank.
Macro to start a process and capture its window and modify it.
Sample from scratchpad.lisp:
(hfj:with-new-window (window cmd)
:new
(push (cons name window) *scratch-floats*)
:focus
(stumpwm::float-window window (current-group))
(cond (initial-gravity
(resize-by-gravity window initial-gravity ratio))))
Example to float an xterm:
(with-new-window (window "xterm")
(stumpwm::float-window window (current-group))
(stumpwm::float-window-move-resize window
:x 50 :y 70
:width 540 :height 400))
Create a “scratchpad” that can be toggled with a single keypress. Two variants exist, to present the window tiled or floating. I haven’t finished tweaking these yet, so don’t expect them to work perfectly yet.
Show a window in a frame above, below, left or right of the current frame. Splits with *default-split-ratio*
by default. Uses gravity to determine the split. Corner gravity will pick the shorter of the two sides to place the split.
Example:
(defcommand scratchpad-test () ()
(scratchpad::toggle-split-scratchpad "my-xterm" "xterm"
:gravity :top-right
:ratio 1/3))
Floats a window on the current screen based on gravity. Splits with *default-float-ratio*
by default. Also has a command scratchpad-float
.
Examples:
(defcommand scratchpad-test () ()
(scratchpad::toggle-split-scratchpad "my-xterm" "xterm"
:gravity :center
:ratio 1/3))
(define-key *top-map* (kbd "s-TAB") "scratchpad-float yakyak-scratch yakyak left")
Various applications. Uses defapp
and defutil
to place commands directly into the menu.
Also has functions to start named instances of tmux and emacs. This way I can type s-a e e
and get an instance of emacs named “e” and I can raise it quickly with the same keypresses. Or s-a e r
for one named “r”. Makes it easy to switch back to or between instances of emacs.
Set up groups and preferences defined in defaults.lisp.
A menu on s-q
for logging out and shutting down. I should probably move this over to the main menu.
Bindings. Uses some convenience functions to simplify maintenance.
(alist-define-keys *top-map*
'(("s-h" . "move-focus left")
("s-j" . "move-focus down")
("s-k" . "move-focus up")
("s-l" . "move-focus right")))
;; Create and initialize a set of bindings off "s-f".
(alist-define-keys (create-map *frame-map* "s-f")
'(("f" . "frame-windowlist")
("s-f" . "fother")
("n" . "next-in-frame")
("p" . "prev-in-frame")
("e" . "fclear")
("m" . "only")
("=" . "balance-frames")))
;; Or one off "s-w m"
(alist-define-keys (create-map *window-move-map* "m" :on *window-map*)
'(("h" . "move-window left") ;; That is, "s-w m h"
("j" . "move-window down")
("k" . "move-window up")
("l" . "move-window right")))
Set focus to follow the mouse, and the mouse to follow focus.
For styles which I haven’t really gotten around to messing with yet.
Basic mode line config.