X-Git-Url: https://git.shemshak.org/~bandali/configs/blobdiff_plain/fa9943dccbfd6cd3d7cefa8777e340e9d0b686b4..d1ba7028d70c018dd50ffa450962fa048da39200:/.emacs.d/init.el diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 4355ad6..f58d46d 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -394,6 +394,7 @@ For disabling the behaviour for certain buffers and/or modes." ;; time and battery in mode-line (use-feature time + :disabled :demand :config (display-time-mode) @@ -402,6 +403,7 @@ For disabling the behaviour for certain buffers and/or modes." (display-time-format "%a %b %-e, %-l:%M%P")) (use-feature battery + :disabled :demand :config (display-battery-mode) @@ -488,6 +490,11 @@ For disabling the behaviour for certain buffers and/or modes." :custom ((epg-gpg-program (executable-find "gpg")))) +(use-feature auth-source + :custom + (auth-sources '("~/.authinfo.gpg")) + (authinfo-hidden (regexp-opt '("password" "client-secret" "token")))) + ;;; General bindings @@ -561,6 +568,7 @@ For disabling the behaviour for certain buffers and/or modes." ;;; Essential packages (use-package exwm + :disabled :demand :config ;; make class name the buffer name, truncating beyond 60 characters @@ -602,14 +610,16 @@ around if needed." ;; 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 + (setq exwm-workspace-number 4 + 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-\s] . dmenu) + ([?\S-\s-\s] . (lambda (command) + (interactive + (list (read-shell-command "➜ "))) + (start-process-shell-command + command nil command))) ([s-return] . (lambda () (interactive) (start-process "" nil "urxvt"))) @@ -618,6 +628,18 @@ around if needed." (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 @@ -642,10 +664,10 @@ around if needed." (number-sequence 0 (1- exwm-workspace-number))) ([?\s-t] . exwm-floating-toggle-floating) ([?\s-f] . exwm-layout-toggle-fullscreen) - ([?\s-w] . (lambda () + ([?\s-W] . (lambda () (interactive) (kill-buffer (current-buffer)))) - ([?\s-q] . (lambda () + ([?\s-Q] . (lambda () (interactive) (exwm-manage--kill-client))) ([?\s-\'] . (lambda () @@ -681,7 +703,9 @@ around if needed." ([XF86ScreenSaver] . (lambda () (interactive) - (start-process "" nil "dm-tool" "lock"))))) + (start-process "" nil "dm-tool" "lock"))) + ([\s-XF86Back] . previous-buffer) + ([\s-XF86Forward] . next-buffer))) ;; Line-editing shortcuts (setq exwm-input-simulation-keys @@ -706,16 +730,52 @@ around if needed." ([?\C-y] . [?\C-v]) ([?\M-d] . [C-S-right ?\C-x]) ([?\M-\d] . [C-S-left ?\C-x]) - ;; search + ;; window + ([?\s-w] . [?\C-w]) + ([?\s-q] . [?\C-q]) + ;; misc ([?\C-s] . [?\C-f]) - ;; escape + ([?\s-s] . [?\C-s]) ([?\C-g] . [escape])))) +(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])))) + ((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)) + (exwm-randr-enable) + :custom + (exwm-randr-workspace-monitor-plist '(1 "VGA-1")) + :hook + (exwm-randr-screen-change . (lambda () + (let ((xrandr + (string-join + '("xrandr" + "--output VGA-1" + "--same-as LVDS-1" + "--auto") + " "))) + (start-process-shell-command + "xrandr" nil xrandr))))) (use-feature exwm-systemtray :demand @@ -723,11 +783,11 @@ around if needed." :config (exwm-systemtray-enable)) -(use-feature exwm-workspace +(use-feature exwm-workspace) + +(use-package exwm-edit :demand - :after exwm - :custom - (exwm-workspace-number 4)) + :after exwm) ;; use the org-plus-contrib package to get the whole deal (use-package org-plus-contrib) @@ -1274,12 +1334,11 @@ This function is intended for use with `ivy-ignore-buffers'." (use-package alloy-mode :straight (:host github :repo "dwwmmn/alloy-mode") :mode "\\.als\\'" - :config (setq alloy-basic-offset 2)) + :config (setq alloy-basic-offset 2) + :hook (alloy-mode . (lambda () (setq-local indent-tabs-mode nil)))) (eval-when-compile (defvar lean-mode-map)) (use-package lean-mode - :straight (:host github :repo "leanprover/lean-mode" - :fork (:repo "notbandali/lean-mode" :branch "remove-cl")) :defer 0.4 :bind (:map lean-mode-map ("S-SPC" . company-complete)) @@ -1444,6 +1503,10 @@ This function is intended for use with `ivy-ignore-buffers'." :hook ((tex-mode . auto-fill-mode) (tex-mode . flyspell-mode))) +(use-package george-mode + :straight (:host nil :repo "https://git.shemshak.org/amin/george-mode") + :mode "\\.grg\\'") + ;;; Theme @@ -1453,6 +1516,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 @@ -1468,18 +1532,38 @@ 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 "#e1e1e1")) ; 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)) @@ -1487,8 +1571,8 @@ This function is intended for use with `ivy-ignore-buffers'." "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)) @@ -1659,8 +1743,8 @@ This function is intended for use with `ivy-ignore-buffers'." :defer 0.5 :config (typo-global-mode 1) - :hook (((text-mode erc-mode) . typo-mode) - (tex-mode . (lambda ()(typo-mode -1))))) + :hook (((text-mode erc-mode web-mode) . typo-mode) + (tex-mode . (lambda ()(typo-mode -1))))) ;; highlight TODOs in buffers (use-package hl-todo @@ -1672,16 +1756,17 @@ This function is intended for use with `ivy-ignore-buffers'." :defer 0.5 :after eshell :config - (defvar user-@-host (concat (user-login-name) "@" (system-name) " ")) + (defvar user-@-host (concat (user-login-name) "@" (system-name) ":")) (defun +eshell/prompt () - (let ((base/dir (shrink-path-prompt default-directory))) - (concat (propertize user-@-host 'face 'default) - (propertize (car base/dir) - 'face 'font-lock-comment-face) - (propertize (cdr base/dir) - 'face 'font-lock-constant-face) - (propertize "> " 'face 'default)))) - (setq eshell-prompt-regexp (concat user-@-host ".*> ") + (concat (propertize user-@-host 'face 'default) + (propertize (abbreviate-file-name default-directory) + 'face 'font-lock-comment-face) + (propertize "\n" 'face 'default) + (if (= (user-uid) 0) + (propertize "#" 'face 'red) + (propertize "$" 'face 'default)) + (propertize " " 'face 'default))) + (setq eshell-prompt-regexp "\\(.*\n\\)*[$#] " eshell-prompt-function #'+eshell/prompt)) (use-package eshell-up @@ -1807,6 +1892,7 @@ This function is intended for use with `ivy-ignore-buffers'." ;; (use-package fill-column-indicator) (use-package emojify + :disabled :hook (erc-mode . emojify-mode)) (use-feature window @@ -1849,6 +1935,14 @@ This function is intended for use with `ivy-ignore-buffers'." :config (pdf-tools-install nil t) :custom (pdf-view-resize-factor 1.05)) +(use-package org-pdftools + :straight (:host github :repo "fuxialexander/org-pdftools") + :demand + :after org + :config + (with-eval-after-load 'org + (require 'org-pdftools))) + (use-package biblio) (use-feature reftex @@ -1873,12 +1967,27 @@ This function is intended for use with `ivy-ignore-buffers'." :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)) + +(use-package nnreddit + :disabled + :demand + :after gnus + :custom + (nnreddit-python-command "python3")) + ;;; Email (with Gnus) @@ -1919,9 +2028,9 @@ This function is intended for use with `ivy-ignore-buffers'." ;; (: gnus-group-split-fancy "INBOX" t "INBOX") ;; gnu (list ".*<\\(.*\\)\\.\\(non\\)?gnu\\.org>.*" "l.\\1") - ;; *@lists.sr.ht, omitting one dot if present - ;; add more \\.?\\([^.@]*\\) if needed - (list ".*<~\\(.*\\)/\\([^.@]*\\)\\.?\\([^.@]*\\)@lists.sr.ht>.*" "l.~\\1.\\2\\3") + ;; *.lists.sr.ht, omitting one dot if present + ;; add more \\.?\\([^.]*\\) if needed + (list ".*<~\\(.*\\)/\\([^.]*\\)\\.?\\([^.]*\\)\\.lists.sr.ht>.*" "l.~\\1.\\2\\3") ;; webmasters (from "webmasters\\(-comment\\)?@gnu\\.org" "webmasters") ;; other @@ -1957,7 +2066,7 @@ This function is intended for use with `ivy-ignore-buffers'." (nnimap-server-port 143) (nnimap-authenticator plain) (nnimap-user "abandali@csc.uw.local"))) - gnus-message-archive-group "nnimap+shemshak:Sent" + gnus-message-archive-group "nnimap+gnu:INBOX" gnus-parameters '(("l\\.atreus" (to-address . "atreus@freelists.org") @@ -2178,25 +2287,26 @@ Computer Science Club, University of Waterloo https://csclub.uwaterloo.ca/~abandali") (setq gnus-posting-styles '((".*" + (address "bandali@gnu.org") + (signature b/gnu-signature) + (eval (set (make-local-variable 'message-user-fqdn) "fencepost.gnu.org"))) + ("nnimap\\+shemshak:.*" (address "amin@shemshak.org") (body "\nBest,\n") (signature b/signature) + (gcc "nnimap+shemshak:Sent") (eval (setq b/message-cite-say-hi t))) - ("nnimap\\+gnu:.*" - (address "bandali@gnu.org") - (signature b/gnu-signature) - (eval (set (make-local-variable 'message-user-fqdn) "fencepost.gnu.org"))) ((header "subject" "ThankCRM") (to "webmasters-comment@gnu.org") (body "") (eval (setq b/message-cite-say-hi nil))) ("nnimap\\+uw:.*" - (address "abandali@uwaterloo.ca") + (address "bandali@uwaterloo.ca") (signature b/uw-signature)) ("nnimap\\+uw:INBOX" (gcc "\"nnimap+uw:Sent Items\"")) ("nnimap\\+csc:.*" - (address "abandali@csclub.uwaterloo.ca") + (address "bandali@csclub.uwaterloo.ca") (signature b/csc-signature) (gcc "nnimap+csc:Sent"))))) @@ -2274,7 +2384,7 @@ https://csclub.uwaterloo.ca/~abandali") message-subscribed-address-functions '(gnus-find-subscribed-addresses) message-dont-reply-to-names - "\\(\\(\\(amin\\|mab\\)@shemshak\\.org\\)\\|\\(amin@bndl\\.org\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(bandali\\|mab\\|aminb?\\)@gnu\\.org\\)\\|\\(a\\(min\\.\\)?bandali@uwaterloo\\.ca\\)\\|\\(abandali@csclub\\.uwaterloo\\.ca\\)\\)") + "\\(\\(\\(amin\\|mab\\)@shemshak\\.org\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(bandali\\|mab\\|aminb?\\)@gnu\\.org\\)\\|\\(a?bandali@\\(csclub\\.\\)?uwaterloo\\.ca\\)\\)") (require 'company-ebdb) :hook (;; (message-setup . mml-secure-message-sign-pgpmime) (message-mode . flyspell-mode) @@ -2345,7 +2455,7 @@ https://csclub.uwaterloo.ca/~abandali") (use-feature ebdb-mua :demand :after ebdb - :custom (ebdb-mua-pop-up nil)) + :custom (ebdb-mua-pop-up t)) ;; (use-package ebdb-message ;; :after ebdb) @@ -2415,80 +2525,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 @@ -2510,6 +2547,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))