(setq use-package-always-defer t)
(require 'bind-key)
-(use-package delight)
-
\f
;;; Initial setup
+(defvar b/exwm-p (string= (system-name) "jirud")
+ "Whether or not we will be using `exwm'.")
+
;; keep ~/.emacs.d clean
(use-package no-littering
:demand
(global-auto-revert-non-file-buffers nil))
;; time and battery in mode-line
-(comment
- (use-feature time
- :init
- (setq display-time-default-load-average nil)
- :config
- (display-time-mode))
+(use-feature time
+ :if b/exwm-p
+ :demand
+ :config
+ (display-time-mode)
+ :custom
+ (display-time-default-load-average nil)
+ (display-time-format "%a %b %-e, %-l:%M%P"))
- (use-feature battery
- :config
- (display-battery-mode)))
+(use-feature battery
+ :if b/exwm-p
+ :demand
+ :config
+ (display-battery-mode)
+ :custom
+ (battery-mode-line-format " %p%% %t"))
(use-feature fringe
:demand
:custom
((epg-gpg-program (executable-find "gpg"))))
+(use-feature auth-source
+ :custom
+ (auth-sources '("~/.authinfo.gpg"))
+ (authinfo-hidden (regexp-opt '("password" "client-secret" "token"))))
+
\f
;;; General bindings
;;; Essential packages
(use-package exwm
+ :if b/exwm-p
: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 50 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) 50) exwm-title
- (concat (substring exwm-title 0 49) "...")))))
- (add-hook 'exwm-update-class-hook 'exwm-rename-buffer)
- (add-hook 'exwm-update-title-hook 'exwm-rename-buffer)
+ (if (<= (length exwm-title) 60) exwm-title
+ (concat (substring exwm-title 0 59) "...")))))
+ ;; 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
+ :config
(defun b/exwm-ws-prev-index ()
"Return the index for the previous EXWM workspace, wrapping
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 10)
- (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)
-
- ;; 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-workspace-number 4
+ exwm-input-global-keys
+ `(([?\s-R] . exwm-reset)
+ ([?\s-\\] . exwm-workspace-switch)
+ ([?\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")))
+ ([?\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
([?\M-v] . [prior])
([?\C-v] . [next])
([?\C-d] . [delete])
- ([?\C-k] . [S-end delete])
+ ([?\C-k] . [S-end ?\C-x])
+ ([?\M-<] . C-home)
+ ([?\M->] . C-end)
;; cut/copy/paste
- ;; ([?\C-w] . [?\C-x])
+ ([?\C-w] . [?\C-x])
([?\M-w] . [?\C-c])
([?\C-y] . [?\C-v])
- ;; search
- ([?\C-s] . [?\C-f])))
-
- ;; Enable EXWM
- (exwm-enable)
-
- (add-hook 'exwm-init-hook #'exwm-config--fix/ido-buffer-window-other-frame)
-
- (require 'exwm-systemtray)
- (exwm-systemtray-enable)
-
- (require 'exwm-randr)
+ ([?\M-d] . [C-S-right ?\C-x])
+ ([?\M-\d] . [C-S-left ?\C-x])
+ ;; window
+ ([?\s-w] . [?\C-w])
+ ([?\s-q] . [?\C-q])
+ ;; misc
+ ([?\C-s] . [?\C-f])
+ ([?\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)
+ :custom
+ (exwm-randr-workspace-monitor-plist '(1 "VGA-1")))
- ;; (exwm-input-set-key
- ;; (kbd "s-<return>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process "urxvt" nil "urxvt")))
-
- ;; (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 "<XF86AudioMute>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "pamixer" nil "pamixer --toggle-mute")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioLowerVolume>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "pamixer" nil "pamixer --allow-boost --decrease 5")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioRaiseVolume>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "pamixer" nil "pamixer --allow-boost --increase 5")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioPlay>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "mpc" nil "mpc toggle")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioPrev>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "mpc" nil "mpc prev")))
-
- ;; (exwm-input-set-key
- ;; (kbd "<XF86AudioNext>")
- ;; (lambda ()
- ;; (interactive)
- ;; (start-process-shell-command "mpc" nil "mpv next")))
+(use-feature exwm-systemtray
+ :demand
+ :after exwm
+ :config
+ (exwm-systemtray-enable))
- (comment
- (defun b/exwm-pasystray ()
- "A command used to start pasystray."
- (interactive)
- (if (executable-find "pasystray")
- (progn
- (message "EXWM: starting pasystray ...")
- (start-process-shell-command "pasystray" nil "pasystray --notify=all"))
- (message "EXWM: pasystray is not installed, abort!")))
- (add-hook 'exwm-init-hook #'b/exwm-pasystray))
-
- (defun b/exwm-nm-applet ()
- "A command used to start nm-applet."
- (interactive)
- (if (executable-find "nm-applet")
- (progn
- (message "EXWM: starting nm-applet ...")
- (start-process-shell-command "nm-applet" nil "nm-applet"))
- (message "EXWM: nm-applet is not installed, abort!")))
- (add-hook 'exwm-init-hook #'b/exwm-nm-applet)
-
- (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))))
+(use-feature exwm-workspace)
+
+(use-package exwm-edit
+ :demand
+ :after exwm)
;; use the org-plus-contrib package to get the whole deal
(use-package org-plus-contrib)
(use-package ivy
:defer 0.3
- :delight ;; " ๐"
:bind
(:map ivy-minibuffer-map
([escape] . keyboard-escape-quit)
(use-package counsel
:after ivy
- :delight
:bind (([remap execute-extended-command] . counsel-M-x)
([remap find-file] . counsel-find-file)
("C-c b b" . ivy-switch-buffer)
(or
(name . "^\\*scratch\\*$")
(name . "^\\*Messages\\*$")))
+ ("exwm" (mode . exwm-mode))
("erc" (mode . erc-mode)))))
(ibuffer-formats
'((mark modified read-only locked " "
- (name 18 18 :left :elide)
+ (name 72 72 :left :elide)
" "
(size-h 9 -1 :right)
" "
(use-feature outline
:disabled
:hook (prog-mode . outline-minor-mode)
- :delight (outline-minor-mode " outl")
:bind
(:map
outline-minor-mode-map
(use-feature dired
:config
- (setq dired-listing-switches "-alh"
+ (setq dired-dwim-target t
+ dired-listing-switches "-alh"
ls-lisp-use-insert-directory-program nil)
;; easily diff 2 marked files
;; display Lisp objects at point in the echo area
(use-feature eldoc
:when (version< "25" emacs-version)
- :delight " eldoc"
:config (global-eldoc-mode))
;; highlight matching parens
:config (electric-pair-mode))
(use-feature simple
- :delight (auto-fill-function " fill")
:config (column-number-mode)
:custom
;; Save what I copy into clipboard from other applications into Emacs'
(use-package company
:defer 0.6
- :delight " comp"
:bind
(:map company-active-map
([tab] . company-complete-common-or-cycle)
(setq flycheck-check-syntax-automatically '(mode-enabled save))
:custom (flycheck-mode-line-prefix "flyc"))
-(use-feature flyspell
- :delight " flysp")
+(use-feature flyspell)
;; http://endlessparentheses.com/ispell-and-apostrophes.html
(use-feature ispell
#'endless/replace-quote))
(use-feature abbrev
- :delight " abbr"
:hook (text-mode . abbrev-mode))
\f
(add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode))
(use-feature reveal
- :delight (reveal-mode " reveal")
:hook (emacs-lisp-mode . reveal-mode))
-(use-feature elisp-mode
- :delight (emacs-lisp-mode "Elisp" :major))
-
+(use-feature elisp-mode)
(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))
: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\\'")
+
\f
;;; Theme
:commands (sml/apply-theme)
:demand
:config
+ (setq sml/theme 'tangomod)
(sml/setup)
(smart-mode-line-enable))
(use-package doom-themes)
+(use-package solarized-theme
+ :disabled
+ :config
+ (load-theme 'solarized-light t))
+
+(use-package moody
+ :disabled
+ :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))
+
+(use-package mini-modeline
+ :disabled
+ :demand
+ :config (mini-modeline-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 'tangomod)
(font-lock-remove-keywords
- 'org-mode b/org-mode-font-lock-keywords))
+ 'org-mode b/org-mode-font-lock-keywords)
+ (when (featurep 'exwm-systemtray)
+ (exwm-systemtray--refresh)))
(defun b/lights-off ()
"Go dark."
(interactive)
(mapc #'disable-theme custom-enabled-themes)
- (load-theme 'doom-tomorrow-night t)
+ (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)
+ (when (featurep 'exwm-systemtray)
+ (exwm-systemtray--refresh)))
(bind-keys
("C-c t d" . b/lights-off)
(use-package which-key
:defer 0.4
- :delight
:config
(which-key-add-key-based-replacements
;; prefixes for global prefixes and minor modes
;; easily type pretty quotes & other typography, like โโโโ-โโยซยปโนโบ
(use-package typo
:defer 0.5
- :delight " typo"
: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
: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
(use-package page-break-lines
:defer 0.5
- :delight " pgln"
:custom
(page-break-lines-max-width fill-column)
:config
("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
;; (use-package fill-column-indicator)
(use-package emojify
+ :disabled
:hook (erc-mode . emojify-mode))
(use-feature window
("<C-XF86Forward>" . pdf-history-forward)
("<mouse-9>" . pdf-history-forward)
("<drag-mouse-9>" . pdf-history-forward)
- ("M-RET" . image-previous-line))
+ ("M-RET" . image-previous-line)
+ ("C-s" . isearch-forward)
+ ("s s" . isearch-forward))
: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
(goto-char (cdr macro)))
(reftex-this-word)))))
+(use-package minions
+ :demand
+ :config (minions-mode))
+
+(use-package dmenu
+ :custom
+ (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"))
+
\f
;;; Email (with Gnus)
gnus-select-method '(nnnil "")
gnus-secondary-select-methods
'((nnimap "shemshak"
- (nnimap-stream plain)
- (nnimap-address "127.0.0.1")
- (nnimap-server-port 143)
- (nnimap-authenticator plain)
- (nnimap-user "amin@shemshak.local"))
+ (nnimap-stream plain)
+ (nnimap-address "127.0.0.1")
+ (nnimap-server-port 143)
+ (nnimap-authenticator plain)
+ (nnimap-user "amin@shemshak.local"))
(nnimap "gnu"
- (nnimap-stream plain)
- (nnimap-address "127.0.0.1")
- (nnimap-server-port 143)
- (nnimap-authenticator plain)
- (nnimap-user "bandali@gnu.local")
- (nnimap-inbox "INBOX")
- (nnimap-split-methods 'nnimap-split-fancy)
- (nnimap-split-fancy (|
- ;; (: gnus-registry-split-fancy-with-parent)
- ;; (: 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")
- ;; webmasters
- (from "webmasters\\(-comment\\)?@gnu\\.org" "webmasters")
- ;; other
- (list ".*atreus.freelists.org" "l.atreus")
- (list ".*deepspec.lists.cs.princeton.edu" "l.deepspec")
- ;; (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-stream plain)
+ (nnimap-address "127.0.0.1")
+ (nnimap-server-port 143)
+ (nnimap-authenticator plain)
+ (nnimap-user "bandali@gnu.local")
+ (nnimap-inbox "INBOX")
+ (nnimap-split-methods 'nnimap-split-fancy)
+ (nnimap-split-fancy (|
+ ;; (: gnus-registry-split-fancy-with-parent)
+ ;; (: 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")
+ ;; webmasters
+ (from "webmasters\\(-comment\\)?@gnu\\.org" "webmasters")
+ ;; other
+ (list ".*atreus.freelists.org" "l.atreus")
+ (list ".*deepspec.lists.cs.princeton.edu" "l.deepspec")
+ ;; (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-address "127.0.0.1")
(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")
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
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")))))
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)
:custom
(message-elide-ellipsis "[...]\n"))
-(use-feature mml
- :delight " mml")
+(use-feature mml)
(use-feature mml-sec
:custom
("s" . footnote-set-style)))
(use-package ebdb
+ :demand
:after gnus
:bind (:map gnus-group-mode-map ("e" . ebdb))
:config
(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 t))
;; (use-package ebdb-message
;; :after ebdb)
(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
(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))