summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stumpwm.org356
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