"Expand filename FILE relative to `b/var-dir'."
(expand-file-name (convert-standard-filename file) b/var-dir))
-(setq auto-save-list-file-prefix (b/var "auto-save/sessions/"))
+(setq
+ auto-save-list-file-prefix (b/var "auto-save/sessions/")
+ nsm-settings-file (b/var "nsm-settings.el"))
;; separate custom file (don't want it mixing with init.el)
(use-package custom
: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
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))
:custom
+ (org-pretty-entities t)
(org-agenda-files '("~/usr/org/todos/personal.org"
"~/usr/org/todos/habits.org"
- "~/usr/org/todos/masters.org"))
+ "~/src/git/masters-thesis/todo.org"))
(org-agenda-start-on-weekday 0)
(org-agenda-time-leading-zero t)
(org-habit-graph-column 44)
;; *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-x g g" . magit-status)
+ ("C-x g s" . magit-status)
+ ("C-x g b" . magit-blame-addition)
+ ("C-x g l" . magit-log-buffer-file))
:config
(magit-add-section-hook 'magit-status-sections-hook
'magit-insert-modules
(nconc magit-section-initial-visibility-alist
'(([unpulled status] . show)
([unpushed status] . show)))
+ (setq transient-history-file (b/var "transient/history.el")
+ transient-levels-file (b/etc "transient/levels.el")
+ transient-values-file (b/etc "transient/values.el"))
:custom (magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)
:custom-face (magit-diff-file-heading ((t (:weight normal)))))
(recentf-save-file (b/var "recentf-save.el")))
;; smart M-x enhancement (needed by counsel for history)
-(use-package smex)
+(use-package smex
+ :config
+ (setq smex-save-file (b/var "smex-save.el")))
(use-package ivy
:defer 0.3
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))))
: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
("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
("<tab>" . helm-execute-persistent-action)
: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
(eclim-executable "~/.p2/pool/plugins/org.eclim_2.8.0/bin/eclim")
(eclim-eclipse-dirs '("~/usr/eclipse/dsl-2018-09/eclipse"))))
-(use-package geiser)
+(use-package geiser
+ :config
+ (make-directory (b/var "geiser/") t)
+ (setq geiser-repl-history-filename (b/var "geiser/repl-history")))
(use-package geiser-guile
:config
: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
'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))
\f
;;; Emacs enhancements & auxiliary packages
"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 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"
+ "C-x g" "magit")
;; prefixes for major modes
(which-key-add-major-mode-key-based-replacements 'message-mode
("C-c j" . crux-top-join-line)
("C-S-j" . crux-top-join-line)))
-(comment
- ;; TODO
- (use-package mwim
- :bind (("C-a" . mwim-beginning-of-code-or-line)
- ("C-e" . mwim-end-of-code-or-line)
- ("<home>" . mwim-beginning-of-line-or-code)
- ("<end>" . mwim-end-of-line-or-code))))
+(use-package mwim
+ :bind (("C-a" . mwim-beginning-of-code-or-line)
+ ("C-e" . mwim-end-of-code-or-line)
+ ("<home>" . mwim-beginning-of-line-or-code)
+ ("<end>" . mwim-end-of-line-or-code)))
(use-package projectile
:defer 0.5
:bind-keymap ("C-c P" . projectile-command-map)
:config
+ (make-directory (b/var "projectile/") t)
(projectile-mode)
(defun b/projectile-mode-line-fun ()
(advice-add 'magit-branch-and-checkout
:after #'my-projectile-invalidate-cache)))
:custom
+ (projectile-cache-file (b/var "projectile/cache.el"))
(projectile-completion-system 'ivy)
+ (projectile-known-projects-file (b/var "projectile/known-projects.el"))
(projectile-mode-line-prefix " proj"))
(use-package helpful
("C-S-h k" . helpful-key)
("C-S-h p" . helpful-at-point)))
-(comment
- ;; TODO
- (use-package unkillable-scratch
- :defer 0.6
- :config
- (unkillable-scratch 1)
- :custom
- (unkillable-buffers '("^\\*scratch\\*$" "^\\*Messages\\*$"))))
+(use-package unkillable-scratch
+ :defer 0.6
+ :config
+ (unkillable-scratch 1)
+ :custom
+ (unkillable-buffers '("^\\*scratch\\*$" "^\\*Messages\\*$")))
-(comment
- ;; TODO
- ;; ,----
- ;; | make pretty boxed quotes like this
- ;; `----
- (use-package boxquote
- :defer 0.6
- :bind
- (:prefix-map b/boxquote-prefix-map
- :prefix "C-c q"
- ("b" . boxquote-buffer)
- ("B" . boxquote-insert-buffer)
- ("d" . boxquote-defun)
- ("F" . boxquote-insert-file)
- ("hf" . boxquote-describe-function)
- ("hk" . boxquote-describe-key)
- ("hv" . boxquote-describe-variable)
- ("hw" . boxquote-where-is)
- ("k" . boxquote-kill)
- ("p" . boxquote-paragraph)
- ("q" . boxquote-boxquote)
- ("r" . boxquote-region)
- ("s" . boxquote-shell-command)
- ("t" . boxquote-text)
- ("T" . boxquote-title)
- ("u" . boxquote-unbox)
- ("U" . boxquote-unbox-region)
- ("y" . boxquote-yank)
- ("M-q" . boxquote-fill-paragraph)
- ("M-w" . boxquote-kill-ring-save))))
+;; ,----
+;; | make pretty boxed quotes like this
+;; `----
+(use-package boxquote
+ :defer 0.6
+ :bind
+ (:prefix-map b/boxquote-prefix-map
+ :prefix "C-c q"
+ ("b" . boxquote-buffer)
+ ("B" . boxquote-insert-buffer)
+ ("d" . boxquote-defun)
+ ("F" . boxquote-insert-file)
+ ("hf" . boxquote-describe-function)
+ ("hk" . boxquote-describe-key)
+ ("hv" . boxquote-describe-variable)
+ ("hw" . boxquote-where-is)
+ ("k" . boxquote-kill)
+ ("p" . boxquote-paragraph)
+ ("q" . boxquote-boxquote)
+ ("r" . boxquote-region)
+ ("s" . boxquote-shell-command)
+ ("t" . boxquote-text)
+ ("T" . boxquote-title)
+ ("u" . boxquote-unbox)
+ ("U" . boxquote-unbox-region)
+ ("y" . boxquote-yank)
+ ("M-q" . boxquote-fill-paragraph)
+ ("M-w" . boxquote-kill-ring-save)))
(use-package orgalist
;; http://lists.gnu.org/archive/html/emacs-orgmode/2019-04/msg00007.html
:config
(global-hl-todo-mode))
-(comment
- ;; TODO
- (use-package shrink-path
- :defer 0.5
- :after eshell
- :config
- (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 ".*> ")
- eshell-prompt-function #'+eshell/prompt)))
+(use-package shrink-path
+ :defer 0.5
+ :after eshell
+ :config
+ (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 ".*> ")
+ eshell-prompt-function #'+eshell/prompt))
(use-package eshell-up
:after eshell
("c" . mc/edit-lines)
("n" . mc/mark-next-like-this)
("p" . mc/mark-previous-like-this)
- ("a" . mc/mark-all-like-this))))
+ ("a" . mc/mark-all-like-this)))
+ :config
+ (setq mc/list-file (b/var "mc-list.el")))
(comment
;; TODO
:config
(defconst yas-verbosity-cur yas-verbosity)
(setq yas-verbosity 2)
+ (setq yas-snippet-dirs (list (b/etc "yasnippet/snippets/")))
(add-to-list 'yas-snippet-dirs "~/src/git/guix/etc/snippets" t)
(yas-reload-all)
(setq yas-verbosity yas-verbosity-cur)
;; (use-package fill-column-indicator)
(use-package emojify
+ :config
+ (make-directory (b/var "emojify/") t)
+ (setq emojify-emojis-dir (b/var "emojify/"))
:hook (erc-mode . emojify-mode))
(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 <right>" . split-window-right)
+ ("C-c w <down>" . 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
:bind ("C-c a p" . pass)
:hook (pass-mode . View-exit))
+(use-package pdf-tools
+ :defer 0.5
+ :bind (:map pdf-view-mode-map
+ ("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)
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 "")
;; (: 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)
(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"
(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\\]"))
("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"
gnus-interactive-exit nil
gnus-gcc-mark-as-read t)
:config
- (comment
- ;; TODO
- (require 'ebdb)
- (require 'ebdb-mua)
- (require 'ebdb-gnus))
+ (require 'ebdb)
+ (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)
(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")
'(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\\)\\)")
- (comment
- ;; TODO
- (require 'company-ebdb))
+ (require 'company-ebdb)
:hook (;; (message-setup . mml-secure-message-sign-pgpmime)
(message-mode . flyspell-mode)
(message-mode . (lambda ()
("r" . footnote-renumber-footnotes)
("s" . footnote-set-style)))
-(comment
- ;; TODO
- (use-package ebdb
- :straight (:host github :repo "girzel/ebdb")
- :after gnus
- :bind (:map gnus-group-mode-map ("e" . ebdb))
- :config
- (setq ebdb-sources (b/var "ebdb"))
- (with-eval-after-load 'swiper
- (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
-
- (use-package ebdb-com
- :after ebdb)
+(use-package ebdb
+ :after gnus
+ :bind (:map gnus-group-mode-map ("e" . ebdb))
+ :config
+ (setq ebdb-sources (b/var "ebdb"))
+ (with-eval-after-load 'swiper
+ (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t)))
- ;; (use-package ebdb-complete
- ;; :after ebdb
- ;; :config
- ;; (ebdb-complete-enable))
+(use-package ebdb-com
+ :after ebdb)
- (use-package company-ebdb
- :config
- (defun company-ebdb--post-complete (_) nil))
+;; (use-package ebdb-complete
+;; :after ebdb
+;; :config
+;; (ebdb-complete-enable))
- (use-package ebdb-gnus
- :after ebdb
- :custom
- (ebdb-gnus-window-configuration
- '(article
- (vertical 1.0
- (summary 0.25 point)
- (horizontal 1.0
- (article 1.0)
- (ebdb-gnus 0.3))))))
-
- (use-package ebdb-mua
- :after ebdb
- ;; :custom (ebdb-mua-pop-up nil)
- )
+(use-package company-ebdb
+ :config
+ (defun company-ebdb--post-complete (_) nil))
- ;; (use-package ebdb-message
- ;; :after ebdb)
+(use-package ebdb-gnus
+ :after ebdb
+ :custom
+ (ebdb-gnus-window-configuration
+ '(article
+ (vertical 1.0
+ (summary 0.25 point)
+ (horizontal 1.0
+ (article 1.0)
+ (ebdb-gnus 0.3))))))
+
+(use-package ebdb-mua
+ :after ebdb
+ ;; :custom (ebdb-mua-pop-up nil)
+ )
+;; (use-package ebdb-message
+;; :after ebdb)
- ;; (use-package ebdb-vcard
- ;; :after ebdb)
- )
+;; (use-package ebdb-vcard
+;; :after ebdb)
-(comment
- ;; TODO
- (use-package message-x))
+(use-package message-x)
(comment
(use-package message-x
;;; 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
(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"
(add-to-list 'erc-modules 'keep-place)
(add-to-list 'erc-modules 'notifications)
(add-to-list 'erc-modules 'spelling)
- (comment
- ;; TODO
- (add-to-list 'erc-modules 'scrolltoplace))
- (erc-update-modules))
+ (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))))))))
(use-package erc-fill
:after erc
(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"
(use-package erc-hl-nicks
:after erc)
-(comment
- ;; TODO
- (use-package erc-scrolltoplace
- :after erc))
+(use-package erc-scrolltoplace
+ :after erc)
(use-package znc
:load-path "lisp/znc.el/"