#+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.95 inactive_opacity = 0.85 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-once = 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 wallpaper = DP-1, ~/wallpapers/robo-girl.jpg wallpaper = HDMI-A-1, ~/wallpapers/robo-girl.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 * 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) ;; 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")) ;; 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)))) ;; Run rofi (define-key *root-map* (kbd "C-r") "exec rofi -show drun") (define-key *root-map* (kbd ".") "exec rofi-pass") (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 xlock") ;; 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 -option ctrl:swapcaps") (define-key *top-map* (kbd "F2") "exec setxkbmap gr -option ctrl:swapcaps") (define-key *top-map* (kbd "F3") "exec setxkbmap my-cyr -option ctrl:swapcaps") ;;; 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") ;; 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-nord1 ;; 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))) (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) (setf *normal-border-width* 0 ,*float-window-border* 0 ,*float-window-title-height* 15 ,*window-border-style* :none ,*window-format* "%n:%t") (setf *key-seq-color* "^2") (setf *which-key-format* (concat *key-seq-color* "*~5a^n ~a")) (setf *input-window-gravity* :top ,*message-window-padding* 10 ,*message-window-y-padding* 10 ,*message-window-gravity* :center) ;; Message window font (set-font "-xos4-terminus-medium-r-normal--14-140-72-72-c-80-iso8859-15") (set-font "-xos4-terminus-medium-r-normal-*-20-*-*-*-*-*-*-*") ;;; Define window placement policy... (defvar *thanos/workspaces* (list "ALPHA" "BETA" "GAMMA" "DELTA" "EPSILON" "ZETA" "LAMBDA")) ;; I had to put lambda in there! But I don't want the rest of the letters before it. Don't @ me! (stumpwm:grename (nth 0 *thanos/workspaces*)) (dolist (workspace (cdr *thanos/workspaces*)) (stumpwm:gnewbg workspace)) ;; (defvar *move-to-keybinds* (list "!" "@" "#" "$" "%" "^" "&" "*" "(")) ;; (dotimes (y (length *ce/workspaces*)) ;; (let ((workspace (write-to-string (+ y 1)))) ;; (define-key *root-map* (kbd workspace) (concat "gselect " workspace)) ;; (define-key *root-map* (kbd (nth y *move-to-keybinds*)) (concat "gmove-and-follow " workspace)))) ;; Clear rules ;; (clear-window-placement-rules) ;; (setf *dynamic-group-master-split-ratio* 1/2) ;; ;; 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 :restonre 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")) ;; 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") (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) #+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