diff options
-rw-r--r-- | stumpwm.org | 356 |
1 files changed, 356 insertions, 0 deletions
diff --git a/stumpwm.org b/stumpwm.org new file mode 100644 index 0000000..7621899 --- /dev/null +++ b/stumpwm.org @@ -0,0 +1,356 @@ +#+TITLE: StumpWM Configuration +#+AUTHOR: Thanos Apollo +#+PROPERTY: header-args :tangle ~/.stumpwm.d/init.lisp :mkdirp yes +#+auto_tangle: t +#+STARTUP: overview +* Load Modules +#+begin_src lisp + (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" + (user-homedir-pathname)))) + (when (probe-file quicklisp-init) + (load quicklisp-init))) + + + (in-package :stumpwm) + (setf *default-package* :stumpwm) + (set-module-dir "~/.stumpwm.d/modules") + + (load-module "beckon") + (load-module "end-session") + (load-module "globalwindows") + (load-module "mpd") + (load-module "stump-backlight") + (load-module "urgentwindows") + (mpd:mpd-connect) +#+end_src +* Setup slynk +#+begin_src lisp + (ql:quickload :slynk) + (stumpwm:defcommand sly-start-server () () + "Start a slynk server for sly." + (ql:quickload :slynk) + (slynk:create-server :dont-close t)) + + (stumpwm:defcommand sly-stop-server () () + "Stop current slynk server for sly." + (sb-thread:make-thread (lambda () (slynk:stop-server 4005)))) +#+end_src +* Autostart +#+begin_src lisp + (when *initializing* + (run-shell-command + "emacs --daemon & + feh --bg-scale ~/wallpapers/robo-girl.jpg & + picom & + setxkbmap us -option ctrl:swapcaps")) + + (setf *startup-message* "Welcome back, Thanos") +#+end_src +* Functions +#+begin_src lisp + ;; Web jump (works for DuckDuckGo) + (defmacro make-web-jump (name prefix) + `(defcommand ,(intern name) (search) ((:rest ,(concatenate 'string name " Ask the duck: "))) + (nsubstitute #\+ #\Space search) + (run-shell-command (concatenate 'string ,prefix search)))) + + (make-web-jump "duckduckgo" "mullvad-browser https://duckduckgo.com/?q=") + + (defcommand mullvad-browser () () + "Run or raise Firefox." + (sb-thread:make-thread (lambda () (run-or-raise "mullvad-browser" '(:class "mullvad-browser") t nil)))) + + (defcommand delete-window-and-frame () () + "Delete the current frame with its window." + (delete-window) + (remove-split)) + + (defcommand hsplit-and-focus () () + "Create a new frame on the right and focus it." + (hsplit) + (move-focus :right)) + + (defcommand vsplit-and-focus () () + "Create a new frame below and move focus to it." + (vsplit) + (move-focus :down)) + + (defcommand term (&optional program) () + "Invoke a terminal, possibly with a @arg{program}." + (sb-thread:make-thread + (lambda () + (run-shell-command (if program + (format nil "kitty ~A" program) + "kitty"))))) + + (defvar *my/desktop-dump-file* "~/.cache/stump-at-work" + "Where my desktop dump should go and be loaded from.") + + (defcommand dump-work () () + "Save desktop layout when at work." + (dump-desktop-to-file *my/desktop-dump-file*)) + + (defcommand at-work () () + "Restore desktop layout when at work." + (restore-from-file *my/desktop-dump-file*) + (run-shell-command "gpclient") + (run-shell-command "bluetoothctl power on && bluetoothctl connect 14:3F:A6:6D:E3:D9")) +#+end_src +* UI +** Frames +#+begin_src lisp + (setf *message-window-gravity* :center + ,*input-window-gravity* :center + ,*window-border-style :thin + ,*mouse-focus-policy* :click + ,*transient-border-width* 2 + ,*normal-size-border-width* 2 + ,*message-window-padding* 10 + ,*message-window-y-padding* 10) +#+end_src +** Theme +#+begin_src lisp + (defvar thanos-nord0 "#2e3440") + (defvar thanos-nord1 "#3b4252") + (defvar thanos-nord2 "#434c5e") + (defvar thanos-nord3 "#4c566a") + (defvar thanos-nord4 "#d8dee9") + (defvar thanos-nord5 "#e5e9f0") + (defvar thanos-nord6 "#eceff4") + (defvar thanos-nord7 "#8fbcbb") + (defvar thanos-nord8 "#88c0d0") + (defvar thanos-nord9 "#81a1c1") + (defvar thanos-nord10 "#5e81ac") + (defvar thanos-nord11 "#bf616a") + (defvar thanos-nord12 "#d08770") + (defvar thanos-nord13 "#ebcb8b") + (defvar thanos-nord14 "#a3be8c") + (defvar thanos-nord15 "#b48ead") + + (defvar thanos-hope "#1c1d20") + (defvar thanos-hope-alt "#151619") + (defvar thanos-hope0 "#1B2229") + (defvar thanos-hope1 "#1c1f24") + (defvar thanos-hope2 "#202328") + (defvar thanos-hope3 "#23272e") + (defvar thanos-hope4 "#3f444a") + (defvar thanos-hope5 "#5B6268") + (defvar thanos-hope6 "#686b78") + (defvar thanos-hope7 "#9ca0a4") + (defvar thanos-hope8 "#DFDFDF") + (defvar thanos-hope-fg "#cbccd1") + (defvar thanos-hope-alt "#5B6268") + + (setq *colors* + `(,thanos-nord0 ;; 0 black + ,thanos-nord11 ;; 1 red + ,thanos-nord14 ;; 2 green + ,thanos-nord13 ;; 3 yellow + ,thanos-nord10 ;; 4 blue + ,thanos-nord14 ;; 5 magenta + ,thanos-nord8 ;; 6 cyan + ,thanos-nord5)) ;; 7 white + (setq *colors* + `(,thanos-hope "#1c1d20" + ,thanos-hope-alt "#151619" + ,thanos-hope0 "#1B2229" + ,thanos-hope1 "#1c1f24" + ,thanos-hope2 "#202328" + ,thanos-hope3 "#23272e" + ,thanos-hope4 "#3f444a" + ,thanos-hope5 "#5B6268" + ,thanos-hope6 "#686b78" + ,thanos-hope7 "#9ca0a4" + ,thanos-hope8 "#DFDFDF" + ,thanos-hope-fg "#cbccd1" + ,thanos-hope-alt "#5B6268")) + + (when *initializing* + (update-color-map (current-screen))) + + (load-module "swm-gaps") + (setf swm-gaps:*head-gaps-size* 0 + swm-gaps:*inner-gaps-size* 2 + swm-gaps:*outer-gaps-size* 4) + + (when *initializing* + (swm-gaps:toggle-gaps)) + + (set-border-color thanos-hope) + (set-focus-color thanos-hope) + (set-unfocus-color thanos-hope-alt) + (set-float-focus-color thanos-hope1 +) + (set-float-unfocus-color thanos-hope3) + + (set-fg-color thanos-hope-fg) + (set-bg-color thanos-hope-alt) +#+end_src +** Fonts +#+begin_src lisp + (ql:quickload :clx-truetype) + (load-module "ttf-fonts") + + (set-font `(,(make-instance 'xft:font :family "JetBrains Mono" :subfamily "Regular" :size 12 :antialias t) + ;; ,(make-instance 'xft:font :family "DejaVu Sans Mono for Powerline" :subfamily "Book" :size 8.5 :antialias t) + ;; ,(make-instance 'xft:font :family "siji" :subfamily "Medium" :size 10 :antialias t) + ;; ,(make-instance 'xft:font :family "FantasqueSansMono Nerd Font Mono" :subfamily "Regular" :size 9.5 :antialias t) + ) + ) +#+end_src +* Modeline +#+begin_src lisp + ;; Modeline phun + (load-module "battery-portable") + (load-module "cpu") + (load-module "mpd") + (load-module "mem") + + + (setf *mode-line-timeout* 2) + (setf *group-format* "%t") + (setf *window-format* "%n: %30t") + + (setf *mode-line-background-color* thanos-hope-alt + ,*mode-line-foreground-color* thanos-hope-fg) + + (setf *mode-line-border-color* thanos-hope1 + ,*mode-line-border-width* 0) + + (setf mem::*mem-modeline-fmt* "%a%p" + mpd:*mpd-modeline-fmt* "%a - %t" + mpd:*mpd-status-fmt* "%a - %t" + ,*hidden-window-color* "^**" + ,*mode-line-highlight-template* "«~A»") + + (defvar *mode-line-formatter-list* + '(("%g") ("%W") ("^>") ("docker-running" . t) ("mu-unread" . t) ("%m") ("%C") ("%M") ("%B") ("%d")) + "List of formatters for the modeline.") + + (defun generate-modeline (elements &optional not-invertedp rightp) + "Generate a modeline for StumpWM. + ELEMENTS should be a list of `cons'es which `car' is the modeline + formatter or the shell command to run, and their `cdr' is either nil + when the `car' is a formatter and t when it is a shell command." + (when elements + (cons (format nil + " ^[~A^]^(:bg \"~A\") " + (format nil "^(:fg \"~A\")^(:bg \"~A\")^f1~A^f0" + (if (xor not-invertedp rightp) phundrak-nord1 phundrak-nord3) + (if (xor not-invertedp rightp) phundrak-nord3 phundrak-nord1) + (if rightp "" "")) + (if not-invertedp phundrak-nord3 phundrak-nord1)) + (let* ((current-element (car elements)) + (formatter (car current-element)) + (commandp (cdr current-element))) + (cons (if commandp + `(:eval (run-shell-command ,formatter t)) + (format nil "~A" formatter)) + (generate-modeline (cdr elements) + (not not-invertedp) + (if (string= "^>" (caar elements)) t rightp))))))) + + (defcommand reload-modeline () () + "Reload modeline." + (sb-thread:make-thread + (lambda () + (setf *screen-mode-line-format* + (cdr (generate-modeline *mode-line-formatter-list*)))))) + + + (when *initializing* + (grename "[EMACS]") + (gnewbg "[BROWSER]") + (gnewbg "[LAMBDA]")) + (clear-window-placement-rules) + (setf *dynamic-group-master-split-ratio* 1/2) + + (setf *window-format* "%m%n%s%c") + (setf *screen-mode-line-format* (list "%g ^> %d")) + + (enable-mode-line (current-screen) (current-head) t) + + (setf *mode-line-timeout* 2) + + (setf *time-modeline-string* "%F %H:%M") + + (setf *group-format* "%t") + + (setf *window-format* "%n: %30t") +#+end_src +* Keybindings +:PROPERTIES: +:END: +#+begin_src lisp + (defcommand colon1 (&optional (initial "")) (:rest) + (let ((cmd (read-one-line (current-screen) ": " :initial-input initial))) + (when cmd + (eval-command cmd t)))) + + ;; Run rofi + (define-key *root-map* (kbd "C-r") "exec rofi -show drun") + (define-key *root-map* (kbd "C-R") "restart-soft") + (define-key *root-map* (kbd "M-r") "restart-hard") + (define-key *root-map* (kbd "p") "exec ~/Developer/rofi-pass/rofi-pass") + (define-key *root-map* (kbd "f") "float-this") + (define-key *root-map* (kbd "M-f") "fullscreen") + (define-key *root-map* (kbd "C-f") "unfloat-this") + (define-key *root-map* (kbd "C-s") "hsplit-and-focus") + (define-key *root-map* (kbd "s") "hsplit-and-focus") + (define-key *root-map* (kbd "x") "delete-window-and-frame") + + (define-key *root-map* (kbd "1") "select-window-by-number 0") + (define-key *root-map* (kbd "2") "select-window-by-number 1") + (define-key *root-map* (kbd "3") "select-window-by-number 2") + (define-key *root-map* (kbd "4") "select-window-by-number 3") + (define-key *root-map* (kbd "5") "select-window-by-number 4") + (define-key *root-map* (kbd "6") "select-window-by-number 5") + (define-key *root-map* (kbd "7") "select-window-by-number 6") + (define-key *root-map* (kbd "8") "select-window-by-number 7") + + (define-key *root-map* (kbd "e") "exec emacsclient -c") + + (define-key *root-map* (kbd "C-e") "exec emacs --daemon") + + ;; Ssh somewhere + (define-key *root-map* (kbd "C-S") "colon1 exec xterm -e ssh ") + + ;; Lock screen + (define-key *root-map* (kbd "C-l") "exec ~/Developer/scripts/lock.sh") + + ;; Audio + (define-key *top-map* (kbd "XF86AudioLowerVolume") "exec pamixer -d 5") + (define-key *top-map* (kbd "XF86AudioRaiseVolume") "exec pamixer -i 5") + + ;;Keyboard-light + (define-key *top-map* (kbd "XF86Explorer") "exec brightnessctl --device='tpacpi::kbd_backlight' set +1") + (define-key *top-map* (kbd "XF86LaunchA") "exec brightnessctl --device='tpacpi::kbd_backlight' set 1-") + + ;; Keyboard layout + (define-key *top-map* (kbd "F1") "exec setxkbmap us") + (define-key *top-map* (kbd "F2") "exec setxkbmap gr") + + ;;; Groups + ;; Switch to group + (define-key *root-map* (kbd "M-1") "gselect 1") + (define-key *root-map* (kbd "M-2") "gselect 2") + (define-key *root-map* (kbd "M-3") "gselect 3") + (define-key *root-map* (kbd "M-4") "gselect 4") + (define-key *root-map* (kbd "M-5") "gselect 5") + (define-key *root-map* (kbd "M-6") "gselect 6") + (define-key *root-map* (kbd "M-7") "gselect 7") + ;; Move window to group + (define-key *root-map* (kbd "M-!") "gmove 1") + (define-key *root-map* (kbd "M-@") "gmove 2") + (define-key *root-map* (kbd "M-#") "gmove 3") + (define-key *root-map* (kbd "M-$") "gmove 4") + (define-key *root-map* (kbd "M-%") "gmove 5") + (define-key *root-map* (kbd "M-^") "gmove 6") + (define-key *root-map* (kbd "M-&") "gmove 7") + ;; Focus + (define-key *root-map* (kbd "M-b") "move-focus left") + (define-key *root-map* (kbd "M-f") "move-focus right") + (define-key *root-map* (kbd "M-n") "move-focus down") + + (define-key *root-map* (kbd "M-s") "duckduckgo") +#+end_src |