;;; Commentary:
-;; Emacs configuration of Amin Bandali, computer scientist, functional
-;; programmer, and free software activist. Uses straight.el for
-;; purely functional and fully reproducible package management.
+;; Emacs configuration of Amin Bandali, computer scientist, free
+;; software activist, GNU maintainer & webmaster. Uses straight.el
+;; for purely functional and fully reproducible package management.
;; Over the years, I've taken inspiration from configurations of many
;; great people. Some that I can remember off the top of my head are:
\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
(previous-line)
(insert "\n\f\n;;; "))
+;; (defvar b/fill-column 47
+;; "My custom `fill-column'.")
+
+(defconst b/asterism "* * *")
+
+(defun b/insert-asterism ()
+ "Insert a centred asterism."
+ (interactive)
+ (insert
+ (concat
+ "\n\n"
+ (make-string (floor (/ (- fill-column (length b/asterism)) 2))
+ ?\s)
+ b/asterism
+ "\n\n")))
+
(defun b/no-mouse-autoselect-window ()
"Conveniently disable `focus-follows-mouse'.
For disabling the behaviour for certain buffers and/or modes."
;; time and battery in mode-line
(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"))
+ (display-time-format "%a %b %-e, %-l:%M%P")
+ (display-time-mail-icon '(image :type xpm :file "gnus/gnus-pointer.xpm" :ascent center))
+ (display-time-use-mail-icon t))
(use-feature battery
+ :if b/exwm-p
:demand
:config
(display-battery-mode)
(use-feature vc
:bind ("C-x v C-=" . vc-ediff))
+(use-feature vc-git
+ :after vc
+ :custom
+ (vc-git-print-log-follow t))
+
(use-feature ediff
:config (add-hook 'ediff-after-quit-hook-internal 'winner-undo)
:custom ((ediff-window-setup-function 'ediff-setup-windows-plain)
: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
;; for back and forward mouse keys
("<XF86Back>" . previous-buffer)
("<mouse-8>" . previous-buffer)
- ("<drag-mouse-8>" . previous-buffer)
+ ;; ("<drag-mouse-8>" . previous-buffer)
("<XF86Forward>" . next-buffer)
("<mouse-9>" . next-buffer)
- ("<drag-mouse-9>" . next-buffer)
- ("<drag-mouse-2>" . kill-this-buffer)
- ("<drag-mouse-3>" . ivy-switch-buffer))
+ ;; ("<drag-mouse-9>" . next-buffer)
+ ;; ("<drag-mouse-2>" . kill-this-buffer)
+ ;; ("<drag-mouse-3>" . switch-to-buffer)
+ )
(bind-keys
:prefix-map b/straight-prefix-map
;;; Essential packages
(use-package exwm
+ :if b/exwm-p
:demand
:config
;; make class name the buffer name, truncating beyond 60 characters
;; 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")))
(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
(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 ()
([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
([?\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
(exwm-manage-finish . (lambda ()
(when exwm-class-name
(cond
- ((string= exwm-class-name "URxvt")
- (exwm-input-set-local-simulation-keys
- nil))
((string= exwm-class-name "Abrowser")
(exwm-input-set-local-simulation-keys
`(,@exwm-input-simulation-keys
- ([?\C-\S-d] . [?\C-d])
- ([?\C-\S-w] . [?\C-w])
- ([?\C-\S-q] . [?\C-q])))))))))
+ ([?\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")))
(use-feature exwm-systemtray
:demand
: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)
:custom
(magit-diff-refine-hunk t)
(magit-display-buffer-function #'magit-display-buffer-fullframe-status-v1)
+ ;; (magit-completing-read-function 'magit-ido-completing-read)
:custom-face (magit-diff-file-heading ((t (:weight normal)))))
;; recently opened files
:defer 0.2
;; :config
;; (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
+ :config
+ (recentf-mode)
:custom
(recentf-max-saved-items 2000))
;; smart M-x enhancement (needed by counsel for history)
-(use-package smex)
+;; (use-package smex)
+
+(bind-keys
+ ("C-c f ." . find-file)
+ ("C-c f l" . find-library)
+ ("C-c f r" . recentf-open-files)
+ ("C-c x" . execute-extended-command))
+
+(comment
+ (use-feature ido
+ :demand
+ :bind
+ (:map ido-common-completion-map
+ ([escape] . minibuffer-keyboard-quit)
+ ("DEL" . b/ido-backspace))
+ :config
+ (require 'delsel)
+ (defun b/ido-backspace ()
+ "Forward to `backward-delete-char'. On error (read-only), quit."
+ (interactive)
+ (condition-case nil
+ (backward-delete-char 1)
+ (error
+ (minibuffer-keyboard-quit))))
+ (ido-mode 1)
+ (ido-everywhere 1)
+ :custom
+ (ido-enable-flex-matching t)
+ ;; (ido-enable-regexp t)
+ ;; (ido-enable-prefix t)
+ (ido-max-window-height 10)
+ (ido-use-virtual-buffers t))
+
+ (use-package ido-vertical-mode
+ :defer 0.3
+ :config
+ (ido-vertical-mode 1)
+ :custom
+ (ido-vertical-define-keys 'C-n-C-p-up-and-down)
+ (ido-vertical-show-count t))
+
+ (use-package ido-completing-read+
+ :defer 0.3
+ :after ido
+ :config
+ (ido-ubiquitous-mode 1))
+
+ (use-package crm-custom
+ :defer 0.3
+ :config
+ (crm-custom-mode 1))
+
+ (use-feature icomplete
+ :defer 0.3
+ :config
+ (icomplete-mode 1)))
+
+(use-package amx
+ :defer 0.3
+ :config
+ (amx-mode))
(use-package ivy
:defer 0.3
("DEL" . ivy-backward-delete-char))
:config
(setq ivy-wrap t
- ivy-height 14
+ ;; ivy-height 14
ivy-use-virtual-buffers t
ivy-virtual-abbreviate 'abbreviate
ivy-count-format "%d/%d ")
(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))))
- ;; (ivy-minibuffer-match-face-3 ((t (:background "#bbbbff" :weight semi-bold))))
- ;; (ivy-minibuffer-match-face-4 ((t (:background "#ffbbff" :weight semi-bold))))
-)
+ :custom-face
+ (ivy-minibuffer-match-face-1 ((t (:background "#eeeeee"))))
+ (ivy-minibuffer-match-face-2 ((t (:background "#e7e7e7" :weight bold))))
+ (ivy-minibuffer-match-face-3 ((t (:background "light goldenrod" :weight semi-bold))))
+ (ivy-minibuffer-match-face-4 ((t (:background "misty rose" :weight semi-bold))))
+ (ivy-current-match ((((class color) (background light))
+ :background "#d7d7d7" :foreground "black")
+ (((class color) (background dark))
+ :background "#65a7e2" :foreground "black"))))
(use-package swiper
+ :demand
:after ivy
- :bind (("C-s" . swiper-isearch)
- ("C-r" . swiper)
- ("C-S-s" . isearch-forward)))
+ :bind (("C-S-s" . swiper-isearch)))
(use-package counsel
+ :demand
:after ivy
- :bind (([remap execute-extended-command] . counsel-M-x)
- ([remap find-file] . counsel-find-file)
- ("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)
+ :bind (("C-c f r" . counsel-recentf)
:map minibuffer-local-map
("C-r" . counsel-minibuffer-history))
:config
("C-d" . b/eshell-quit-or-delete-char)
("C-S-l" . b/eshell-clear)
("M-r" . counsel-esh-history)
- ([tab] . company-complete)))
+ ;; ([tab] . company-complete)
+ :map eshell-hist-mode-map
+ ("M-r" . counsel-esh-history)))
:hook (eshell-mode . b/eshell-setup)
:custom
(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
(add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left))
(use-feature text-mode
- :hook (text-mode . indicate-buffer-boundaries-left))
+ :bind (:map text-mode-map ("C-*" . b/insert-asterism))
+ :hook ((text-mode . indicate-buffer-boundaries-left)
+ (text-mode . flyspell-mode)))
(use-feature conf-mode
:mode "\\.*rc$")
:mode "\\.bashrc$")
(use-package company
- :defer 0.6
:bind
(:map company-active-map
([tab] . company-complete-common-or-cycle)
- ([escape] . company-abort))
+ ([escape] . company-abort)
+ ("C-p" . company-select-previous-or-abort)
+ ("C-n" . company-select-next-or-abort))
:custom
(company-minimum-prefix-length 1)
(company-selection-wrap-around t)
(company-dabbrev-char-regexp "\\sw\\|\\s_\\|[-_]")
(company-dabbrev-downcase nil)
(company-dabbrev-ignore-case nil)
- :config
- (global-company-mode t))
+ ;; :config
+ ;; (global-company-mode t)
+ )
(use-package flycheck
:defer 0.6
(use-package alloy-mode
:straight (:host github :repo "dwwmmn/alloy-mode")
- :mode "\\.als\\'"
- :config (setq alloy-basic-offset 2))
+ :mode "\\.\\(als\\|dsh\\)\\'"
+ :config
+ (setq alloy-basic-offset 2)
+ ;; (defun b/alloy-simple-indent (start end)
+ ;; (interactive "r")
+ ;; ;; (if (region-active-p)
+ ;; ;; (indent-rigidly start end alloy-basic-offset)
+ ;; ;; (if (bolp)
+ ;; ;; (indent-rigidly (line-beginning-position)
+ ;; ;; (line-end-position)
+ ;; ;; alloy-basic-offset)))
+ ;; (indent-to (+ (current-column) alloy-basic-offset)))
+ :bind (:map alloy-mode-map
+ ("RET" . electric-newline-and-maybe-indent)
+ ;; ("TAB" . b/alloy-simple-indent)
+ ("TAB" . indent-for-tab-command))
+ :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))
(b/setq-every 2
web-mode-code-indent-offset
web-mode-css-indent-offset
- web-mode-markup-indent-offset))
+ web-mode-markup-indent-offset)
+ :custom
+ (web-mode-enable-auto-indentation nil))
(use-package emmet-mode
:after (:any web-mode css-mode sgml-mode)
: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)
- (exwm-systemtray--refresh))
+ (when (featurep 'erc-hl-nicks)
+ (erc-hl-nicks-reset-face-table))
+ (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)
- (exwm-systemtray--refresh))
+ (when (featurep 'erc-hl-nicks)
+ (erc-hl-nicks-reset-face-table))
+ (when (featurep 'exwm-systemtray)
+ (exwm-systemtray--refresh)))
(bind-keys
("C-c t d" . b/lights-off)
;; prefixes for global prefixes and minor modes
"C-c @" "outline"
"C-c !" "flycheck"
- "C-c 8" "typo"
- "C-c 8 -" "typo/dashes"
- "C-c 8 <" "typo/left-brackets"
- "C-c 8 >" "typo/right-brackets"
+ ;; "C-c 8" "typo"
+ ;; "C-c 8 -" "typo/dashes"
+ ;; "C-c 8 <" "typo/left-brackets"
+ ;; "C-c 8 >" "typo/right-brackets"
+ "C-x RET" "coding system"
"C-x 8" "unicode"
+ "C-x @" "event modifiers"
"C-x a" "abbrev/expand"
"C-x r" "rectangle/register/bookmark"
+ "C-x t" "tabs"
"C-x v" "version control"
+ "C-x X" "edebug"
+ "C-x C-a" "edebug"
+ "C-x C-k" "kmacro"
;; prefixes for my personal bindings
+ "C-c &" "yasnippet"
"C-c a" "applications"
"C-c a e" "erc"
"C-c a o" "org"
"C-c P s" "projectile/search"
"C-c P x" "projectile/execute"
"C-c P 4" "projectile/other-window"
+ "C-c p" "package management"
+ "C-c ps" "straight"
+ "C-c psa" "all"
+ "C-c psp" "package"
"C-c q" "boxquote"
"C-c t" "themes"
;; "s-O" "outline"
(use-package crux ; results in Waiting for git... [2 times]
:defer 0.4
:bind (("C-c d" . crux-duplicate-current-line-or-region)
- ("C-c D" . crux-duplicate-and-comment-current-line-or-region)
+ ("C-c M-d" . crux-duplicate-and-comment-current-line-or-region)
("C-c f C" . crux-copy-file-preserve-attributes)
("C-c f D" . crux-delete-file-and-buffer)
("C-c f R" . crux-rename-file-and-buffer)
("M-w" . boxquote-kill-ring-save)))
(use-package orgalist
- ;; http://lists.gnu.org/archive/html/emacs-orgmode/2019-04/msg00007.html
- :disabled t
+ ;; breaks auto-fill-mode, showing this error:
+ ;; orgalist--boundaries: Lisp nesting exceeds ‘max-lisp-eval-depth’
+ :disabled
:after message
:hook (message-mode . orgalist-mode))
(use-package typo
: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 git-commit-mode) . (lambda ()(typo-mode -1)))))
+
+(use-feature electric
+ :disabled
+ :demand
+ :config
+ (electric-quote-mode))
;; 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
:straight (debbugs
:host github
:repo "emacs-straight/debbugs"
- :files (:defaults "Debbugs.wsdl")))
+ :files (:defaults "Debbugs.wsdl"))
+ :bind
+ (("C-c D d" . debbugs-gnu)
+ ("C-c D b" . debbugs-gnu-bugs)
+ ("C-c D e" .
+ (lambda ()
+ (interactive)
+ (setq debbugs-gnu-current-suppress t)
+ (debbugs-gnu debbugs-gnu-default-severities '("emacs"))))
+ ("C-c D g" .
+ (lambda ()
+ (interactive)
+ (setq debbugs-gnu-current-suppress t)
+ (debbugs-gnu debbugs-gnu-default-severities '("gnuzilla"))))
+ ("C-c D G" .
+ (lambda ()
+ (interactive)
+ (setq debbugs-gnu-current-suppress t)
+ (debbugs-gnu debbugs-gnu-default-severities '("guix"))))))
(use-package org-ref
:init
;; (use-package fill-column-indicator)
(use-package emojify
+ :disabled
:hook (erc-mode . emojify-mode))
(use-feature window
:bind
- (("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))
+ (("C-c w e" . (lambda ()
+ (interactive)
+ (split-window-right)
+ (other-window 1)
+ (erc-switch-to-buffer)))
+ ("C-c w s l" . (lambda ()
+ (interactive)
+ (split-window-right)
+ (other-window 1)))
+ ("C-c w s j" . (lambda ()
+ (interactive)
+ (split-window-below)
+ (other-window 1)))
+ ("C-c w q" . quit-window))
:custom
(split-width-threshold 150))
("<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
: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"))
+
+(use-package hyperbole
+ :disabled
+ :straight (hyperbole
+ :host github :repo "rswgnu/hyperbole"
+ :files ("*.el" ("kotl" "kotl/*.el")
+ "DEMO" "man/*.info" "man/*.texi")))
+
+(use-package oddmuse-curl
+ :straight (:host github :repo "kensanata/oddmuse-curl")
+ :config
+ (setq
+ oddmuse-wikis
+ (append
+ '(("EmacsConf" "https://emacsconf.org" utf-8 "question" nil)
+ ("EmacsConf 2019" "https://emacsconf.org/2019" utf-8 "question" nil))
+ oddmuse-wikis))
+ :custom
+ (oddmuse-username "bandali"))
+
+(use-package debpaste
+ :custom
+ (debpaste-paste-is-hidden t))
+
+(use-package scpaste
+ :disabled
+ :config
+ (setq scpaste-http-destination "https://p.bndl.org"
+ scpaste-scp-destination "nix:/var/www/p.bndl.org"))
+
\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")
+ ;; gnus
+ (list ".*<\\(.*\\)\\.gnus\\.org>.*" "l.\\1")
+ ;; libreplanet
+ (list ".*<\\(.*\\)\\.libreplanet\\.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")
("l\\.emacs-tangents"
(to-address . "emacs-tangents@gnu.org")
(to-list . "emacs-tangents@gnu.org"))
+ ("l\\.emacsconf-committee"
+ (to-address . "emacsconf-committee@gnu.org")
+ (to-list . "emacsconf-committee@gnu.org"))
("l\\.emacsconf-discuss"
(to-address . "emacsconf-discuss@gnu.org")
(to-list . "emacsconf-discuss@gnu.org"))
(to-list . "webmasters@gnu.org"))
("gnu.*"
(gcc-self . t))
- ("gnu\\."
+ ("l\\."
(subscribed . t))
("nnimap\\+uw:.*"
(gcc-self . t)))
:config
(setq
gnus-buttonized-mime-types '("multipart/\\(signed\\|encrypted\\)")
- gnus-visible-headers
- (concat gnus-visible-headers "\\|^List-Id:\\|^X-RT-Originator:\\|^User-Agent:")
- gnus-sorted-header-list
- '("^From:" "^Subject:" "^Summary:" "^Keywords:"
- "^Followup-To:" "^To:" "^Cc:" "X-RT-Originator"
- "^Newsgroups:" "List-Id:" "^Organization:"
- "^User-Agent:" "^Date:")
+ gnus-sorted-header-list '("^From:"
+ "^X-RT-Originator"
+ "^Newsgroups:"
+ "^Subject:"
+ "^Date:"
+ "^Envelope-To:"
+ "^Followup-To:"
+ "^Reply-To:"
+ "^Organization:"
+ "^Summary:"
+ "^Abstract:"
+ "^Keywords:"
+ "^To:"
+ "^[BGF]?Cc:"
+ "^Posted-To:"
+ "^Mail-Copies-To:"
+ "^Mail-Followup-To:"
+ "^Apparently-To:"
+ "^Resent-From:"
+ "^User-Agent:"
+ "^X-detected-operating-system:"
+ "^Message-ID:"
+ ;; "^References:"
+ "^List-Id:"
+ "^Gnus-Warning:")
+ gnus-visible-headers (mapconcat 'identity
+ gnus-sorted-header-list
+ "\\|")
;; local-lapsed article dates
;; from https://www.emacswiki.org/emacs/GnusFormatting#toc11
gnus-article-date-headers '(user-defined)
(use-feature gnus-msg
:config
- (defvar b/signature "Amin Bandali
-Free Software Activist | GNU Webmaster & Volunteer
-GPG: BE62 7373 8E61 6D6D 1B3A 08E8 A21A 0202 4881 6103
+ (defvar b/shemshak-signature "Amin Bandali
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://bandali.eu.org")
(defvar b/uw-signature "Amin Bandali, MMath Student
Cheriton School of Computer Science
University of Waterloo
-https://bandali.eu.org")
+https://bndl.org")
(defvar b/csc-signature "Amin Bandali
Systems Committee
Computer Science Club, University of Waterloo
https://csclub.uwaterloo.ca/~abandali")
- (setq gnus-posting-styles
+ (setq gnus-message-replysign t
+ gnus-posting-styles
'((".*"
- (address "amin@shemshak.org")
- (body "\nBest,\n")
- (signature b/signature)
- (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")))
+ (address "bandali@gnu.org"))
+ ("nnimap\\+gnu:l\\..*"
+ (signature nil))
((header "subject" "ThankCRM")
(to "webmasters-comment@gnu.org")
(body "")
(eval (setq b/message-cite-say-hi nil)))
+ ("nnimap\\+shemshak:.*"
+ (address "amin@shemshak.org")
+ (body "\nBest,\n")
+ (signature b/shemshak-signature)
+ (gcc "nnimap+shemshak:Sent")
+ (eval (setq b/message-cite-say-hi t)))
("nnimap\\+uw:.*"
- (address "abandali@uwaterloo.ca")
+ (address "bandali@uwaterloo.ca")
+ (body "\nBest,\n")
(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")))))
+ (gcc "nnimap+csc:Sent"))))
+ :hook (gnus-message-setup . (lambda ()
+ (unless (mml-secure-is-encrypted-p)
+ (mml-secure-message-sign)))))
(use-feature gnus-topic
:hook (gnus-group-mode . gnus-topic-mode)
:init
(add-hook 'dired-mode-hook 'gnus-dired-mode))
+(comment
+ (use-feature gnus-utils
+ :custom
+ (gnus-completing-read-function 'gnus-ido-completing-read)))
+
(use-feature mm-decode
:config
(setq mm-discouraged-alternatives '("text/html" "text/richtext")
mm-verify-option 'known))
(use-feature mm-uu
+ :config
+ (set-face-attribute 'mm-uu-extract nil :extend t)
:custom
(mm-uu-diff-groups-regexp
"\\(gmane\\|gnu\\|l\\)\\..*\\(diff\\|commit\\|cvs\\|bug\\|dev\\)"))
mail-envelope-from 'header))
(use-feature message
+ :bind (:map message-mode-map ("<C-return>" . b/insert-asterism))
:config
;; redefine for a simplified In-Reply-To header
;; (see https://todo.sr.ht/~sircmpwn/lists.sr.ht/67)
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\\)\\)")
- (require 'company-ebdb)
+ "\\(\\(\\(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)
(message-mode . (lambda ()
- ;; (setq fill-column 65
- ;; message-fill-column 65)
+ ;; (setq-local fill-column b/fill-column
+ ;; message-fill-column b/fill-column)
(make-local-variable 'company-idle-delay)
(setq company-idle-delay 0.2))))
;; :custom-face
("r" . footnote-renumber-footnotes)
("s" . footnote-set-style)))
+(use-package bbdb
+ :disabled
+ :demand
+ :after gnus
+ :bind (:map gnus-group-mode-map ("e" . bbdb))
+ :config
+ (bbdb-initialize 'gnus 'message)
+ :custom
+ (bbdb-complete-mail-allow-cycling t)
+ (bbdb-user-mail-address-re message-dont-reply-to-names))
+
(use-package ebdb
:demand
:after gnus
(use-feature ebdb-com
:after ebdb)
-;; (use-package ebdb-complete
-;; :after ebdb
-;; :config
-;; (ebdb-complete-enable))
-
-(use-package company-ebdb
+(use-feature ebdb-complete
+ :after ebdb
:config
- (defun company-ebdb--post-complete (_) nil))
+ ;; (setq ebdb-complete-mail 'capf)
+ (ebdb-complete-enable))
-(use-feature ebdb-gnus
+(use-feature ebdb-message
:demand
+ :after ebdb)
+
+;; (use-package company-ebdb
+;; :config
+;; (defun company-ebdb--post-complete (_) nil))
+
+(use-feature ebdb-gnus
: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)
;;; IRC (with ERC and ZNC)
(use-feature erc
- :bind (("C-c b e" . erc-switch-to-buffer)
+ :bind (("C-c b b" . erc-switch-to-buffer)
:map erc-mode-map
("M-a" . erc-track-switch-buffer))
:custom
(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
(use-feature erc-pcomplete
:after erc
:custom
- (erc-pcomplete-nick-postfix ","))
+ (erc-pcomplete-nick-postfix ", "))
(use-feature erc-track
: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))