emacs: add reftex
[~bandali/configs] / .emacs.d / init.el
index a19fcaa..6c17967 100644 (file)
@@ -414,6 +414,10 @@ For disabling the behaviour for certain buffers and/or modes."
   :custom ((ediff-window-setup-function 'ediff-setup-windows-plain)
            (ediff-split-window-function 'split-window-horizontally)))
 
+;; i don't feel like jumping out of my chair every now and again; so
+;; don't BEEP! at me, emacs
+(setq ring-bell-function 'ignore)
+
 \f
 ;;; General bindings
 
@@ -467,6 +471,9 @@ 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
@@ -619,12 +626,12 @@ 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)
+         ("C-c x"                          . counsel-M-x)
          ("s-."                            . counsel-find-file)
-         ("s-r"                            . ivy-switch-buffer)
          :map minibuffer-local-map
          ("C-r" . counsel-minibuffer-history))
   :config
@@ -1154,6 +1161,12 @@ For disabling the behaviour for certain buffers and/or modes."
   :hook
   (po-mode . (lambda () (run-with-timer 0.1 nil 'View-exit))))
 
+(use-package tex-mode
+  :config
+  (cl-delete-if
+   (lambda (p) (string-match "^---?" (car p)))
+   tex--prettify-symbols-alist))
+
 \f
 ;;; Theme
 
@@ -1549,6 +1562,25 @@ For disabling the behaviour for certain buffers and/or modes."
               ("M-RET" . image-previous-line))
   :config (pdf-tools-install nil t))
 
+(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)))))
+
 \f
 ;;; Email (with Gnus)
 
@@ -1586,45 +1618,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 ".*emacs-devel.gnu.org" "l.gnu.emacs.devel")
-                                 (list ".*help-gnu-emacs.gnu.org" "l.gnu.emacs.help")
-                                 (list ".*info-gnu-emacs.gnu.org" "l.gnu.emacs.info")
-                                 (list ".*emacs-orgmode.gnu.org" "l.gnu.emacs.orgmode")
-                                 (list ".*emacs-tangents.gnu.org" "l.gnu.emacs.tangents")
-                                 (list ".*emacsconf-discuss.gnu.org" "l.gnu.emacsconf.discuss")
-                                 (list ".*emacsconf-register.gnu.org" "l.gnu.emacsconf.register")
-                                 (list ".*emacsconf-submit.gnu.org" "l.gnu.emacsconf.submit")
-                                 (list ".*fencepost-users.gnu.org" "l.gnu.fencepost.users")
-                                 (list ".*gnunet-developers.gnu.org" "l.gnu.gnunet.developers")
-                                 (list ".*help-gnunet.gnu.org" "l.gnu.gnunet.help")
-                                 (list ".*bug-gnuzilla.gnu.org" "l.gnu.gnuzilla.bug")
-                                 (list ".*gnuzilla-dev.gnu.org" "l.gnu.gnuzilla.dev")
-                                 (list ".*guile-devel.gnu.org" "l.gnu.guile.devel")
-                                 (list ".*guile-user.gnu.org" "l.gnu.guile.user")
-                                 (list ".*guix-devel.gnu.org" "l.gnu.guix.devel")
-                                 (list ".*help-guix.gnu.org" "l.gnu.guix.help")
-                                 (list ".*info-guix.gnu.org" "l.gnu.guix.info")
-                                 (list ".*savannah-hackers-public.gnu.org" "l.gnu.savannah.hackers.public")
-                                 (list ".*savannah-users.gnu.org" "l.gnu.savannah.users")
-                                 (list ".*www-commits.gnu.org" "l.gnu.www.commits")
-                                 (list ".*www-discuss.gnu.org" "l.gnu.www.discuss")
+                                 (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 ".*~bandali/public-inbox@lists.sr.ht" "l.~bandali.public-inbox")
-                                 (list ".*~sircmpwn/free-writers-club@lists.sr.ht" "l.~sircmpwn.free-writers-club")
-                                 (list ".*~sircmpwn/sr.ht-admins@lists.sr.ht" "l.~sircmpwn.srht.admins")
-                                 (list ".*~sircmpwn/sr.ht-announce@lists.sr.ht" "l.~sircmpwn.srht.announce")
-                                 (list ".*~sircmpwn/sr.ht-dev@lists.sr.ht" "l.~sircmpwn.srht.dev")
-                                 (list ".*~sircmpwn/sr.ht-discuss@lists.sr.ht" "l.~sircmpwn.srht.discuss")
+                                 ;; (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)
@@ -1636,9 +1646,9 @@ For disabling the behaviour for certain buffers and/or modes."
              (nnimap-split-methods 'nnimap-split-fancy)
              (nnimap-split-fancy (|
                                   ;; (: gnus-registry-split-fancy-with-parent)
-                                  ;; se463-s19
-                                  ("subject" "\\(SE\\s-?463\\|Deliverable\\)" "course.se463-s19")
-                                  (from "\\(SE\\s-?463\\|Gema\\|Hemant\\|Davood\\|Camilo\\|Reza\\|Michael\\|Sandy\\)" "course.se463-s19")
+                                  ;; se212-f19
+                                  ("subject" "SE\\s-?212" "course.se212-f19")
+                                  (from "SE\\s-?212" "course.se212-f19")
                                   ;; catch-all
                                   "INBOX")))
      (nnimap "csc"
@@ -1656,90 +1666,102 @@ For disabling the behaviour for certain buffers and/or modes."
       (to-address . "deepspec@lists.cs.princeton.edu")
       (to-list    . "deepspec@lists.cs.princeton.edu")
       (list-identifier . "\\[deepspec\\]"))
-     ("l\\.gnu\\.emacs\\.devel"
+     ("l\\.emacs-devel"
       (to-address . "emacs-devel@gnu.org")
       (to-list    . "emacs-devel@gnu.org"))
-     ("l\\.gnu\\.emacs\\.help"
+     ("l\\.help-gnu-emacs"
       (to-address . "help-gnu-emacs@gnu.org")
       (to-list    . "help-gnu-emacs@gnu.org"))
-     ("l\\.gnu\\.emacs\\.info"
+     ("l\\.info-gnu-emacs"
       (to-address . "info-gnu-emacs@gnu.org")
       (to-list    . "info-gnu-emacs@gnu.org"))
-     ("l\\.gnu\\.emacs\\.orgmode"
+     ("l\\.emacs-orgmode"
       (to-address . "emacs-orgmode@gnu.org")
       (to-list    . "emacs-orgmode@gnu.org")
       (list-identifier . "\\[O\\]"))
-     ("l\\.gnu\\.emacs\\.tangents"
+     ("l\\.emacs-tangents"
       (to-address . "emacs-tangents@gnu.org")
       (to-list    . "emacs-tangents@gnu.org"))
-     ("l\\.gnu\\.emacsconf\\.discuss"
+     ("l\\.emacsconf-discuss"
       (to-address . "emacsconf-discuss@gnu.org")
       (to-list    . "emacsconf-discuss@gnu.org"))
-     ("l\\.gnu\\.emacsconf\\.register"
+     ("l\\.emacsconf-register"
       (to-address . "emacsconf-register@gnu.org")
       (to-list    . "emacsconf-register@gnu.org"))
-     ("l\\.gnu\\.emacsconf\\.submit"
+     ("l\\.emacsconf-submit"
       (to-address . "emacsconf-submit@gnu.org")
       (to-list    . "emacsconf-submit@gnu.org"))
-     ("l\\.gnu\\.fencepost\\.users"
+     ("l\\.fencepost-users"
       (to-address . "fencepost-users@gnu.org")
       (to-list    . "fencepost-users@gnu.org")
       (list-identifier . "\\[Fencepost-users\\]"))
-     ("l\\.gnu\\.gnunet\\.developers"
+     ("l\\.gnewsense-art"
+      (to-address . "gnewsense-art@nongnu.org")
+      (to-list    . "gnewsense-art@nongnu.org")
+      (list-identifier . "\\[gNewSense-art\\]"))
+     ("l\\.gnewsense-dev"
+      (to-address . "gnewsense-dev@nongnu.org")
+      (to-list    . "gnewsense-dev@nongnu.org")
+      (list-identifier . "\\[Gnewsense-dev\\]"))
+     ("l\\.gnewsense-users"
+      (to-address . "gnewsense-users@nongnu.org")
+      (to-list    . "gnewsense-users@nongnu.org")
+      (list-identifier . "\\[gNewSense-users\\]"))
+     ("l\\.gnunet-developers"
       (to-address . "gnunet-developers@gnu.org")
       (to-list    . "gnunet-developers@gnu.org")
       (list-identifier . "\\[GNUnet-developers\\]"))
-     ("l\\.gnu\\.gnunet\\.help"
+     ("l\\.help-gnunet"
       (to-address . "help-gnunet@gnu.org")
       (to-list    . "help-gnunet@gnu.org")
       (list-identifier . "\\[Help-gnunet\\]"))
-     ("l\\.gnu\\.gnuzilla\\.bug"
+     ("l\\.bug-gnuzilla"
       (to-address . "bug-gnuzilla@gnu.org")
       (to-list    . "bug-gnuzilla@gnu.org")
       (list-identifier . "\\[Bug-gnuzilla\\]"))
-     ("l\\.gnu\\.gnuzilla\\.dev"
+     ("l\\.gnuzilla-dev"
       (to-address . "gnuzilla-dev@gnu.org")
       (to-list    . "gnuzilla-dev@gnu.org")
       (list-identifier . "\\[Gnuzilla-dev\\]"))
-     ("l\\.gnu\\.guile\\.devel"
+     ("l\\.guile-devel"
       (to-address . "guile-devel@gnu.org")
       (to-list    . "guile-devel@gnu.org"))
-     ("l\\.gnu\\.guile\\.user"
+     ("l\\.guile-user"
       (to-address . "guile-user@gnu.org")
       (to-list    . "guile-user@gnu.org"))
-     ("l\\.gnu\\.guix\\.devel"
+     ("l\\.guix-devel"
       (to-address . "guix-devel@gnu.org")
       (to-list    . "guix-devel@gnu.org"))
-     ("l\\.gnu\\.guix\\.help"
+     ("l\\.help-guix"
       (to-address . "help-guix@gnu.org")
       (to-list    . "help-guix@gnu.org"))
-     ("l\\.gnu\\.guix\\.info"
+     ("l\\.info-guix"
       (to-address . "info-guix@gnu.org")
       (to-list    . "info-guix@gnu.org"))
-     ("l\\.gnu\\.savannah\\.hackers\\.public"
+     ("l\\.savannah-hackers-public"
       (to-address . "savannah-hackers-public@gnu.org")
       (to-list    . "savannah-hackers-public@gnu.org"))
-     ("l\\.gnu\\.savannah\\.users"
+     ("l\\.savannah-users"
       (to-address . "savannah-users@gnu.org")
       (to-list    . "savannah-users@gnu.org"))
-     ("l\\.gnu\\.www\\.commits"
+     ("l\\.www-commits"
       (to-address . "www-commits@gnu.org")
       (to-list    . "www-commits@gnu.org"))
-     ("l\\.gnu\\.www\\.discuss"
+     ("l\\.www-discuss"
       (to-address . "www-discuss@gnu.org")
       (to-list    . "www-discuss@gnu.org"))
-     ("l\\.haskell\\.art"
+     ("l\\.haskell-art"
       (to-address . "haskell-art@we.lurk.org")
       (to-list    . "haskell-art@we.lurk.org")
       (list-identifier . "\\[haskell-art\\]"))
-     ("l\\.haskell\\.cafe"
+     ("l\\.haskell-cafe"
       (to-address . "haskell-cafe@haskell.org")
       (to-list    . "haskell-cafe@haskell.org")
       (list-identifier . "\\[Haskell-cafe\\]"))
      ("l\\.notmuch"
       (to-address . "notmuch@notmuchmail.org")
       (to-list    . "notmuch@notmuchmail.org"))
-     ("l\\.parabola\\.dev"
+     ("l\\.parabola-dev"
       (to-address . "dev@lists.parabola.nu")
       (to-list    . "dev@lists.parabola.nu")
       (list-identifier . "\\[Dev\\]"))
@@ -1749,16 +1771,16 @@ For disabling the behaviour for certain buffers and/or modes."
      ("l\\.~sircmpwn\\.free-writers-club"
       (to-address . "~sircmpwn/free-writers-club@lists.sr.ht")
       (to-list    . "~sircmpwn/free-writers-club@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.srht\\.admins"
+     ("l\\.~sircmpwn\\.srht-admins"
       (to-address . "~sircmpwn/sr.ht-admins@lists.sr.ht")
       (to-list    . "~sircmpwn/sr.ht-admins@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.srht\\.announce"
+     ("l\\.~sircmpwn\\.srht-announce"
       (to-address . "~sircmpwn/sr.ht-announce@lists.sr.ht")
       (to-list    . "~sircmpwn/sr.ht-announce@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.srht\\.dev"
+     ("l\\.~sircmpwn\\.srht-dev"
       (to-address . "~sircmpwn/sr.ht-dev@lists.sr.ht")
       (to-list    . "~sircmpwn/sr.ht-dev@lists.sr.ht"))
-     ("l\\.~sircmpwn\\.srht\\.discuss"
+     ("l\\.~sircmpwn\\.srht-discuss"
       (to-address . "~sircmpwn/sr.ht-discuss@lists.sr.ht")
       (to-list    . "~sircmpwn/sr.ht-discuss@lists.sr.ht"))
      ("webmasters"
@@ -1784,6 +1806,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
@@ -1839,15 +1867,15 @@ https://shemshak.org/~amin")
   (defvar b/gnu-signature "Amin Bandali
 Free Software Activist | GNU Webmaster & Volunteer
 GPG: BE62 7373 8E61 6D6D 1B3A  08E8 A21A 0202 4881 6103
-https://bandalis.org")
+https://bandali.eu.org")
   (defvar b/uw-signature "Amin Bandali, MMath Student
 Cheriton School of Computer Science
 University of Waterloo
-https://bandalis.org")
+https://bandali.eu.org")
   (defvar b/csc-signature "Amin Bandali
-Termcom, Computer Science Club
-University of Waterloo
-https://bandalis.org")
+Systems Committee
+Computer Science Club, University of Waterloo
+https://csclub.uwaterloo.ca/~abandali")
   (setq gnus-posting-styles
         '((".*"
            (address "amin@shemshak.org")
@@ -2051,7 +2079,7 @@ https://bandalis.org")
 ;;; 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
@@ -2079,7 +2107,80 @@ https://bandalis.org")
   (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