(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")