#+TITLE: General System Configurations #+PROPERTY: header-args :mkdirp yes #+auto_tangle: t #+STARTUP: overview * Git #+begin_src conf :tangle ~/.gitconfig [user] email = public@thanosapollo.com name = Thanos Apollo signingkey = 5F6B32E27F433AA9E42A530A0A50703D1CE7AE29 [commit] gpgsign = true [format] subjectPrefix = PATCH [sendemail] from = Thanos Apollo smtpserver = mail.gandi.net smtpuser = public@thanosapollo.com smtpencryption = ssl smtpserverport = 465 annotate = yes [credential "smtp://mail.gandi.net:465"] helper = "!f() { echo username=public@thanosapollo.com; echo \"password=$(pass show gandi/thanosapollo)\"; }; f" #+end_src * Hyprland ** Config *** Keyboard & monitors #+begin_src conf :tangle ~/.config/hypr/hyprland.conf # See https://wiki.hyprland.org/Configuring/Monitors/ monitor=transform,preferred,auto,auto # See https://wiki.hyprland.org/Configuring/Keywords/ for more # Some default env vars. env = XCURSOR_SIZE,24 # For all categories, see https://wiki.hyprland.org/Configuring/Variables/ input { kb_layout = us,gr,my-cyr kb_variant = kb_model = kb_options = ctrl:swapcaps, grp:alt_space_toggle, kb_rules = follow_mouse = 1 touchpad { natural_scroll = no } sensitivity = 0 # -1.0 - 1.0, 0 means no modification. } #+end_src *** Style #+begin_src conf :tangle ~/.config/hypr/hyprland.conf general { # See https://wiki.hyprland.org/Configuring/Variables/ for more gaps_in = 5 gaps_out = 10 border_size = 2 col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg col.inactive_border = rgba(595959aa) layout = master } decoration { # See https://wiki.hyprland.org/Configuring/Variables/ for more active_opacity = 0.99 inactive_opacity = 0.97 rounding = 10 blur = no blur_size = 3 blur_passes = 1 blur_new_optimizations = on drop_shadow = yes shadow_range = 4 shadow_render_power = 3 col.shadow = rgba(1a1a1aee) } animations { enabled = yes # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more bezier = myBezier, 0.05, 0.9, 0.1, 1.05 animation = windows, 1, 7, myBezier animation = windowsOut, 1, 7, default, popin 80% animation = border, 1, 10, default animation = borderangle, 1, 8, default animation = fade, 1, 7, default animation = workspaces, 1, 6, default } dwindle { # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more pseudotile = yes # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below preserve_split = yes # you probably want this } master { # See https://wiki.hyprland.org/Configuring/Master-Layout/ for more new_is_master = false mfact = 0.53 } gestures { # See https://wiki.hyprland.org/Configuring/Variables/ for more workspace_swipe = off } # Personal Configuration for Hyprland # Thanos Apollo 2023 # See https://wiki.hyprland.org/Configuring/ for more device:epic mouse V1 { sensitivity = -0.5 } #+end_src *** Keybindings #+begin_src conf :tangle ~/.config/hypr/hyprland.conf # See https://wiki.hyprland.org/Configuring/Keywords/ for more $mainMod = CTRL_ALT # Binds, see https://wiki.hyprland.org/Configuring/Binds/ for more bind = , F5, exec, "/home/$USER/Developer/scripts/keyboard-light-x220.sh" bind = , F1, exec, swaylock --screenshot --clock --effect-blur 10x9 --indicator bind = , F8, exec, brightnessctl set +5% bind = , F7, exec, brightnessctl set 5-% bind = , XF86AudioRaiseVolume, exec, pamixer -i 5 bind = , XF86AudioLowerVolume, exec, pamixer -d 5 bind = , XF86AudioMute, exec, pamixer -t bind = $mainMod, Return, exec, emacsclient -c bind = $mainMod, W, exec, kitty bind = $mainMod, Q, killactive, bind = $mainMod SHIFT, Q, exit, bind = $mainMod, R, exec, rofi -show drun bind = $mainMod, E, exec, tessen --dmenu=rofi bind = $mainMod, V, togglefloating, bind = $mainMod, J, togglesplit, # dwindle bind = ALT, F12, exec, grim -g "$(slurp)" bind = ALT, F11, fullscreen # Move focus with mainMod + arrow keys bind = $mainMod, B, movefocus, l bind = $mainMod, F, movefocus, r bind = $mainMod, N, movefocus, d bind = $mainMod, P, movefocus, u bind = $mainMod SHIFT, P, movewindow, u bind = $mainMod SHIFT, N, movewindow, d bind = $mainMod SHIFT, F, movewindow, r bind = $mainMod SHIFT, B, movewindow, l # Switch workspaces with mainMod + [0-9] bind = $mainMod, 1, workspace, 1 bind = $mainMod, 2, workspace, 2 bind = $mainMod, 3, workspace, 3 bind = $mainMod, 4, workspace, 4 bind = $mainMod, 5, workspace, 5 bind = $mainMod, 6, workspace, 6 bind = $mainMod, 7, workspace, 7 bind = $mainMod, 8, workspace, 8 bind = $mainMod, 9, workspace, 9 bind = $mainMod, 0, workspace, 10 # Move active window to a workspace with mainMod + SHIFT + [0-9] bind = $mainMod SHIFT, 1, movetoworkspace, 1 bind = $mainMod SHIFT, 2, movetoworkspace, 2 bind = $mainMod SHIFT, 3, movetoworkspace, 3 bind = $mainMod SHIFT, 4, movetoworkspace, 4 bind = $mainMod SHIFT, 5, movetoworkspace, 5 bind = $mainMod SHIFT, 6, movetoworkspace, 6 bind = $mainMod SHIFT, 7, movetoworkspace, 7 bind = $mainMod SHIFT, 8, movetoworkspace, 8 bind = $mainMod SHIFT, 9, movetoworkspace, 9 bind = $mainMod SHIFT, 0, movetoworkspace, 10 # Scroll through existing workspaces with mainMod + scroll bind = ALT, mouse_down, workspace, e+1 bind = ALT, mouse_up, workspace, e-1 # Move/resize windows with mainMod + LMB/RMB and dragging bindm = ALT, mouse:272, movewindow bindm = ALT, mouse:273, resizewindow #+end_src *** Exec upon start #+begin_src conf :tangle ~/.config/hypr/hyprland.conf exec-once = waybar exec = hyprpaper exec-once = emacs --daemon exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP exec-once = nm-applet #+end_src ** Hyprpaper #+begin_src conf :tangle ~/.config/hypr/hyprpaper.conf preload = ~/wallpapers/wallpaper-cyberpunk.jpg preload = ~/wallpapers/science-athlete.jpg preload = ~/wallpapers/robo-girl.jpg preload = ~/wallpapers/chalk-board-wallpapers.jpg wallpaper = DP-1, ~/wallpapers/chalk-board-wallpapers.jpg wallpaper = HDMI-A-1, ~/wallpapers/chalk-board-wallpapers.jpg wallpaper = LVDS-1, ~/wallpapers/science-athlete.jpg #+end_src * Waybar ** Configuration #+begin_src jsonc :tangle ~/.config/waybar/config.jsonc { "layer": "top", "position": "top", "mod": "dock", "exclusive": true, "passthrough": false, "gtk-layer-shell": true, "height": 0, "modules-left": [ "clock", "custom/weather" // "hyprland/window", ], "modules-center": ["wlr/workspaces"], "modules-right": [ "tray", "custom/updates", "custom/language", "battery", "backlight", "custom/volume" // "pulseaudio#microphone" ], "hyprland/window": { "format": "{}" }, "wlr/workspaces": { "disable-scroll": true, "all-outputs": true, "on-click": "activate", //"format": "{icon}", "persistent_workspaces": { "1": [], "2": [], "3": [], "4": [], "5": [], "6": [], "7": [], "8": [], "9": [], "10": [] } }, "custom/updates": { "exec": "(pacman -Qu ; paru -Qua) | wc -l", "interval": 7200, "format": " {}" }, "custom/weather" : { "tooltip" : true, "format" : "{}", "interval" : 30, "exec" : "~/Developer/scripts/waybar-wttr.py", "return-type" : "json" }, "tray": { "icon-size": 13, "spacing": 10 }, "clock": { "format": "{: %R  %d/%m}", "tooltip-format": "{:%Y %B}\n{calendar}" }, "backlight": { "device": "intel_backlight", "format": "{icon} {percent}%", "format-icons": ["", "", ""], "on-scroll-up": "brightnessctl set 1%+", "on-scroll-down": "brightnessctl set 1%-", "min-length": 6 }, "battery": { "states": { "good": 95, "warning": 30, "critical": 20 }, "format": "{icon} {capacity}%", "format-charging": " {capacity}%", "format-plugged": " {capacity}%", "format-alt": "{time} {icon}", "format-icons": ["", "", "", "", "", "", "", "", "", "", ""] }, "pulseaudio": { "format": "{icon} {volume}%", "tooltip": false, "format-muted": " Muted", "on-click": "pamixer -t", "on-scroll-up": "pamixer -i 5", "on-scroll-down": "pamixer -d 5", "scroll-step": 5, "format-icons": { "headphone": "", "hands-free": "", "headset": "", "phone": "", "portable": "", "car": "", "default": ["", "", ""] } }, "custom/volume": { "exec": "pamixer --get-volume", "interval": 1, "format": " {}%", "tooltip": true } // "custom/pipewire": { // "format": {}, // "exec": "awk -F"[][]" '/Left:/ { print $2 }' <(amixer sget Master)", // "interval": 10 // }, } #+end_src ** Style #+begin_src css :tangle ~/.config/waybar/style.css ,* { border: none; border-radius: 0; font-family: Jetbrains Mono, Cartograph CF Nerd Font, monospace; font-weight: bold; font-size: 14px; min-height: 0; } window#waybar { background: rgba(21, 18, 27, 0); color: #cdd6f4; } tooltip { background: #0d1017; border-radius: 10px; border-width: 2px; border-style: solid; border-color: #11111b; } #workspaces button { padding: 5px; color: #313244; margin-right: 5px; } #workspaces button.active { color: #39bae6; } #workspaces button.focused { color: #a6adc8; background: #eba0ac; border-radius: 10px; } #workspaces button.urgent { color: #11111b; background: #a6e3a1; border-radius: 10px; } #workspaces button:hover { background: #11111b; color: #cdd6f4; border-radius: 10px; } #custom-language, #custom-updates, #custom-caffeine, #custom-weather, #window, #clock, #battery, #pulseaudio, #custrom-volume, #network, #workspaces, #tray, #backlight { background: #0d1017; padding: 0px 10px; margin: 3px 0px; margin-top: 10px; border: 1px solid #181825; } #tray { border-radius: 10px; margin-right: 10px; } #workspaces { background: #0d1017; border-radius: 10px; margin-left: 10px; padding-right: 0px; padding-left: 5px; } #custom-caffeine { color: #89dceb; border-radius: 10px 0px 0px 10px; border-right: 0px; margin-left: 10px; } #custom-language { color: #f38ba8; border-left: 0px; border-right: 0px; } #custom-updates { color: #ff8f40; border-left: 0px; border-right: 0px; } #window { border-radius: 10px; margin-left: 20px; margin-right: 60px; } #clock { color: #39bae6; border-radius: 10px 0px 0px 10px; margin-left: 0px; border-right: 0px; } #network { color: #f9e2af; border-left: 0px; border-right: 0px; } #pulseaudio { color: #59c2ff; border-left: 5px; border-right: 5px; } #custom-volume { background: #0d1017; color: #59c2ff; padding: 8px; margin-top: 11px; margin-bottom: 3px; border-left: 0px; border-right: 0px; } #battery { color: #a6e3a1; border-radius: 0 10px 10px 0; margin-right: 10px; border-left: 0px; } #custom-weather { border-radius: 0px 10px 10px 0px; border-right: 0px; margin-left: 0px; } #+end_src * iSync #+begin_src conf :tangle ~/.mbsyncrc IMAPAccount public Host mail.gandi.net Port 993 User public@thanosapollo.com PassCmd "pass show gandi/thanosapollo" SSLType IMAPS SSLVersions TLSv1.2 CertificateFile /etc/ssl/certs/ca-certificates.crt IMAPStore public-remote Account public MaildirStore public-local Path ~/Mail/Public/ Inbox ~/Mail/Public/Inbox Trash ~/Mail/Public/Trash/ SubFolders Verbatim Channel public Far :public-remote: Near :public-local: Patterns * Expunge None CopyArrivalDate yes Sync All Create Both SyncState * #+end_src * Stumpwm #+begin_src lisp :tangle ~/.stumpwm.d/init.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) (setf *startup-message* "StumpWM is ready!") ;; autostart (run-shell-command " emacs --daemon & feh --bg-scale ~/wallpapers/robo-girl.jpg & picom & setxkbmap us -option ctrl:swapcaps") (setf *mouse-focus-policy* :click) ;; prefix key (set-prefix-key (kbd "C-t")) (which-key-mode) ;; 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)))) ;(define-key *top-map* (kbd "Super-2") (gselect 1)) ;; Run rofi (define-key *root-map* (kbd "C-r") "exec rofi -show drun") (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 "C-f") "unfloat-this") (define-key *root-map* (kbd "C-s") "hsplit-and-focus") (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 pkill -KILL -u thanos") ;; 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") ;; Web jump (works for DuckDuckGo and Imdb) (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=") ;(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") ;; (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")) ;; UI (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) ;; Theme (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") (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 (when *initializing* (update-color-map (current-screen))) ;; 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-nord1 ,*mode-line-foreground-color* thanos-nord5) (setf *mode-line-border-color* thanos-nord1 ,*mode-line-border-width* 0) (setf cpu::*cpu-modeline-fmt* "%c" cpu::*cpu-usage-modeline-fmt* "^f2^f0^[~A~2D%^]" 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]") (grename "[BROWSER]") (grename "[LAMBDA]")) (clear-window-placement-rules) (setf *dynamic-group-master-split-ratio* 1/2) (setf *input-window-gravity* :center ,*message-window-padding* 10 ,*message-window-y-padding* 10 ,*message-window-gravity* :center) (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-nord1) (set-focus-color thanos-nord1) (set-unfocus-color thanos-nord3) (set-float-focus-color thanos-nord1) (set-float-unfocus-color thanos-nord3) (set-fg-color thanos-nord4) (set-bg-color thanos-nord1) ;; Modeline (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