dotfiles/config/stumpwm/config.lisp
2026-08-07 00:59:48 -04:00

154 lines
5.3 KiB
Common Lisp

(in-package :stumpwm)
;; change the prefix key to something else
(set-prefix-key (kbd "C-t"))
;; prompt the user for an interactive command. The first arg is an
;; optional initial contents.
(defcommand colon1 (&optional (initial "")) (:rest)
(let ((cmd (read-one-line (current-screen) ": " :initial-input initial)))
(when cmd
(eval-command cmd t))))
;; Read some doc
(define-key *root-map* (kbd "d") "exec gv")
;; Browse somewhere
(define-key *root-map* (kbd "b") "colon1 exec firefox http://www.")
;; Ssh somewhere
(define-key *root-map* (kbd "C-s") "colon1 exec xterm -e ssh ")
;; Lock screen
(define-key *root-map* (kbd "C-l") "exec xlock")
;; Web jump (works for DuckDuckGo and Imdb)
(defmacro make-web-jump (name prefix)
`(defcommand ,(intern name) (search) ((:rest ,(concatenate 'string name " search: ")))
(nsubstitute #\+ #\Space search)
(run-shell-command (concatenate 'string ,prefix search))))
(make-web-jump "duckduckgo" "firefox https://duckduckgo.com/?q=")
(make-web-jump "imdb" "firefox http://www.imdb.com/find?q=")
;; C-t M-s is a terrble binding, but you get the idea.
(define-key *root-map* (kbd "M-s") "duckduckgo")
(define-key *root-map* (kbd "i") "imdb")
;; Message/help window styling
(set-fg-color "#d8dee9")
(set-bg-color "#1b2b34")
(set-border-color "#6699cc")
(setf *normal-border-width* 2)
(setf *window-border-style* :thin)
(setf *ignore-wm-inc-hints* t)
(set-module-dir "~/.stumpwm.d/modules/util")
(load-module "swm-gaps")
(setf swm-gaps:*inner-gaps-size* 8)
(setf swm-gaps:*outer-gaps-size* 16)
(defcommand gaps-off () ()
(swm-gaps:toggle-gaps-off))
(defcommand gaps-small () ()
(setf swm-gaps:*inner-gaps-size* 8
swm-gaps:*outer-gaps-size* 8)
(swm-gaps:toggle-gaps-on))
(defcommand gaps-medium () ()
(setf swm-gaps:*inner-gaps-size* 16
swm-gaps:*outer-gaps-size* 16)
(swm-gaps:toggle-gaps-on))
(defcommand gaps-large () ()
(setf swm-gaps:*inner-gaps-size* 32
swm-gaps:*outer-gaps-size* 32)
(swm-gaps:toggle-gaps-on))
(defvar *gaps-map* (make-sparse-keymap))
(define-key *gaps-map* (kbd "0") "gaps-off")
(define-key *gaps-map* (kbd "1") "gaps-small")
(define-key *gaps-map* (kbd "2") "gaps-medium")
(define-key *gaps-map* (kbd "3") "gaps-large")
(set-font "-b&h-luxi mono-medium-r-normal--20-*-*-*-m-0-iso10646-1")
(setf *message-window-padding* 16)
(setf *message-window-gravity* :center)
(setf *input-window-gravity* :center)
;;; Define window placement policy...
;; Clear rules
(clear-window-placement-rules)
;; Last rule to match takes precedence!
;; TIP: if the argument to :title or :role begins with an ellipsis, a substring
;; match is performed.
;; TIP: if the :create flag is set then a missing group will be created and
;; restored from *data-dir*/create file.
;; TIP: if the :restore flag is set then group dump is restored even for an
;; existing group using *data-dir*/restore file.
(define-frame-preference "Default"
;; frame raise lock (lock AND raise == jumpto)
(0 t nil :class "Konqueror" :role "...konqueror-mainwindow")
(1 t nil :class "XTerm"))
(define-frame-preference "Ardour"
(0 t t :instance "ardour_editor" :type :normal)
(0 t t :title "Ardour - Session Control")
(0 nil nil :class "XTerm")
(1 t nil :type :normal)
(1 t t :instance "ardour_mixer")
(2 t t :instance "jvmetro")
(1 t t :instance "qjackctl")
(3 t t :instance "qjackctl" :role "qjackctlMainForm"))
(define-frame-preference "Shareland"
(0 t nil :class "XTerm")
(1 nil t :class "aMule"))
(define-frame-preference "Emacs"
(1 t t :restore "emacs-editing-dump" :title "...xdvi")
(0 t t :create "emacs-dump" :class "Emacs"))
(defcommand kill-window-or-frame () ()
(if (current-window)
(delete-window)
(remove-split)))
;; Don't send a random window to a new split
(setf *new-frame-action* :empty)
(setf *suppress-frame-indicator* t)
(defcommand rofi-pull-window () ()
(let* ((windows (remove (current-window) (group-windows (current-group))))
(names (format nil "~{~a~%~}" (mapcar #'window-name windows)))
(selection (run-prog-collect-output
"/bin/sh" "-c"
(format nil "echo '~a' | rofi -dmenu -p 'window'" names))))
(when (and selection (not (string= selection "")))
(let ((win (find (string-trim '(#\Newline) selection)
windows :key #'window-name :test #'string=)))
(when win (pull-window win))))))
(defvar *window-map* (make-sparse-keymap))
(define-key *top-map* (kbd "s-W") *window-map*)
(define-key *window-map* (kbd "r") "iresize")
(define-key *window-map* (kbd "g") *gaps-map*)
(defvar *media-map* (make-sparse-keymap))
(define-key *top-map* (kbd "s-m") *media-map*)
(define-key *media-map* (kbd "v")
"exec mpv-pick.sh")
(define-key *top-map* (kbd "s-d") "exec rofi -show run")
(define-key *top-map* (kbd "s-h") "move-focus left")
(define-key *top-map* (kbd "s-j") "move-focus down")
(define-key *top-map* (kbd "s-k") "move-focus up")
(define-key *top-map* (kbd "s-l") "move-focus right")
(define-key *top-map* (kbd "s-w") "rofi-pull-window")
(define-key *top-map* (kbd "s-p") "next-in-frame")
(define-key *top-map* (kbd "s-n") "prev-in-frame")
(define-key *top-map* (kbd "s-q") "kill-window-or-frame")
(define-key *top-map* (kbd "s--") "vsplit")
(define-key *top-map* (kbd "s-\|") "hsplit")