2026-08-06 15:50:20 -04:00
|
|
|
(in-package :stumpwm)
|
|
|
|
|
|
|
|
|
|
;; change the prefix key to something else
|
2026-08-07 00:59:48 -04:00
|
|
|
(set-prefix-key (kbd "C-t"))
|
2026-08-06 15:50:20 -04:00
|
|
|
|
|
|
|
|
;; 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))))
|
|
|
|
|
|
2026-08-07 00:59:48 -04:00
|
|
|
|
2026-08-06 15:50:20 -04:00
|
|
|
;; 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")
|
|
|
|
|
|
2026-08-07 00:59:48 -04:00
|
|
|
;; 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)
|
|
|
|
|
|
|
|
|
|
|
2026-08-06 15:50:20 -04:00
|
|
|
|
|
|
|
|
;;; 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"))
|
2026-08-07 00:59:48 -04:00
|
|
|
|
|
|
|
|
(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")
|
|
|
|
|
|