X-Git-Url: https://git.shemshak.org/gitweb.cgi/~bandali/configs/blobdiff_plain/dc12958b6b3c102be0e71dbb614705649ff1f206..2b3c93ec75a0c69ba421bd11260cd46cac70b536:/.emacs.d/init.el?ds=inline diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 1ae2600..4002d9a 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -471,14 +471,16 @@ For disabling the behaviour for certain buffers and/or modes." org-startup-folded 'content org-catch-invisible-edits 'show-and-error org-log-done 'time) + (when (version< org-version "9.3") + (setq org-email-link-description-format + org-link-email-description-format)) (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t) (add-to-list 'org-modules 'org-habit) :bind (("C-c a o a" . org-agenda) :map org-mode-map ("M-L" . org-insert-last-stored-link) - ("M-O" . org-toggle-link-display) - ("s-T" . org-todo)) + ("M-O" . org-toggle-link-display)) :hook ((org-mode . org-indent-mode) (org-mode . auto-fill-mode) (org-mode . flyspell-mode)) @@ -557,14 +559,19 @@ For disabling the behaviour for certain buffers and/or modes." ;; *the* right way to do git (use-package magit :defer 0.5 - :bind (("C-x g" . magit-status) - ("s-g s" . magit-status) - ("s-g l" . magit-log-buffer-file)) + :bind (("C-c g g" . magit-status) + ("C-c g s" . magit-status) + ("C-c g b" . magit-blame-addition) + ("C-c g l" . magit-log-buffer-file)) :config (magit-add-section-hook 'magit-status-sections-hook 'magit-insert-modules 'magit-insert-stashes 'append) + ;; (magit-add-section-hook 'magit-status-sections-hook + ;; 'magit-insert-ignored-files + ;; 'magit-insert-untracked-files + ;; 'append) (setq magit-repository-directories '(("~/" . 0) ("~/src/git/" . 1))) (nconc magit-section-initial-visibility-alist @@ -605,6 +612,19 @@ For disabling the behaviour for certain buffers and/or modes." ivy-use-virtual-buffers t ivy-virtual-abbreviate 'abbreviate ivy-count-format "%d/%d ") + + (defvar b/ivy-ignore-buffer-modes '(magit-mode erc-mode dired-mode)) + (defun b/ivy-ignore-buffer-p (str) + "Return non-nil if str names a buffer with a major mode +derived from one of `b/ivy-ignore-buffer-modes'. + +This function is intended for use with `ivy-ignore-buffers'." + (let* ((buf (get-buffer str)) + (mode (and buf (buffer-local-value 'major-mode buf)))) + (and mode + (apply #'provided-mode-derived-p mode b/ivy-ignore-buffer-modes)))) + (add-to-list 'ivy-ignore-buffers 'b/ivy-ignore-buffer-p) + (ivy-mode 1) ;; :custom-face ;; (ivy-minibuffer-match-face-2 ((t (:background "#e99ce8" :weight semi-bold)))) @@ -623,12 +643,11 @@ For disabling the behaviour for certain buffers and/or modes." :delight :bind (([remap execute-extended-command] . counsel-M-x) ([remap find-file] . counsel-find-file) - ("C-c x" . counsel-M-x) + ("C-c b b" . ivy-switch-buffer) ("C-c f ." . counsel-find-file) ("C-c f l" . counsel-find-library) ("C-c f r" . counsel-recentf) - ("s-." . counsel-find-file) - ("s-r" . ivy-switch-buffer) + ("C-c x" . counsel-M-x) :map minibuffer-local-map ("C-r" . counsel-minibuffer-history)) :config @@ -644,7 +663,6 @@ For disabling the behaviour for certain buffers and/or modes." ("C-x C-b" . helm-buffers-list) ("C-x C-f" . helm-find-files) ("C-h r" . helm-info-emacs) - ("s-r" . helm-recentf) ("C-s-r" . helm-resume) :map helm-map ("" . helm-execute-persistent-action) @@ -761,6 +779,7 @@ For disabling the behaviour for certain buffers and/or modes." :hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default")))) (use-package outline + :disabled :hook (prog-mode . outline-minor-mode) :delight (outline-minor-mode " outl") :bind @@ -1208,8 +1227,8 @@ For disabling the behaviour for certain buffers and/or modes." 'org-mode b/org-mode-font-lock-keywords t)) (bind-keys - ("s-t d" . b/lights-off) - ("s-t l" . b/lights-on)) + ("C-c t d" . b/lights-off) + ("C-c t l" . b/lights-on)) ;;; Emacs enhancements & auxiliary packages @@ -1238,15 +1257,12 @@ For disabling the behaviour for certain buffers and/or modes." "C-c a e" "erc" "C-c a o" "org" "C-c a s" "shells" - "C-c p" "package-management" - ;; "C-c p e" "package-management/epkg" - "C-c p s" "straight.el" - "C-c psa" "all" - "C-c psp" "package" + "C-c b" "buffers" "C-c c" "compile-and-comments" "C-c e" "eval" "C-c f" "files" "C-c F" "frames" + "C-c g" "magit" "C-S-h" "help(ful)" "C-c m" "multiple-cursors" "C-c P" "projectile" @@ -1254,9 +1270,9 @@ For disabling the behaviour for certain buffers and/or modes." "C-c P x" "projectile/execute" "C-c P 4" "projectile/other-window" "C-c q" "boxquote" - "s-g" "magit" - "s-O" "outline" - "s-t" "themes") + "C-c t" "themes" + ;; "s-O" "outline" + ) ;; prefixes for major modes (which-key-add-major-mode-key-based-replacements 'message-mode @@ -1383,7 +1399,8 @@ For disabling the behaviour for certain buffers and/or modes." :delight " typo" :config (typo-global-mode 1) - :hook ((text-mode erc-mode) . typo-mode)) + :hook (((text-mode erc-mode) . typo-mode) + (tex-mode . (lambda ()(typo-mode -1))))) ;; highlight TODOs in buffers (use-package hl-todo @@ -1501,6 +1518,7 @@ For disabling the behaviour for certain buffers and/or modes." (add-to-list 'yas-snippet-dirs "~/src/git/guix/etc/snippets" t) (yas-reload-all) (setq yas-verbosity yas-verbosity-cur) + (define-key yas-minor-mode-map (kbd "SPC") yas-maybe-expand) (yas-global-mode)) (use-package debbugs) @@ -1528,25 +1546,25 @@ For disabling the behaviour for certain buffers and/or modes." (use-package window :bind - (("s-o" . other-window) - ("s-/ ." . split-window-right) - ("s-/ ," . split-window-below) - ("s-/ 0" . delete-window) - ("s-q" . delete-window)) + (("C-c w " . split-window-right) + ("C-c w " . split-window-below) + ("C-c w s l" . split-window-right) + ("C-c w s j" . split-window-below) + ("C-c w q" . quit-window)) :custom (split-width-threshold 150)) (use-package windmove :defer 0.6 :bind - (("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))) + (("C-c w h" . windmove-left) + ("C-c w j" . windmove-down) + ("C-c w k" . windmove-up) + ("C-c w l" . windmove-right) + ("C-c w H" . windmove-swap-states-left) + ("C-c w J" . windmove-swap-states-down) + ("C-c w K" . windmove-swap-states-up) + ("C-c w L" . windmove-swap-states-right))) (use-package pass :commands pass @@ -1561,6 +1579,23 @@ For disabling the behaviour for certain buffers and/or modes." (use-package biblio) +(use-package reftex + :hook (latex-mode . reftex-mode)) + +(use-package reftex-cite + :after reftex + :disabled ; enable to disable + ; reftex-cite's default choice + ; of previous word + :config + (defun reftex-get-bibkey-default () + "If the cursor is in a citation macro, return the word before the macro." + (let* ((macro (reftex-what-macro 1))) + (save-excursion + (when (and macro (string-match "cite" (car macro))) + (goto-char (cdr macro))) + (reftex-this-word))))) + ;;; Email (with Gnus) @@ -1574,8 +1609,10 @@ For disabling the behaviour for certain buffers and/or modes." read-mail-command 'gnus) (use-package gnus - :bind (("s-m" . gnus) - ("s-M" . gnus-unplugged)) + :bind (("s-m" . gnus) + ("s-M" . gnus-unplugged) + ("C-c a m" . gnus) + ("C-c a M" . gnus-unplugged)) :init (setq gnus-select-method '(nnnil "") @@ -1598,19 +1635,23 @@ For disabling the behaviour for certain buffers and/or modes." ;; (: gnus-registry-split-fancy-with-parent) ;; (: gnus-group-split-fancy "INBOX" t "INBOX") ;; gnu - (list "\\(.*\\).\\(non\\)?gnu.org" "l.\\1") + (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") ;; webmasters (from "webmasters\\(-comment\\)?@gnu\\.org" "webmasters") - ;; haskell - (list ".*haskell-art.we.lurk.org" "l.haskell.art") - (list ".*haskell-cafe.haskell.org" "l.haskell.cafe") ;; other (list ".*atreus.freelists.org" "l.atreus") (list ".*deepspec.lists.cs.princeton.edu" "l.deepspec") - (list ".*notmuch.notmuchmail.org" "l.notmuch") - (list ".*dev.lists.parabola.nu" "l.parabola-dev") - ;; *@lists.sr.ht - (list ".*~\\(.*\\)/\\(.*\\)@lists.sr.ht" "l.~\\1.\\2") + ;; (list ".*haskell-art.we.lurk.org" "l.haskell.art") ;d + (list ".*haskell-cafe.haskell.org" "l.haskell-cafe") + ;; (list ".*notmuch.notmuchmail.org" "l.notmuch") ;u + ;; (list ".*dev.lists.parabola.nu" "l.parabola-dev") ;u + ;; ---------------------------------- + ;; legend: (u)nsubscribed | (d)ead + ;; ---------------------------------- + ;; otherwise, leave mail in INBOX "INBOX"))) (nnimap "uw" (nnimap-stream plain) @@ -1623,8 +1664,8 @@ For disabling the behaviour for certain buffers and/or modes." (nnimap-split-fancy (| ;; (: gnus-registry-split-fancy-with-parent) ;; se212-f19 - ("subject" "SE\\s-?212" "course.se463-s19") - (from "SE\\s-?212" "course.se463-s19") + ("subject" "SE\\s-?212" "course.se212-f19") + (from "SE\\s-?212" "course.se212-f19") ;; catch-all "INBOX"))) (nnimap "csc" @@ -1679,7 +1720,7 @@ For disabling the behaviour for certain buffers and/or modes." (to-address . "gnewsense-dev@nongnu.org") (to-list . "gnewsense-dev@nongnu.org") (list-identifier . "\\[Gnewsense-dev\\]")) - ("l\\.gnewsense-dev" + ("l\\.gnewsense-users" (to-address . "gnewsense-users@nongnu.org") (to-list . "gnewsense-users@nongnu.org") (list-identifier . "\\[gNewSense-users\\]")) @@ -1782,6 +1823,12 @@ For disabling the behaviour for certain buffers and/or modes." (require 'ebdb-mua) (require 'ebdb-gnus) + (when (version< emacs-version "27") + (add-to-list + 'nnmail-split-abbrev-alist + '(list . "list-id\\|list-post\\|x-mailing-list\\|x-beenthere\\|x-loop") + t)) + ;; (gnus-registry-initialize) (with-eval-after-load 'recentf @@ -2049,7 +2096,7 @@ https://csclub.uwaterloo.ca/~abandali") ;;; IRC (with ERC and ZNC) (use-package erc - :bind (("C-c a e b" . erc-switch-to-buffer) + :bind (("C-c b e" . erc-switch-to-buffer) :map erc-mode-map ("M-a" . erc-track-switch-buffer)) :custom @@ -2061,9 +2108,6 @@ https://csclub.uwaterloo.ca/~abandali") (erc-server-reconnect-attempts 5) (erc-server-reconnect-timeout 3) :config - (with-eval-after-load 'ivy - ;; ignore channel buffer names - (add-to-list 'ivy-ignore-buffers "^#")) (defun erc-cmd-OPME () "Request chanserv to op me." (erc-message "PRIVMSG" @@ -2077,7 +2121,80 @@ 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)) + (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)))))))) (use-package erc-fill :after erc @@ -2093,6 +2210,8 @@ https://csclub.uwaterloo.ca/~abandali") (use-package erc-track :after erc + :bind (("C-c a e t d" . erc-track-disable) + ("C-c a e t e" . erc-track-enable)) :custom (erc-track-enable-keybindings nil) (erc-track-exclude-types '("JOIN" "MODE" "NICK" "PART" "QUIT"