X-Git-Url: https://git.shemshak.org/~bandali/configs/blobdiff_plain/d141ce1178b5a4728e31ca382e4323552d650df7..96611976e652d23d88916be38c112d081d1f88aa:/.emacs.d/init.el diff --git a/.emacs.d/init.el b/.emacs.d/init.el index e499e4b..9f5d07f 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -563,22 +563,27 @@ For disabling the behaviour for certain buffers and/or modes." (use-package exwm :demand :config - (require 'exwm-config) - - (setq - exwm-workspace-number 4 - exwm-workspace-index-map (lambda (i) (number-to-string (1+ i)))) - - ;; Make class name the buffer name, truncating beyond 60 characters - (defun exwm-rename-buffer () + ;; make class name the buffer name, truncating beyond 60 characters + (defun b/exwm-rename-buffer () (interactive) (exwm-workspace-rename-buffer (concat exwm-class-name ":" (if (<= (length exwm-title) 60) exwm-title (concat (substring exwm-title 0 59) "..."))))) - (add-hook 'exwm-update-class-hook 'exwm-rename-buffer) - (add-hook 'exwm-update-title-hook 'exwm-rename-buffer) + ;; Enable EXWM + (exwm-enable) + :hook ((exwm-update-class . b/exwm-rename-buffer) + (exwm-update-title . b/exwm-rename-buffer))) + +(use-feature exwm-config + :demand + :after exwm + :hook (exwm-init . exwm-config--fix/ido-buffer-window-other-frame)) +(use-feature exwm-input + :demand + :after exwm-workspace + :config (defun b/exwm-ws-prev-index () "Return the index for the previous EXWM workspace, wrapping around if needed." @@ -594,138 +599,104 @@ around if needed." 0 (1+ exwm-workspace-current-index))) - ;; 's-R': Reset - (exwm-input-set-key (kbd "s-R") #'exwm-reset) - ;; 's-\': Switch workspace - (exwm-input-set-key (kbd "s-\\") #'exwm-workspace-switch) - ;; 's-N': Switch to certain workspace - (dotimes (i exwm-workspace-number) - (exwm-input-set-key - (kbd (format "s-%d" i)) - (lambda () - (interactive) - (exwm-workspace-switch-create (1- i))))) - ;; 's-[': Switch to previous workspace - (defun b/exwm-ws-prev () - "Switch to previous EXWM workspace, wrapping around if needed." - (interactive) - (exwm-workspace-switch-create (b/exwm-ws-prev-index))) - (exwm-input-set-key (kbd "s-[") #'b/exwm-ws-prev) - ;; 's-]': Switch to next workspace - (defun b/exwm-ws-next () - "Switch to next EXWM workspace, wrapping around if needed." - (interactive) - (exwm-workspace-switch-create (b/exwm-ws-next-index))) - (exwm-input-set-key (kbd "s-]") #'b/exwm-ws-next) - ;; 's-{': Move window to previous workspace - (defun b/exwm-move-window-to-prev-ws () - "Move window to previous EXWM workspace, wrapping around if -needed." - (interactive) - (exwm-workspace-move-window (b/exwm-ws-prev-index))) - (exwm-input-set-key (kbd "s-{") #'b/exwm-move-window-to-prev-ws) - ;; 's-}': Move window to next workspace - (defun b/exwm-move-window-to-next-ws () - "Move window to next EXWM workspace, wrapping around if -needed." - (interactive) - (exwm-workspace-move-window (b/exwm-ws-next-index))) - (exwm-input-set-key (kbd "s-}") #'b/exwm-move-window-to-next-ws) - ;; 's-SPC': Launch application - ;; (exwm-input-set-key - ;; (kbd "s-SPC") - ;; (lambda (command) - ;; (interactive (list (read-shell-command "➜ "))) - ;; (start-process-shell-command command nil command))) - - (exwm-input-set-key (kbd "M-s-SPC") #'counsel-linux-app) - - (exwm-input-set-key - (kbd "s-") (lambda () - (interactive) - (b/start-process "urxvt"))) - - (exwm-input-set-key - (kbd "s-t") - (lambda () - (interactive) - (exwm-floating-toggle-floating))) - - (exwm-input-set-key - (kbd "s-f") - (lambda () - (interactive) - (exwm-layout-toggle-fullscreen))) - - (exwm-input-set-key - (kbd "s-w") - (lambda () - (interactive) - (kill-buffer (current-buffer)))) - - (exwm-input-set-key - (kbd "s-q") - (lambda () - (interactive) - (exwm-manage--kill-client))) - - ;; (exwm-input-set-key - ;; (kbd "s-SPC") ;; rofi doesn't properly launch programs when started from emacs - ;; (lambda () - ;; (interactive) - ;; (start-process-shell-command "rofi-run" nil "rofi -show run -display-run '> ' -display-window ' 🗔 '"))) - - ;; (exwm-input-set-key - ;; (kbd "s-/") - ;; (lambda () - ;; (interactive) - ;; (start-process-shell-command "rofi-win" nil "rofi -show window -display-run '> ' -display-window ' 🗔 '"))) - - ;; (exwm-input-set-key - ;; (kbd "M-SPC") - ;; (lambda () - ;; (interactive) - ;; (start-process "rofi-pass" nil "rofi-pass"))) - - (exwm-input-set-key - (kbd "") - (lambda () - (interactive) - (start-process-shell-command "pamixer" nil "pamixer --toggle-mute"))) - - (exwm-input-set-key - (kbd "") - (lambda () - (interactive) - (start-process-shell-command "pamixer" nil "pamixer --allow-boost --decrease 5"))) - - (exwm-input-set-key - (kbd "") - (lambda () - (interactive) - (start-process-shell-command "pamixer" nil "pamixer --allow-boost --increase 5"))) - - (exwm-input-set-key - (kbd "") - (lambda () - (interactive) - (start-process-shell-command "mpc" nil "mpc toggle"))) - - (exwm-input-set-key - (kbd "") - (lambda () - (interactive) - (start-process-shell-command "mpc" nil "mpc prev"))) - - (exwm-input-set-key - (kbd "") - (lambda () - (interactive) - (start-process-shell-command "mpc" nil "mpc next"))) - - ;; Shorten 'C-c C-q' to 'C-q' + ;; shorten 'C-c C-q' to 'C-q' (define-key exwm-mode-map [?\C-q] #'exwm-input-send-next-key) + (setq exwm-input-global-keys + `(([?\s-R] . exwm-reset) + ([?\s-\\] . exwm-workspace-switch) + ([?\s-\s] . (lambda (command) + (interactive + (list (read-shell-command "➜ "))) + (start-process-shell-command + command nil command))) + ([s-return] . (lambda () + (interactive) + (start-process "" nil "urxvt"))) + ([?\C-\s-\s] . counsel-linux-app) + ([?\M-\s-\s] . (lambda () + (interactive) + (start-process-shell-command + "rofi-pass" nil "rofi-pass"))) + ([?\s-h] . windmove-left) + ([?\s-j] . windmove-down) + ([?\s-k] . windmove-up) + ([?\s-l] . windmove-right) + ([?\s-H] . windmove-swap-states-left) + ([?\s-J] . windmove-swap-states-down) + ([?\s-K] . windmove-swap-states-up) + ([?\s-L] . windmove-swap-states-right) + ([?\M-\s-h] . shrink-window-horizontally) + ([?\M-\s-l] . enlarge-window-horizontally) + ([?\M-\s-k] . shrink-window) + ([?\M-\s-j] . enlarge-window) + ([?\s-\[] . (lambda () + (interactive) + (exwm-workspace-switch-create + (b/exwm-ws-prev-index)))) + ([?\s-\]] . (lambda () + (interactive) + (exwm-workspace-switch-create + (b/exwm-ws-next-index)))) + ([?\s-{] . (lambda () + (interactive) + (exwm-workspace-move-window + (b/exwm-ws-prev-index)))) + ([?\s-}] . (lambda () + (interactive) + (exwm-workspace-move-window + (b/exwm-ws-next-index)))) + ,@(mapcar (lambda (i) + `(,(kbd (format "s-%d" i)) . + (lambda () + (interactive) + (exwm-workspace-switch-create ,i)))) + (number-sequence 0 (1- exwm-workspace-number))) + ([?\s-t] . exwm-floating-toggle-floating) + ([?\s-f] . exwm-layout-toggle-fullscreen) + ([?\s-w] . (lambda () + (interactive) + (kill-buffer (current-buffer)))) + ([?\s-q] . (lambda () + (interactive) + (exwm-manage--kill-client))) + ([?\s-\'] . (lambda () + (interactive) + (start-process-shell-command + "rofi-light" nil "rofi-light"))) + ([XF86AudioMute] . + (lambda () + (interactive) + (start-process "" nil "pamixer" "--toggle-mute"))) + ([XF86AudioLowerVolume] . + (lambda () + (interactive) + (start-process + "" nil "pamixer" "--allow-boost" "--decrease" "5"))) + ([XF86AudioRaiseVolume] . + (lambda () + (interactive) + (start-process + "" nil "pamixer" "--allow-boost" "--increase" "5"))) + ([XF86AudioPlay] . + (lambda () + (interactive) + (start-process "" nil "mpc" "toggle"))) + ([XF86AudioPrev] . + (lambda () + (interactive) + (start-process "" nil "mpc" "prev"))) + ([XF86AudioNext] . + (lambda () + (interactive) + (start-process "" nil "mpc" "next"))) + ([XF86ScreenSaver] . + (lambda () + (interactive) + (start-process "" nil "dm-tool" "lock"))) + ([\s-XF86Back] . previous-buffer) + ([\s-XF86Forward] . next-buffer))) + ;; Line-editing shortcuts (setq exwm-input-simulation-keys '(;; movement @@ -741,6 +712,8 @@ needed." ([?\C-v] . [next]) ([?\C-d] . [delete]) ([?\C-k] . [S-end ?\C-x]) + ([?\M-<] . C-home) + ([?\M->] . C-end) ;; cut/copy/paste ([?\C-w] . [?\C-x]) ([?\M-w] . [?\C-c]) @@ -750,18 +723,51 @@ needed." ;; search ([?\C-s] . [?\C-f]) ;; escape - ([?\C-g] . [escape]))) + ([?\C-g] . [escape])))) - ;; Enable EXWM - (exwm-enable) +(use-feature exwm-manage + :demand + :after exwm + :hook + (exwm-manage-finish . (lambda () + (when exwm-class-name + (cond + ((string= exwm-class-name "Abrowser") + (exwm-input-set-local-simulation-keys + `(,@exwm-input-simulation-keys + ([?\C-\S-d] . [?\C-d]) + ([?\C-q] . [?\C-w]) + ([?\s-q] . [?\C-q])))) + ((string= exwm-class-name "URxvt") + (exwm-input-set-local-simulation-keys + '(([?\C-c ?\C-c] . [?\C-c]) + ([?\C-c ?\C-u] . [?\C-u])))) + ((string= exwm-class-name "Zathura") + (exwm-input-set-local-simulation-keys + '(([?\C-p] . [C-up]) + ([?\C-n] . [C-down]))))))))) + +(use-feature exwm-randr + :demand + :after exwm + :config + (exwm-randr-enable)) - (add-hook 'exwm-init-hook #'exwm-config--fix/ido-buffer-window-other-frame) +(use-feature exwm-systemtray + :demand + :after exwm + :config + (exwm-systemtray-enable)) - (require 'exwm-systemtray) - (exwm-systemtray-enable) +(use-feature exwm-workspace + :demand + :after exwm + :custom + (exwm-workspace-number 4)) - (require 'exwm-randr) - (exwm-randr-enable)) +(use-package exwm-edit + :demand + :after exwm) ;; use the org-plus-contrib package to get the whole deal (use-package org-plus-contrib) @@ -1487,6 +1493,7 @@ This function is intended for use with `ivy-ignore-buffers'." (load-theme 'tangomod t) (use-package smart-mode-line + :disabled :commands (sml/apply-theme) :demand :config @@ -1502,29 +1509,51 @@ This function is intended for use with `ivy-ignore-buffers'." (use-package doom-themes) +(use-package solarized-theme + :disabled + :config + (load-theme 'solarized-light t)) + +(use-package moody + :demand + :config + (setq x-underline-at-descent-line t) + (let ((line (face-attribute 'mode-line :underline))) + (set-face-attribute 'mode-line nil :overline line) + (set-face-attribute 'mode-line-inactive nil :overline line) + (set-face-attribute 'mode-line-inactive nil :underline line) + (set-face-attribute 'mode-line nil :box nil) + (set-face-attribute 'mode-line-inactive nil :box nil) + (set-face-attribute 'mode-line-inactive nil :background "#eeeeee")) ; d3d7cf + (moody-replace-mode-line-buffer-identification) + (moody-replace-vc-mode)) + (defvar b/org-mode-font-lock-keywords '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)" (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind - (4 '(:foreground "#c5c8c6") t)))) ; title + (4 '(:foreground "#c5c8c6") t))) ; title + "For use with the `doom-tomorrow-night' theme.") (defun b/lights-on () "Enable my favourite light theme." (interactive) (mapc #'disable-theme custom-enabled-themes) (load-theme 'tangomod t) - (sml/apply-theme 'automatic) + ;; (sml/apply-theme 'automatic) (font-lock-remove-keywords - 'org-mode b/org-mode-font-lock-keywords)) + 'org-mode b/org-mode-font-lock-keywords) + (exwm-systemtray--refresh)) (defun b/lights-off () "Go dark." (interactive) (mapc #'disable-theme custom-enabled-themes) - (load-theme 'doom-tomorrow-night t) - (sml/apply-theme 'automatic) + (load-theme 'doom-one t) + ;; (sml/apply-theme 'automatic) (font-lock-add-keywords - 'org-mode b/org-mode-font-lock-keywords t)) + 'org-mode b/org-mode-font-lock-keywords t) + (exwm-systemtray--refresh)) (bind-keys ("C-c t d" . b/lights-off) @@ -1795,11 +1824,9 @@ This function is intended for use with `ivy-ignore-buffers'." ("p" . mc/mark-previous-like-this) ("a" . mc/mark-all-like-this)))) -(comment - ;; TODO - (use-package forge - :after magit - :demand)) +(use-package forge + :demand + :after magit) (use-package yasnippet :defer 0.6 @@ -1908,6 +1935,23 @@ This function is intended for use with `ivy-ignore-buffers'." :demand :config (minions-mode)) +(use-package dmenu + :disabled + :custom + (dmenu-history-size 0) + (dmenu-prompt-string "run: ") + (dmenu-save-file (b/var "dmenu-items"))) + +(use-package eosd + ;; TODO: fix build by properly building the eosd-pixbuf.c module + ;; e.g. see https://github.com/raxod502/straight.el/issues/386 + :disabled + :straight (:host github :repo "clarete/eosd") + :demand + :after exwm + :config + (eosd-start)) + ;;; Email (with Gnus) @@ -2131,10 +2175,6 @@ This function is intended for use with `ivy-ignore-buffers'." gnus-interactive-exit nil gnus-gcc-mark-as-read t) :config - (require 'ebdb) - (require 'ebdb-mua) - (require 'ebdb-gnus) - (when (version< emacs-version "27") (add-to-list 'nnmail-split-abbrev-alist @@ -2349,6 +2389,7 @@ https://csclub.uwaterloo.ca/~abandali") ("s" . footnote-set-style))) (use-package ebdb + :demand :after gnus :bind (:map gnus-group-mode-map ("e" . ebdb)) :config @@ -2369,14 +2410,15 @@ https://csclub.uwaterloo.ca/~abandali") (defun company-ebdb--post-complete (_) nil)) (use-feature ebdb-gnus + :demand :after ebdb :custom (ebdb-gnus-window-size 0.3)) (use-feature ebdb-mua + :demand :after ebdb - ;; :custom (ebdb-mua-pop-up nil) - ) + :custom (ebdb-mua-pop-up nil)) ;; (use-package ebdb-message ;; :after ebdb) @@ -2446,80 +2488,7 @@ https://csclub.uwaterloo.ca/~abandali") (add-to-list 'erc-modules 'notifications) (add-to-list 'erc-modules 'spelling) (add-to-list 'erc-modules 'scrolltoplace) - (erc-update-modules) - - (when (and (version<= "24.4" emacs-version) - (version< emacs-version "27")) - ;; fix erc-lurker bug - ;; patch submitted: https://bugs.gnu.org/36843#10 - ;; TODO: remove when patch is merged and emacs 27 is released - (defvar erc-message-parsed) - (defun erc-display-message (parsed type buffer msg &rest args) - "Display MSG in BUFFER. - -ARGS, PARSED, and TYPE are used to format MSG sensibly. - -See also `erc-format-message' and `erc-display-line'." - (let ((string (if (symbolp msg) - (apply #'erc-format-message msg args) - msg)) - (erc-message-parsed parsed)) - (setq string - (cond - ((null type) - string) - ((listp type) - (mapc (lambda (type) - (setq string - (erc-display-message-highlight type string))) - type) - string) - ((symbolp type) - (erc-display-message-highlight type string)))) - - (if (not (erc-response-p parsed)) - (erc-display-line string buffer) - (unless (erc-hide-current-message-p parsed) - (erc-put-text-property 0 (length string) 'erc-parsed parsed string) - (erc-put-text-property 0 (length string) 'rear-sticky t string) - (when (erc-response.tags parsed) - (erc-put-text-property 0 (length string) 'tags (erc-response.tags parsed) - string)) - (erc-display-line string buffer))))) - - (defun erc-lurker-update-status (_message) - "Update `erc-lurker-state' if necessary. - -This function is called from `erc-insert-pre-hook'. If the -current message is a PRIVMSG, update `erc-lurker-state' to -reflect the fact that its sender has issued a PRIVMSG at the -current time. Otherwise, take no action. - -This function depends on the fact that `erc-display-message' -lexically binds `erc-message-parsed', which is used to check if -the current message is a PRIVMSG and to determine its sender. -See also `erc-lurker-trim-nicks' and `erc-lurker-ignore-chars'. - -In order to limit memory consumption, this function also calls -`erc-lurker-cleanup' once every `erc-lurker-cleanup-interval' -updates of `erc-lurker-state'." - (when (and (boundp 'erc-message-parsed) - (erc-response-p erc-message-parsed)) - (let* ((command (erc-response.command erc-message-parsed)) - (sender - (erc-lurker-maybe-trim - (car (erc-parse-user (erc-response.sender erc-message-parsed))))) - (server - (erc-canonicalize-server-name erc-server-announced-name))) - (when (equal command "PRIVMSG") - (when (>= (cl-incf erc-lurker-cleanup-count) - erc-lurker-cleanup-interval) - (setq erc-lurker-cleanup-count 0) - (erc-lurker-cleanup)) - (unless (gethash server erc-lurker-state) - (puthash server (make-hash-table :test 'equal) erc-lurker-state)) - (puthash sender (current-time) - (gethash server erc-lurker-state)))))))) + (erc-update-modules)) (use-feature erc-fill :after erc @@ -2541,6 +2510,7 @@ updates of `erc-lurker-state'." (erc-track-enable-keybindings nil) (erc-track-exclude-types '("JOIN" "MODE" "NICK" "PART" "QUIT" "324" "329" "332" "333" "353" "477")) + (erc-track-position-in-mode-line t) (erc-track-priority-faces-only 'all) (erc-track-shorten-function nil))