diff options
author | Amin Bandali <bandali@kelar.org> | 2025-02-10 15:05:56 -0500 |
---|---|---|
committer | Amin Bandali <bandali@kelar.org> | 2025-02-10 15:05:56 -0500 |
commit | 70026d07d0bef09468b93caabf9a1f425533a69a (patch) | |
tree | c5379ac39bff3fb3e818eba88844c136c7e1c239 | |
parent | 99332da43b8324814ca6c1af7f0076f83c8ce233 (diff) | |
download | configs-70026d07d0bef09468b93caabf9a1f425533a69a.tar.gz configs-70026d07d0bef09468b93caabf9a1f425533a69a.tar.xz configs-70026d07d0bef09468b93caabf9a1f425533a69a.zip |
Drop use-package again
I prefer my own manual approach, use-package feels too magical and
at times does too much for me.
-rw-r--r-- | .emacs.d/init.el | 61 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-dired.el | 45 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-erc.el | 151 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-eshell.el | 42 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-essentials.el | 627 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-gnus.el | 506 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-ibuffer.el | 42 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-message.el | 82 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-misc.el | 134 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-prog.el | 97 | ||||
-rw-r--r-- | .emacs.d/lisp/bandali-utils.el | 15 |
11 files changed, 829 insertions, 973 deletions
diff --git a/.emacs.d/init.el b/.emacs.d/init.el index 59b1744..98d0cc9 100644 --- a/.emacs.d/init.el +++ b/.emacs.d/init.el @@ -24,31 +24,17 @@ ;;; Code: -;; whoami -(setq - user-full-name "Amin Bandali" - user-mail-address "bandali@kelar.org") - -;;; Package management +;;; Initial setup (setq - use-package-verbose init-file-debug - use-package-expand-minimally (not init-file-debug) - use-package-compute-statistics init-file-debug debug-on-error init-file-debug debug-on-quit init-file-debug) -(require 'package) -;; Install use-package on older Emascen if needed. -(when (< emacs-major-version 29) - (unless (package-installed-p 'use-package) - (unless package-archive-contents - (package-refresh-contents)) - (package-install 'use-package))) - - -;;; Initial setup +;; whoami +(setq + user-full-name "Amin Bandali" + user-mail-address "bandali@kelar.org") (eval-and-compile (defsubst b/emacs.d (path) @@ -116,13 +102,33 @@ plain variables. This means that `setopt' will execute any (with-eval-after-load 'custom (load custom-file 'noerror)) -;; Start Emacs server + +;;; Package management + +;; List of the packages I use from GNU ELPA and NonGNU ELPA. +(setq + package-selected-packages + '(debbugs delight eat elpher)) + +(require 'package) + +;; Add NonGNU ELPA on older Emacsen. +(when (version< emacs-version "28") + (add-to-list + 'package-archives + '("nongnu" . "https://elpa.nongnu.org/nongnu/"))) + +(package-install-selected-packages) + + +;;; Emacs server + +;; Start Emacs server. ;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html -(use-package server - :defer 0.5 - :bind - ("C-c F D" . server-edit) - :config +(run-with-idle-timer 0.5 nil #'require 'server) +(with-eval-after-load 'server + (declare-function server-edit "server") + (b/keymap-global-set "C-c F D" #'server-edit) (declare-function server-running-p "server") (or (server-running-p) (server-mode))) @@ -132,12 +138,13 @@ plain variables. This means that `setopt' will execute any (add-to-list 'load-path (b/emacs.d "lisp")) (require 'bandali-essentials) +(require 'bandali-utils) (require 'bandali-prog) ;; (require 'bandali-exwm) (require 'bandali-eshell) (require 'bandali-ibuffer) (require 'bandali-dired) -;;; Email with Gnus and message +;; Email with Gnus and message (require 'bandali-gnus) (require 'bandali-message) ;; (with-eval-after-load 'sendmail @@ -145,7 +152,7 @@ plain variables. This means that `setopt' will execute any ;; (with-eval-after-load 'smtpmail ;; (setopt smtpmail-queue-mail t ;; smtpmail-queue-dir (concat b/maildir "queue/"))) -;;; IRC with ERC +;; IRC with ERC (require 'bandali-erc) (require 'bandali-misc) (require 'bandali-po) diff --git a/.emacs.d/lisp/bandali-dired.el b/.emacs.d/lisp/bandali-dired.el index 982af2c..f0ebbc5 100644 --- a/.emacs.d/lisp/bandali-dired.el +++ b/.emacs.d/lisp/bandali-dired.el @@ -24,25 +24,12 @@ ;;; Code: -(use-package dired - :defer t - :init (require 'ls-lisp) - :bind - (:map - dired-mode-map - ("b" . dired-up-directory) - ("E" . dired-ediff-files) - ("e" . dired-toggle-read-only) - ("\\" . dired-hide-details-mode)) - :hook - (dired-mode . dired-hide-details-mode) - :custom - (dired-dwim-target-next t) - ;; (dired-listing-switches "-alh --group-directories-first") - (dired-listing-switches "-alh") - ;; (ls-lisp-dirs-first t) - (ls-lisp-use-insert-directory-program nil) - :config +(with-eval-after-load 'dired + (setopt + dired-dwim-target t + ;; dired-listing-switches "-alh --group-directories-first" + dired-listing-switches "-alh") + (declare-function dired-dwim-target-directory "dired-aux") ;; easily diff 2 marked files ;; https://oremacs.com/2017/03/18/dired-ediff/ @@ -66,13 +53,19 @@ (lambda () (setq ediff-after-quit-hook-internal nil) (set-window-configuration wnd)))) - (error "no more than 2 files should be marked"))))) + (error "no more than 2 files should be marked")))) + + ;; local key bindings + (let ((m dired-mode-map)) + (b/keymap-set m "b" #'dired-up-directory) + (b/keymap-set m "E" #'dired-ediff-files) + (b/keymap-set m "e" #'dired-toggle-read-only) + (b/keymap-set m "\\" #'dired-hide-details-mode)) -(use-package dired-x - :after dired - :custom - (dired-guess-shell-alist-user - '(("\\.pdf\\'" "atril" "evince" "zathura" "okular") + (require 'dired-x) + (setopt + dired-guess-shell-alist-user + '(("\\.pdf\\'" "atril" "evince") ("\\.doc\\'" "libreoffice") ("\\.docx\\'" "libreoffice") ("\\.ppt\\'" "libreoffice") @@ -80,7 +73,7 @@ ("\\.xls\\'" "libreoffice") ("\\.xlsx\\'" "libreoffice") ("\\.flac\\'" "mpv")))) - +(add-hook 'dired-mode-hook #'dired-hide-details-mode) (provide 'bandali-dired) ;;; bandali-dired.el ends here diff --git a/.emacs.d/lisp/bandali-erc.el b/.emacs.d/lisp/bandali-erc.el index 9a53969..8d1a9ad 100644 --- a/.emacs.d/lisp/bandali-erc.el +++ b/.emacs.d/lisp/bandali-erc.el @@ -24,42 +24,28 @@ ;;; Code: -(use-package erc - :bind - (("C-c w e" . erc-switch-to-buffer-other-window) - ("C-c e l" . (lambda () - (interactive) - (erc :id "soju-libera" - :server "localhost" - :port 6667 - :user "bandali/irc.libera.chat"))) - ("C-c e o" . (lambda () - (interactive) - (erc :id "soju-oftc" - :server "localhost" - :port 6667 - :user "bandali/irc.oftc.net"))) - :map erc-mode-map - ("M-a" . erc-track-switch-buffer)) - :custom - (erc-auto-query 'bury) - (erc-autojoin-domain-only nil) - (erc-dcc-get-default-directory (b/emacs.d "erc-dcc")) - (erc-email-userid "bandali") - ;; (erc-join-buffer 'bury) - ;; (erc-lurker-hide-list '("JOIN" "PART" "QUIT")) - (erc-nick "bandali") - (erc-prompt "erc>") - (erc-prompt-for-password nil) - (erc-query-display 'buffer) - ;; (erc-server-reconnect-attempts 5) - (erc-server-reconnect-timeout 3) - :config +(with-eval-after-load 'erc + (setopt + erc-auto-query 'bury + erc-autojoin-domain-only nil + erc-dcc-get-default-directory (b/emacs.d "erc-dcc") + erc-email-userid "bandali" + ;; erc-join-buffer 'bury + ;; erc-lurker-hide-list '("JOIN" "PART" "QUIT") + erc-nick "bandali" + erc-prompt "erc>" + erc-prompt-for-password nil + erc-query-display 'buffer + ;; erc-server-reconnect-attempts 5 + erc-server-reconnect-timeout 3) + (if (version< erc-version "5.6-git") (setopt erc-format-nick-function #'erc-format-@nick) (setopt erc-show-speaker-membership-status t)) + (unless (version< erc-version "5.5") (setopt erc-rename-buffers t)) + (unless (version< erc-version "5.4") (declare-function erc-message "erc-backend" (message-command line &optional force)) @@ -76,6 +62,7 @@ (defun erc-cmd-DEOPME () "Deop myself in the current channel." (erc-cmd-DEOP (format "%s" (erc-current-nick))))) + (add-to-list 'erc-modules 'keep-place) (when (display-graphic-p) (add-to-list 'erc-modules 'notifications) @@ -83,51 +70,63 @@ (add-to-list 'erc-modules 'spelling) (declare-function erc-update-modules "erc") - (erc-update-modules)) - -(use-package erc-match - :after erc - :custom - (erc-pal-highlight-type 'nick) - (erc-pals - '("corwin" "^gopar" "^iank" "^rwp" "technomancy" "thomzane")) - :config - (set-face-attribute - 'erc-pal-face nil - :foreground 'unspecified - :weight 'unspecified - :inherit 'erc-nick-default-face - :background "#ffffdf")) - -(use-package erc-pcomplete - :after erc - :custom - (erc-pcomplete-nick-postfix ",")) - -(use-package erc-stamp - :after erc - :custom - (erc-timestamp-only-if-changed-flag nil) - (erc-timestamp-format "%T ") - (erc-insert-timestamp-function #'erc-insert-timestamp-left) - :config - (set-face-attribute - 'erc-timestamp-face nil - :foreground "#aaaaaa" - :weight 'unspecified - :background 'unspecified)) - -(use-package erc-track - :after erc - :custom - (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) - (erc-track-showcount t)) + (erc-update-modules) + + (with-eval-after-load 'erc-match + (setopt + erc-pal-highlight-type 'nick + erc-pals + '("corwin" "^gopar" "^iank" "^rwp" "technomancy" "thomzane")) + (set-face-attribute + 'erc-pal-face nil + :foreground 'unspecified + :weight 'unspecified + :inherit 'erc-nick-default-face + :background "#ffffdf")) + + (with-eval-after-load 'erc-pcomplete + (setopt erc-pcomplete-nick-postfix ",")) + + (with-eval-after-load 'erc-stamp + (setopt + erc-timestamp-only-if-changed-flag nil + erc-timestamp-format "%T " + erc-insert-timestamp-function #'erc-insert-timestamp-left) + (set-face-attribute + 'erc-timestamp-face nil + :foreground "#aaaaaa" + :weight 'unspecified + :background 'unspecified)) + + (with-eval-after-load 'erc-track + (setopt + 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 + erc-track-showcount t)) + + (b/keymap-global-set "C-c w e" #'erc-switch-to-buffer-other-window) + (b/keymap-set erc-mode-map "M-a" #'erc-track-switch-buffer)) +(b/keymap-global-set + "C-c e l" + (lambda () + (interactive) + (erc :id "soju-libera" + :server "localhost" + :port 6667 + :user "bandali/irc.libera.chat"))) +(b/keymap-global-set + "C-c e o" + (lambda () + (interactive) + (erc :id "soju-oftc" + :server "localhost" + :port 6667 + :user "bandali/irc.oftc.net"))) (provide 'bandali-erc) ;;; bandali-erc.el ends here diff --git a/.emacs.d/lisp/bandali-eshell.el b/.emacs.d/lisp/bandali-eshell.el index e9476cd..4b96f91 100644 --- a/.emacs.d/lisp/bandali-eshell.el +++ b/.emacs.d/lisp/bandali-eshell.el @@ -24,15 +24,12 @@ ;;; Code: -(use-package eshell - :defer t - :bind - ("C-c s e" . eshell) - :custom - (eshell-hist-ignoredups t) - (eshell-input-filter #'eshell-input-filter-initial-space) - (eshell-prompt-regexp "^[^#$\n]* [#$] ; ") - (eshell-prompt-function +(with-eval-after-load 'eshell + (setopt + eshell-hist-ignoredups t + eshell-input-filter #'eshell-input-filter-initial-space + eshell-prompt-regexp "^[^#$\n]* [#$] ; " + eshell-prompt-function (lambda () (let ((uid (if (functionp #'file-user-uid) #'file-user-uid ; (version<= "30" emacs-version) @@ -44,11 +41,9 @@ (unless (eshell-exit-success-p) (format " [%d]" eshell-last-command-status)) (if (= (funcall uid) 0) " # " " $ ") - "; "))))) + "; ")))) -(use-package esh-mode - :after eshell - :init + ;; `esh-mode' (eval-when-compile (defvar eshell-prompt-regexp) (declare-function eshell-life-is-too-much "esh-mode") @@ -64,23 +59,20 @@ (let ((inhibit-read-only t)) (erase-buffer)) (eshell-send-input)) - :bind - (:map - eshell-mode-map - ("C-d" . b/eshell-quit-or-delete-char) - ("C-S-l" . b/eshell-clear))) + (with-eval-after-load 'esh-mode + (let ((m eshell-mode-map)) + (b/keymap-set m "C-d" #'b/eshell-quit-or-delete-char) + (b/keymap-set m "C-S-l" #'b/eshell-clear))) -(use-package esh-hist - :after eshell - :init + ;; `esh-hist' (defun b/eshell-history () (interactive) (completing-read "Eshell history: " (ring-elements eshell-history-ring))) - :bind - (:map - eshell-hist-mode-map - ("M-r" . b/eshell-history))) + (with-eval-after-load 'esh-hist + (let ((m eshell-hist-mode-map)) + (b/keymap-set m "M-r" #'b/eshell-history)))) +(b/keymap-global-set "C-c s e" #'eshell) (provide 'bandali-eshell) ;;; bandali-eshell.el ends here diff --git a/.emacs.d/lisp/bandali-essentials.el b/.emacs.d/lisp/bandali-essentials.el index ad1e141..09ef291 100644 --- a/.emacs.d/lisp/bandali-essentials.el +++ b/.emacs.d/lisp/bandali-essentials.el @@ -24,156 +24,116 @@ ;;; Code: -(use-package emacs - :demand t - :bind - ("C-c e b" . eval-buffer) - ("C-c e r" . eval-region) - :config - (when (display-graphic-p) - ;; Too easy to accidentally suspend (freeze) Emacs GUI. - (b/keymap-global-unset "C-z")) - +(setq-default + ;; Case-sensitive search (and `dabbrev-expand'). + ;; case-fold-search nil + indent-tabs-mode nil ; always use space for indentation + ;; tab-width 4 + indicate-buffer-boundaries 'left) + +(setq + ;; line-spacing 3 + completion-ignore-case t + read-buffer-completion-ignore-case t + enable-recursive-minibuffers t + resize-mini-windows t + message-log-max 20000 + mode-line-compact t + ;; mouse-autoselect-window t + scroll-conservatively 15 + scroll-preserve-screen-position 1 + ;; I don't feel like randomly jumping out of my chair. + ring-bell-function 'ignore) + +;; Mode-line compacting for older Emacsen. +(when (and (version< emacs-version "28") mode-line-compact) + ;; Manually make some `mode-line' spaces smaller. + ;; Emacs 28 and above do a terrific job at this out of the box + ;; when `mode-line-compact' is set to t (see above)." (setq-default - ;; Case-sensitive search (and `dabbrev-expand'). - ;; case-fold-search nil - indent-tabs-mode nil ; always use space for indentation - ;; tab-width 4 - indicate-buffer-boundaries 'left) - - (setq - ;; line-spacing 3 - completion-ignore-case t - read-buffer-completion-ignore-case t - enable-recursive-minibuffers t - resize-mini-windows t - message-log-max 20000 - mode-line-compact t - ;; mouse-autoselect-window t - scroll-conservatively 15 - scroll-preserve-screen-position 1 - ;; I don't feel like randomly jumping out of my chair. - ring-bell-function 'ignore) - - ;; Mode-line compacting for older Emacsen. - (when (and (version< emacs-version "28") mode-line-compact) - ;; Manually make some `mode-line' spaces smaller. - ;; Emacs 28 and above do a terrific job at this out of the box - ;; when `mode-line-compact' is set to t (see above)." - (setq-default - mode-line-format - (mapcar - (lambda (x) - (if (and (stringp x) - (or (string= x " ") - (string= x " "))) - " " - x)) - mode-line-format) - mode-line-buffer-identification - (propertized-buffer-identification "%10b"))) - - ;; Fonts and types. - (when (display-graphic-p) - (set-fontset-font t 'arabic "Sahel WOL") - (let ((emoji-font "Apple Color Emoji")) - (when (member emoji-font (font-family-list)) - (set-fontset-font - t 'emoji `(,emoji-font . "iso10646-1") nil 'prepend))) - (with-eval-after-load 'faces - (let ((grey "#e7e7e7")) - ;; (set-face-attribute 'default nil - ;; :font "Source Code Pro" - ;; :height 113 ; 130 ; 105 - ;; :weight 'medium) - ;; (set-face-attribute 'fixed-pitch nil - ;; :font "Source Code Pro" - ;; :weight 'medium) - ;; (set-face-attribute 'default nil - ;; :font "Inconsolata Medium-12:hinting=true:autohint=true") - ;; (set-face-attribute 'fixed-pitch nil - ;; :font "Inconsolata Medium-12:hinting=true:autohint=true") - (set-face-attribute 'default nil - :font "Source Code Pro Medium-10.5") - (set-face-attribute 'fixed-pitch nil - :font "Source Code Pro Medium-10.5") - (set-face-attribute 'mode-line nil - :box '(:line-width 2 :style released-button) - :background grey - :inherit 'fixed-pitch))))) - -(use-package delight - :ensure t - :defer 0.5) - -(use-package minibuffer - :defer t - :custom - (read-file-name-completion-ignore-case t)) - -(use-package files - :bind - ("C-c f ." . find-file) - :custom - (make-backup-files nil) - ;; Insert newline at the end of files. - ;; (require-final-newline t) - ;; Open read-only file buffers in view-mode, to get `q' for quit. - (view-read-only t)) - -(use-package ffap - :bind - ("C-c f p" . find-file-at-point)) - -(use-package find-func - :bind - ("C-c f l" . find-library)) - -(use-package frame - :bind - ("C-c F m" . make-frame-command) - ("C-c F d" . delete-frame)) - -(use-package window - :defer t - :custom - (split-width-threshold 140)) - -(use-package text-mode - :mode "\\(README.*\\|COMMIT_EDITMSG$\\)") - -(use-package conf-mode - :mode "\\.*rc$") - -(use-package sh-script - :mode ("\\.bashrc$" . sh-mode)) - -(use-package novice - :defer t - :config - (setq disabled-command-function nil)) - -(use-package autorevert - :defer 0.1 - :custom - ;; (auto-revert-verbose nil) - (global-auto-revert-non-file-buffers nil) - :config + mode-line-format + (mapcar + (lambda (x) + (if (and (stringp x) + (or (string= x " ") + (string= x " "))) + " " + x)) + mode-line-format) + mode-line-buffer-identification + (propertized-buffer-identification "%10b"))) + +;; Fonts and types. +(when (display-graphic-p) + (set-fontset-font t 'arabic "Sahel WOL") + (let ((emoji-font "Apple Color Emoji")) + (when (member emoji-font (font-family-list)) + (set-fontset-font + t 'emoji `(,emoji-font . "iso10646-1") nil 'prepend))) + (with-eval-after-load 'faces + (let ((grey "#e7e7e7")) + (set-face-attribute 'default nil + :font "Source Code Pro Medium-10.5") + (set-face-attribute 'fixed-pitch nil + :font "Source Code Pro Medium-10.5") + (set-face-attribute 'mode-line nil + :box '(:line-width 2 :style released-button) + :background grey + :inherit 'fixed-pitch)))) + +(when (display-graphic-p) + ;; Too easy to accidentally suspend (freeze) Emacs GUI. + (b/keymap-global-unset "C-z")) +(b/keymap-global-set "C-c e b" #'eval-buffer) +(b/keymap-global-set "C-c e r" #'eval-region) + +(with-eval-after-load 'minibuffer + (setopt read-file-name-completion-ignore-case t)) + +(with-eval-after-load 'files + (setopt + make-backup-files nil + ;; Insert newline at the end of files. + ;; require-final-newline t + ;; Open read-only file buffers in view-mode, to get `q' for quit. + view-read-only t) + (add-to-list + 'auto-mode-alist '("\\(README.*\\|COMMIT_EDITMSG$\\)" . text-mode)) + (add-to-list 'auto-mode-alist '("\\.*rc$" . conf-mode)) + (add-to-list 'auto-mode-alist '("\\.bashrc$" . sh-mode))) +(b/keymap-global-set "C-c f ." #'find-file) + +;; `ffap' +(b/keymap-global-set "C-c f p" #'find-file-at-point) + +;; `find-func' +(b/keymap-global-set "C-c f l" #'find-library) + +;; `frame' +(b/keymap-global-set "C-c F m" #'make-frame-command) +(b/keymap-global-set "C-c F d" #'delete-frame) + +(with-eval-after-load 'window + (setopt split-width-threshold 140)) + +;; `novice' +(setq disabled-command-function nil) + +(run-with-idle-timer 0.1 nil #'require 'autorevert) +(with-eval-after-load 'autorevert + (setopt + ;; auto-revert-verbose nil + global-auto-revert-non-file-buffers nil) (global-auto-revert-mode 1)) -(use-package time - :defer 0.1 - :bind - ("C-c e i" . emacs-init-time) - ("C-c e u" . emacs-uptime) - :custom - (display-time-default-load-average nil) - (display-time-format " %a %Y-%m-%d %-l:%M%P") - (display-time-mail-icon - '(image :type xpm :file "gnus/gnus-pointer.xpm" :ascent center)) - (display-time-use-mail-icon t) - :config +(run-with-idle-timer 0.1 nil #'require 'time) +(with-eval-after-load 'time (setopt + display-time-default-load-average nil + display-time-format " %a %Y-%m-%d %-l:%M%P" + display-time-mail-icon + '(image :type xpm :file "gnus/gnus-pointer.xpm" :ascent center) + display-time-use-mail-icon t zoneinfo-style-world-list `(,@zoneinfo-style-world-list ("Etc/UTC" "UTC") @@ -181,20 +141,21 @@ ("Australia/Melbourne" "Melbourne"))) (unless (display-graphic-p) (display-time-mode 1))) +(b/keymap-global-set "C-c e i" #'emacs-init-time) +(b/keymap-global-set "C-c e u" #'emacs-uptime) (defvar b/battery-format "%p%b %t") -(use-package battery - ;; :if (not (display-graphic-p)) - :defer 0.1 - :custom - (battery-mode-line-format (format " [%s]" b/battery-format))) - -(use-package winner - :defer 0.5 - :config +(run-with-idle-timer 0.1 nil #'require 'battery) +(with-eval-after-load 'battery + (setopt battery-mode-line-format (format " [%s]" b/battery-format)) + ;; (display-battery-mode -1) + ) + +(run-with-idle-timer 0.5 nil #'require 'winner) +(with-eval-after-load 'winner (winner-mode 1) (when (featurep 'exwm) - ;; Prevent a bad interaction between EXWM and winner-mode, where + ;; prevent a bad interaction between EXWM and winner-mode, where ;; sometimes closing a window (like closing a terminal after ;; entering a GPG password via pinentry-gnome3's floating window) ;; results in a dead frame somewhere and effectively freezes EXWM. @@ -206,76 +167,64 @@ (when (frame-live-p (car args)) (apply orig-fun args)))))) -(use-package windmove - :defer 0.5 - :custom - (windmove-wrap-around t) - :bind - ("M-H" . windmove-left) - ("M-L" . windmove-right) - ("M-K" . windmove-up) - ("M-J" . windmove-down)) - -(use-package isearch - :defer t - :custom - (isearch-allow-scroll t) - (isearch-lazy-count t) - ;; Match non-ASCII variants during search - (search-default-mode #'char-fold-to-regexp)) - -(use-package vc - :bind - ("C-x v C-=" . vc-ediff)) - -(use-package vc-git - :defer t - :custom - ;; (vc-git-show-stash 0) - (vc-git-print-log-follow t)) - -(use-package ediff - :defer t - :custom - (ediff-window-setup-function #'ediff-setup-windows-plain) - (ediff-split-window-function #'split-window-horizontally)) - -(use-package face-remap - :disabled - :custom - ;; Gentler font scaling. - (text-scale-mode-step 1.05)) - -(use-package mwheel - :defer 0.4 - :custom - (mouse-wheel-scroll-amount '(1 ((shift) . 1))) ; one line at a time - (mouse-wheel-progressive-speed nil) ; don't accelerate scrolling - (mouse-wheel-follow-mouse t)) ; scroll window under mouse - -(use-package pixel-scroll - :defer 0.4 - :config +(run-with-idle-timer 0.5 nil #'require 'windmove) +(with-eval-after-load 'windmove + (setopt windmove-wrap-around t) + (b/keymap-global-set "M-H" #'windmove-left) + (b/keymap-global-set "M-L" #'windmove-right) + (b/keymap-global-set "M-K" #'windmove-up) + (b/keymap-global-set "M-J" #'windmove-down)) + +(with-eval-after-load 'isearch + (setopt + isearch-allow-scroll t + isearch-lazy-count t + ;; Match non-ASCII variants during search + search-default-mode #'char-fold-to-regexp)) + +;; `vc' +(b/keymap-global-set "C-x v C-=" #'vc-ediff) + +(with-eval-after-load 'vc-git + (setopt + ;; vc-git-show-stash 0 + vc-git-print-log-follow t)) + +(with-eval-after-load 'ediff + (setopt + ediff-window-setup-function #'ediff-setup-windows-plain + ediff-split-window-function #'split-window-horizontally)) + +;; (with-eval-after-load 'face-remap +;; (setopt +;; ;; Gentler font resizing. +;; text-scale-mode-step 1.05)) + +(run-with-idle-timer 0.4 nil #'require 'mwheel) +(with-eval-after-load 'mwheel + (setopt + mouse-wheel-scroll-amount '(1 ((shift) . 1)) ; one line at a time + mouse-wheel-progressive-speed nil ; don't accelerate scrolling + mouse-wheel-follow-mouse t)) ; scroll window under mouse + +(run-with-idle-timer 0.4 nil #'require 'pixel-scroll) +(with-eval-after-load 'pixel-scroll (pixel-scroll-mode 1)) -(use-package epg-config - :defer t - :custom - (epg-gpg-program (executable-find "gpg")) - ;; Ask for GPG passphrase in minibuffer. - ;; Will fail if gpg >= 2.1 is not available. - (epg-pinentry-mode 'loopback)) - -(use-package auth-source - :disabled - :custom - (auth-sources '("~/.authinfo.gpg")) - (authinfo-hidden - (regexp-opt '("password" "client-secret" "token")))) - -(use-package info - :defer t - :config +(with-eval-after-load 'epg-config + (setopt + epg-gpg-program (executable-find "gpg") + ;; Ask for GPG passphrase in minibuffer. + ;; Will fail if gpg >= 2.1 is not available. + epg-pinentry-mode 'loopback)) + +;; (with-eval-after-load 'auth-source +;; (setopt +;; auth-sources '("~/.authinfo.gpg") +;; authinfo-hidden +;; (regexp-opt '("password" "client-secret" "token")))) + +(with-eval-after-load 'info (setq Info-directory-list `(,@Info-directory-list @@ -283,71 +232,48 @@ (convert-standard-filename "info/") source-directory) "/usr/share/info/"))) -(use-package ielm - :bind - ("C-c i" . ielm)) +;; `ielm' +(b/keymap-global-set "C-c i" #'ielm) + +(run-with-idle-timer 0.2 nil #'require 'recentf) +(with-eval-after-load 'recentf + (setopt recentf-max-saved-items 2000) + (recentf-mode 1) -(use-package recentf - ;; recently opened files - :defer 0.2 - :init (defun b/recentf-open () "Use `completing-read' to \\[find-file] a recent file." (interactive) (find-file (completing-read "Find recent file: " recentf-list))) - :bind - ("C-c f r" . b/recentf-open) - :custom - (recentf-max-saved-items 2000) - :config - (recentf-mode 1)) - -(use-package help - :defer t - :custom - (help-window-select t) - :config - (temp-buffer-resize-mode 1)) - -(use-package help-mode - :bind - (:map - help-mode-map - ("p" . backward-button) - ("n" . forward-button) - ("b" . help-go-back) - ("f" . help-go-forward))) - -(use-package help-fns - :bind - ("C-c h F" . describe-face)) - -(use-package doc-view - :bind - (:map - doc-view-mode-map - ("M-RET" . image-previous-line))) - -(use-package man - :defer t - :custom - (Man-width 80)) - -(use-package shr - :defer t - :custom - (shr-max-width 80)) - -(use-package mule-cmds - :defer t - :preface (provide 'mule-cmds) - :custom - (default-input-method "farsi-isiri-9147")) - -(use-package tramp - :defer t - :config + (b/keymap-global-set "C-c f r" #'b/recentf-open)) + +(with-eval-after-load 'help + (temp-buffer-resize-mode 1) + (setopt help-window-select t)) + +(with-eval-after-load 'help-mode + (let ((m help-mode-map)) + (b/keymap-set m "p" #'backward-button) + (b/keymap-set m "n" #'forward-button) + (b/keymap-set m "b" #'help-go-back) + (b/keymap-set m "f" #'help-go-forward))) + +;; `help-fns' +(b/keymap-global-set "C-c h F" #'describe-face) + +(with-eval-after-load 'doc-view + (b/keymap-set doc-view-mode-map "M-RET" #'image-previous-line)) + +(with-eval-after-load 'man + (setopt Man-width 80)) + +(with-eval-after-load 'shr + (setopt shr-max-width 80)) + +(with-eval-after-load 'mule-cmds + (setopt default-input-method "farsi-isiri-9147")) + +(with-eval-after-load 'tramp (tramp-set-completion-function "ssh" (append (tramp-get-completion-function "ssh") @@ -356,104 +282,75 @@ "~/.ssh/config.d/" 'full directory-files-no-dot-files-regexp))))) -(use-package eldoc - ;; Display Lisp objects at point in the echo area. - :defer t - :custom - (eldoc-minor-mode-string " eldoc") - :config +;; Display Lisp objects at point in the echo area. +(with-eval-after-load 'eldoc + (setopt eldoc-minor-mode-string " eldoc") (global-eldoc-mode 1)) -(use-package paren - ;; Highlight matching parens. - :defer 0.2 - :config +;; Highlight matching parens. +(run-with-idle-timer 0.2 nil #'require 'paren) +(with-eval-after-load 'paren (show-paren-mode 1)) -(use-package simple - :delight - (auto-fill-function " f") - :hook - ((text-mode tex-mode) . auto-fill-mode) - :custom - ;; See `bandali-gnus' for my Gnus configuration. - (mail-user-agent 'gnus-user-agent) - (read-mail-command #'gnus) - ;; Save what I copy into clipboard from other applications into - ;; Emacs' kill-ring, which would allow me to still be able to - ;; easily access it in case I kill (cut or copy) something else - ;; inside Emacs before yanking (pasting) what I'd originally - ;; intended to. - (save-interprogram-paste-before-kill t) - :config +(with-eval-after-load 'simple + (setopt + ;; See `bandali-gnus' for my Gnus configuration. + mail-user-agent 'gnus-user-agent + read-mail-command #'gnus + ;; Save what I copy into clipboard from other applications into + ;; Emacs' kill-ring, which would allow me to still be able to + ;; easily access it in case I kill (cut or copy) something else + ;; inside Emacs before yanking (pasting) what I'd originally + ;; intended to. + save-interprogram-paste-before-kill t) (column-number-mode 1) (line-number-mode 1)) +(add-hook 'text-mode-hook #'auto-fill-mode) +(add-hook 'tex-mode-hook #'auto-fill-mode) -(use-package savehist - ;; Save minibuffer history. - :defer 0.2 - :config +;; Save minibuffer history. +(run-with-idle-timer 0.2 nil #'require 'savehist) +(with-eval-after-load 'savehist (savehist-mode 1) (add-to-list 'savehist-additional-variables 'kill-ring)) -(use-package saveplace - ;; Automatically save place in files. - :defer 0.2 - :config +;; Automatically save place in files. +(run-with-idle-timer 0.2 nil #'require 'saveplace nil 'noerror) +(with-eval-after-load 'saveplace (save-place-mode 1)) -(use-package flyspell - :defer t - :custom - (flyspell-mode-line-string " fly") - :hook - ((text-mode tex-mode) . flyspell-mode)) - -(use-package abbrev - :delight - :hook - (text-mode . abbrev-mode)) - -(use-package eww - :bind - ("C-c e w" . eww) - :custom - (eww-download-directory +(with-eval-after-load 'flyspell + (setopt flyspell-mode-line-string " fly")) +(add-hook 'text-mode-hook #'flyspell-mode) +(add-hook 'tex-mode-hook #'flyspell-mode) + +;; `abbrev' +(add-hook 'text-mode-hook #'abbrev-mode) + +(with-eval-after-load 'eww + (setopt + eww-download-directory (file-name-as-directory (getenv "XDG_DOWNLOAD_DIR")))) +(b/keymap-global-set "C-c e w" #'eww) -(use-package display-fill-column-indicator - :defer 0.2 - :config +(run-with-idle-timer + 0.2 nil #'require 'display-fill-column-indicator nil 'noerror) +(with-eval-after-load 'display-fill-column-indicator (global-display-fill-column-indicator-mode 1)) -(use-package completion-preview - ;; :if (package-installed-p 'completion-preview) - :if (version<= "30" emacs-version) - :delight " cprev" - :bind - (:map - completion-preview-active-mode-map - ("M-n" . completion-preview-next-candidate) - ("M-p" . completion-preview-prev-candidate) - ("M-i" . completion-preview-insert)) - :hook - ((prog-mode text-mode comint-mode) . completion-preview-mode)) - -(use-package version - :bind - ("C-c e v" . emacs-version)) - -(use-package bandali-utils - :bind - ("C-c d" . b/duplicate-line-or-region) - ("C-c j" . b/join-line-top) - ("C-S-j" . b/join-line-top) - ("C-c s c" . b/*scratch*) - ("C-c v" . b/invert-default-face) - ("C-c q" . b/unfill-paragraph-or-region) - (:map - text-mode-map - ("M-RET" . b/insert-asterism))) +(when (version<= "30" emacs-version) + ;; (package-installed-p 'completion-preview) + (with-eval-after-load 'completion-preview + (let ((m completion-preview-active-mode-map)) + (b/keymap-set m "M-p" #'completion-preview-prev-candidate) + (b/keymap-set m "M-n" #'completion-preview-next-candidate) + (b/keymap-set m "M-i" #'completion-preview-insert))) + (add-hook 'prog-mode-hook #'completion-preview-mode) + (add-hook 'text-mode-hook #'completion-preview-mode) + (add-hook 'comint-mode-hook #'completion-preview-mode)) + +;; `version' +(b/keymap-global-set "C-c e v" #'emacs-version) (provide 'bandali-essentials) ;;; bandali-essentials.el ends here diff --git a/.emacs.d/lisp/bandali-gnus.el b/.emacs.d/lisp/bandali-gnus.el index eeeb50f..312ed6d 100644 --- a/.emacs.d/lisp/bandali-gnus.el +++ b/.emacs.d/lisp/bandali-gnus.el @@ -37,13 +37,10 @@ (declare-function article-make-date-line "gnus-art" (date type)) -(use-package gnus - :bind - ("C-c g" . gnus-plugged) - ("C-c G" . gnus-unplugged) - :custom - (gnus-select-method '(nnnil "")) - (gnus-secondary-select-methods +(with-eval-after-load 'gnus + (setopt + gnus-select-method '(nnnil "") + gnus-secondary-select-methods `((nnimap "kelar" (nnimap-stream plain) @@ -145,9 +142,9 @@ ;; spam ("X-Spam-Flag" "YES" "Junk") ;; catch-all - "INBOX"))))) - (gnus-message-archive-group "nnimap+kelar:INBOX") - (gnus-parameters + "INBOX")))) + gnus-message-archive-group "nnimap+kelar:INBOX" + gnus-parameters '(("l\\.fencepost-users" (to-address . "fencepost-users@gnu.org") (to-list . "fencepost-users@gnu.org") @@ -155,268 +152,241 @@ ("l\\.haskell-cafe" (to-address . "haskell-cafe@haskell.org") (to-list . "haskell-cafe@haskell.org") - (list-identifier . "\\[Haskell-cafe\\]")))) + (list-identifier . "\\[Haskell-cafe\\]"))) ;; (gnus-large-newsgroup 50) - (gnus-process-mark-toggle t) - (gnus-home-directory (b/emacs.d "gnus/")) - (gnus-directory - (expand-file-name - (convert-standard-filename "news/") gnus-home-directory)) - (gnus-interactive-exit nil) - (gnus-user-agent '(emacs gnus type))) - -(use-package message - :after (gnus gnus-sum) - :custom - (message-directory + gnus-process-mark-toggle t + gnus-home-directory (b/emacs.d "gnus/") + gnus-directory (expand-file-name - (convert-standard-filename "mail/") gnus-home-directory)) - (gnus-ignored-from-addresses message-dont-reply-to-names)) + (convert-standard-filename "news/") gnus-home-directory) + gnus-interactive-exit nil + gnus-user-agent '(emacs gnus type)) + + (with-eval-after-load 'message + (setopt + message-directory + (expand-file-name + (convert-standard-filename "mail/") gnus-home-directory))) + + (with-eval-after-load 'nndraft + (setopt + nndraft-directory + (expand-file-name + (convert-standard-filename "drafts/") gnus-home-directory))) + + (with-eval-after-load 'nnimap + (setq nnimap-record-commands init-file-debug)) -(use-package nndraft - :after gnus - :custom - (nndraft-directory - (expand-file-name - (convert-standard-filename "drafts/") gnus-home-directory))) - -(use-package nnimap - :after gnus - :config - (setq nnimap-record-commands init-file-debug)) - -(use-package nnmail - :if (version< emacs-version "27") - :after gnus - :config - (add-to-list - 'nnmail-split-abbrev-alist - '(list . "list-id\\|list-post\\|x-mailing-list\\|x-beenthere\\|x-loop") - 'append)) - -(use-package gnus-agent - :after gnus - :custom - (gnus-agent-synchronize-flags 'ask)) - -(use-package gnus-art ; article - :after gnus - :custom - (gnus-buttonized-mime-types - '("multipart/\\(signed\\|encrypted\\)")) - (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:" - "^X-Spam_action:" - "^X-Spam_bar:" - "^Message-ID:" - ;; "^References:" - "^List-Id:" - "^Gnus-Warning:")) - (gnus-visible-headers - (mapconcat #'identity gnus-sorted-header-list "\\|"))) - -(use-package gnus-dired - :after (gnus dired) - :hook - (dired-mode . gnus-dired-mode)) - -(use-package gnus-group - :after gnus - :custom - (gnus-permanently-visible-groups "\\(:INBOX$\\|:gnu$\\)") - :hook - (gnus-group-mode . gnus-topic-mode) - (gnus-group-mode . gnus-agent-mode)) - -(use-package gnus-msg - :after gnus - :init - (let ((bandali "Amin Bandali%s - https://kelar.org/~bandali")) - (defvar b/csc-signature - (mapconcat - #'identity - `(,(format bandali ", MMath") - "Systems Committee <syscom@csclub.uwaterloo.ca>" - "Computer Science Club of the University of Waterloo") - "\n"))) - :custom - (gnus-gcc-mark-as-read t) - (gnus-message-replysign t) - (gnus-posting-styles - '(("nnimap\\+kelar:.*" - (address "bandali@kelar.org") - ("X-Message-SMTP-Method" "smtp mail.kelar.org 587") - (gcc "nnimap+kelar:INBOX")) - ("nnimap\\+shemshak:.*" - (address "amin@shemshak.org") - ("X-Message-SMTP-Method" "smtp mail.shemshak.org 587") - (gcc "nnimap+shemshak:Sent")) - ("nnimap\\+debian:.*" - (address "bandali@debian.org") - ("X-Message-SMTP-Method" "smtp mail-submit.debian.org 587") - (gcc "nnimap+debian:INBOX")) - ("nnimap\\+gnu:.*" - (address "bandali@gnu.org") - ("X-Message-SMTP-Method" "smtp fencepost.gnu.org 587") - (gcc "nnimap+gnu:INBOX")) - ("nnimap\\+.*:l\\.ubuntu-.*" - (address "bandali@ubuntu.com") - ("X-Message-SMTP-Method" "smtp mail.kelar.org 587")) - ((header "list-id" ".*\\.lists.ubuntu.com") - (address "bandali@ubuntu.com") - ("X-Message-SMTP-Method" "smtp mail.kelar.org 587")) - ("nnimap\\+csc:.*" - (address "bandali@csclub.uwaterloo.ca") - ("X-Message-SMTP-Method" "smtp mail.csclub.uwaterloo.ca 587") - (signature b/csc-signature) - (gcc "nnimap+csc:Sent"))))) - -(use-package gnus-registry - :disabled - :after gnus - :custom - (gnus-registry-max-entries 2500) - (gnus-registry-ignored-groups - (append gnus-registry-ignored-groups - '(("^nnimap:gnu\\.l" t) ("webmasters$" t)))) - :config - (gnus-registry-initialize)) - -(use-package gnus-search - :after gnus - :custom - (gnus-search-use-parsed-queries t)) - -(use-package gnus-start - :after gnus - :custom - (gnus-save-newsrc-file nil) - (gnus-read-newsrc-file nil) - :hook - (gnus-after-getting-new-news . gnus-notifications)) - -(use-package gnus-sum ; summary - :after gnus - :init - (defun b/gnus-junk-article (&optional n) - (interactive "P" gnus-summary-mode) - (gnus-summary-move-article - n - (gnus-group-prefixed-name - "Junk" - (gnus-find-method-for-group gnus-newsgroup-name)))) - :custom - (gnus-thread-sort-functions - '(gnus-thread-sort-by-number - gnus-thread-sort-by-subject - gnus-thread-sort-by-date)) - :bind - (:map - gnus-summary-mode-map - :prefix-map - b/gnus-summary-prefix-map - :prefix "v" - ("r r" . gnus-summary-very-wide-reply) - ("r q" . gnus-summary-very-wide-reply-with-original) - ("R r" . gnus-summary-reply) - ("R q" . gnus-summary-reply-with-original) - ("r a w" . gnus-summary-show-raw-article) - ("s" . b/gnus-junk-article))) - -(use-package gnus-topic - :after gnus - :custom - ;; (gnus-topic-line-format "%i[ %A: %(%{%n%}%) ]%v\n") - (gnus-topic-line-format "%i[ %(%{%n%}%) (%A) ]%v\n") - :config - (setq gnus-topic-topology - `(("Gnus" visible nil nil) - (("misc" visible nil nil)) - (("csc" visible nil nil)) - (("kelar" visible nil nil)) - (("shemshak" visible nil nil)) - (("debian" visible nil nil)) - (("gnu" visible nil nil)) - ;; (("old-gnu" visible nil nil)) - ))) - -(use-package gnus-win - :after gnus - :custom - (gnus-use-full-window nil)) - -(use-package mm-archive - :after gnus - :config - (add-to-list - 'mm-archive-decoders - '("application/gzip" nil "gunzip" "-S" ".zip" "-kd" "%f" "-r"))) - -(use-package mm-decode - :after gnus - :custom - ;; (mm-attachment-override-types `("text/x-diff" "text/x-patch" - ;; ,@mm-attachment-override-types)) - (mm-discouraged-alternatives '("text/html" "text/richtext")) - (mm-decrypt-option 'known) - (mm-verify-option 'known) - :config - (add-to-list - 'mm-inline-media-tests - `("application/gzip" mm-archive-dissect-and-inline identity)) - (add-to-list 'mm-inlined-types "application/gzip" 'append)) - -(use-package mm-uu - :after gnus - :config - (when (version< "27" emacs-version) - (set-face-attribute 'mm-uu-extract nil :extend t)) (when (version< emacs-version "27") - (setopt mm-uu-diff-groups-regexp "."))) - -(use-package mml - :after gnus - :delight " mml" - :custom - (mml-attach-file-at-the-end t) - (mml-content-disposition-alist - '((text - (markdown . "attachment") - (rtf . "attachment") - (t . "inline")) - (t . "attachment")))) - -(use-package mml-sec - :after mml - :custom - (mml-secure-openpgp-encrypt-to-self t) - (mml-secure-openpgp-sign-with-sender t)) - -(use-package recentf - :after gnus - :config - (add-to-list 'recentf-exclude b/maildir) - (add-to-list 'recentf-exclude gnus-home-directory)) + (with-eval-after-load 'nnmail + (add-to-list + 'nnmail-split-abbrev-alist + '(list . "list-id\\|list-post\\|x-mailing-list\\|x-beenthere\\|x-loop") + 'append))) + + (with-eval-after-load 'gnus-agent + (setopt gnus-agent-synchronize-flags 'ask)) + + (with-eval-after-load 'gnus-art ; article + (setopt + gnus-buttonized-mime-types + '("multipart/\\(signed\\|encrypted\\)") + 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:" + "^X-Spam_action:" + "^X-Spam_bar:" + "^Message-ID:" + ;; "^References:" + "^List-Id:" + "^Gnus-Warning:") + gnus-visible-headers + (mapconcat #'identity gnus-sorted-header-list "\\|"))) + + ;; `gnus-dired' + (add-hook 'dired-mode-hook #'gnus-dired-mode) + + (with-eval-after-load 'gnus-group + (setopt + gnus-permanently-visible-groups "\\(:INBOX$\\|:gnu$\\)") + (add-hook 'gnus-group-mode-hook #'gnus-topic-mode) + (add-hook 'gnus-group-mode-hook #'gnus-agent-mode)) + + (with-eval-after-load 'gnus-msg + (let ((bandali "Amin Bandali%s - https://kelar.org/~bandali")) + (defvar b/csc-signature + (mapconcat + #'identity + `(,(format bandali ", MMath") + "Systems Committee <syscom@csclub.uwaterloo.ca>" + "Computer Science Club of the University of Waterloo") + "\n"))) + (setopt + gnus-gcc-mark-as-read t + gnus-message-replysign t + gnus-posting-styles + '(("nnimap\\+kelar:.*" + (address "bandali@kelar.org") + ("X-Message-SMTP-Method" "smtp mail.kelar.org 587") + (gcc "nnimap+kelar:INBOX")) + ("nnimap\\+shemshak:.*" + (address "amin@shemshak.org") + ("X-Message-SMTP-Method" "smtp mail.shemshak.org 587") + (gcc "nnimap+shemshak:Sent")) + ("nnimap\\+debian:.*" + (address "bandali@debian.org") + ("X-Message-SMTP-Method" "smtp mail-submit.debian.org 587") + (gcc "nnimap+debian:INBOX")) + ("nnimap\\+gnu:.*" + (address "bandali@gnu.org") + ("X-Message-SMTP-Method" "smtp fencepost.gnu.org 587") + (gcc "nnimap+gnu:INBOX")) + ("nnimap\\+.*:l\\.ubuntu-.*" + (address "bandali@ubuntu.com") + ("X-Message-SMTP-Method" "smtp mail.kelar.org 587")) + ((header "list-id" ".*\\.lists.ubuntu.com") + (address "bandali@ubuntu.com") + ("X-Message-SMTP-Method" "smtp mail.kelar.org 587")) + ("nnimap\\+csc:.*" + (address "bandali@csclub.uwaterloo.ca") + ("X-Message-SMTP-Method" "smtp mail.csclub.uwaterloo.ca 587") + (signature b/csc-signature) + (gcc "nnimap+csc:Sent")))) + + ;; `gnus-registry' + ;; (setopt + ;; gnus-registry-max-entries 2500 + ;; gnus-registry-ignored-groups + ;; (append gnus-registry-ignored-groups + ;; '(("^nnimap:gnu\\.l" t) ("webmasters$" t)))) + ;; (require 'gnus-registry) + ;; (gnus-registry-initialize) + + (with-eval-after-load 'gnus-search + (setopt + gnus-search-use-parsed-queries t)) + + (with-eval-after-load 'gnus-start + (setopt + gnus-save-newsrc-file nil + gnus-read-newsrc-file nil) + (unless (fboundp 'gnus-notifications) + (autoload #'gnus-notifications "gnus-start" nil t)) + (add-hook + 'gnus-after-getting-new-news-hook #'gnus-notifications)) + + (with-eval-after-load 'gnus-sum ; summary + (setopt + gnus-thread-sort-functions + '(gnus-thread-sort-by-number + gnus-thread-sort-by-subject + gnus-thread-sort-by-date)) + + (with-eval-after-load 'message + (setopt + gnus-ignored-from-addresses message-dont-reply-to-names)) + + (defun b/gnus-junk-article (&optional n) + (interactive "P" gnus-summary-mode) + (gnus-summary-move-article + n + (gnus-group-prefixed-name + "Junk" + (gnus-find-method-for-group gnus-newsgroup-name)))) + + (defvar b/gnus-summary-prefix-map) + (define-prefix-command 'b/gnus-summary-prefix-map) + (b/keymap-set + gnus-summary-mode-map "v" 'b/gnus-summary-prefix-map) + (let ((m b/gnus-summary-prefix-map)) + (b/keymap-set m "r r" #'gnus-summary-very-wide-reply) + (b/keymap-set m "r q" #'gnus-summary-very-wide-reply-with-original) + (b/keymap-set m "R r" #'gnus-summary-reply) + (b/keymap-set m "R q" #'gnus-summary-reply-with-original) + (b/keymap-set m "r a w" #'gnus-summary-show-raw-article) + (b/keymap-set m "s" #'b/gnus-junk-article))) + + (with-eval-after-load 'gnus-topic + (setopt + ;; gnus-topic-line-format "%i[ %A: %(%{%n%}%) ]%v\n" + gnus-topic-line-format "%i[ %(%{%n%}%) (%A) ]%v\n") + (setq + gnus-topic-topology + `(("Gnus" visible nil nil) + (("misc" visible nil nil)) + (("csc" visible nil nil)) + (("kelar" visible nil nil)) + (("shemshak" visible nil nil)) + (("debian" visible nil nil)) + (("gnu" visible nil nil)) + ;; (("old-gnu" visible nil nil)) + ))) + + (with-eval-after-load 'gnus-win + (setopt gnus-use-full-window nil)) + + (with-eval-after-load 'mm-archive + (add-to-list + 'mm-archive-decoders + '("application/gzip" nil "gunzip" "-S" ".zip" "-kd" "%f" "-r"))) + + (with-eval-after-load 'mm-decode + (setopt + ;; mm-attachment-override-types `("text/x-diff" "text/x-patch" + ;; ,@mm-attachment-override-types) + mm-discouraged-alternatives '("text/html" "text/richtext") + mm-decrypt-option 'known + mm-verify-option 'known) + (add-to-list + 'mm-inline-media-tests + `("application/gzip" mm-archive-dissect-and-inline identity)) + (add-to-list 'mm-inlined-types "application/gzip" 'append)) + + (with-eval-after-load 'mm-uu + (when (version< "27" emacs-version) + (set-face-attribute 'mm-uu-extract nil :extend t)) + (when (version< emacs-version "27") + (setopt mm-uu-diff-groups-regexp "."))) + + (with-eval-after-load 'mml + (setopt + mml-attach-file-at-the-end t + mml-content-disposition-alist + '((text + (markdown . "attachment") + (rtf . "attachment") + (t . "inline")) + (t . "attachment")))) + + (with-eval-after-load 'mml-sec + (setopt + mml-secure-openpgp-encrypt-to-self t + mml-secure-openpgp-sign-with-sender t)) + + (with-eval-after-load 'recentf + (add-to-list 'recentf-exclude b/maildir) + (add-to-list 'recentf-exclude gnus-home-directory)))) +(b/keymap-global-set "C-c g" #'gnus-plugged) +(b/keymap-global-set "C-c G" #'gnus-unplugged) (provide 'bandali-gnus) ;;; bandali-gnus.el ends here diff --git a/.emacs.d/lisp/bandali-ibuffer.el b/.emacs.d/lisp/bandali-ibuffer.el index 2c4f660..909f7b8 100644 --- a/.emacs.d/lisp/bandali-ibuffer.el +++ b/.emacs.d/lisp/bandali-ibuffer.el @@ -24,23 +24,9 @@ ;;; Code: -(use-package ibuffer - :defer t - :bind - (("C-x C-b" . ibuffer) - :map ibuffer-mode-map - ("P" . ibuffer-backward-filter-group) - ("N" . ibuffer-forward-filter-group) - ("M-p" . ibuffer-do-print) - ("M-n" . ibuffer-do-shell-command-pipe-replace)) - :init - (declare-function - ibuffer-switch-to-saved-filter-groups "ibuf-ext" (name)) - :hook - (ibuffer . (lambda () - (ibuffer-switch-to-saved-filter-groups "default"))) - :custom - (ibuffer-saved-filter-groups +(with-eval-after-load 'ibuffer + (setopt + ibuffer-saved-filter-groups '(("default" ("dired" (mode . dired-mode)) ("erc" (mode . erc-mode)) @@ -60,16 +46,14 @@ (or (mode . tex-mode) (mode . bibtex-mode) - (mode . latex-mode)))))) - :config - (setopt + (mode . latex-mode))))) ibuffer-formats `((mark modified read-only locked " " (name 18 18 :left :elide) - " " (size-h 9 -1 :right) + " " (size-h 9 -1 :right) ; human-readable size " " (mode 16 16 :left :elide) " " filename-and-process) ,@ibuffer-formats)) - ;; Use human readable Size column instead of original one + ;; Use human readable Size column instead of original one. (define-ibuffer-column size-h (:name "Size" :inline t) (cond @@ -79,7 +63,19 @@ (format "%7.0fK" (/ (buffer-size) 1024.0))) ((> (buffer-size) 1024) (format "%7.1fK" (/ (buffer-size) 1024.0))) - (t (format "%8d" (buffer-size)))))) + (t (format "%8d" (buffer-size))))) + + (let ((m ibuffer-mode-map)) + (b/keymap-set m "P" #'ibuffer-backward-filter-group) + (b/keymap-set m "N" #'ibuffer-forward-filter-group) + (b/keymap-set m "M-p" #'ibuffer-do-print) + (b/keymap-set m "M-n" #'ibuffer-do-shell-command-pipe-replace))) +(b/keymap-global-set "C-x C-b" #'ibuffer) +(declare-function + ibuffer-switch-to-saved-filter-groups "ibuf-ext" (name)) +(add-hook + 'ibuffer-hook + (lambda () (ibuffer-switch-to-saved-filter-groups "default"))) (provide 'bandali-ibuffer) ;;; bandali-ibuffer.el ends here diff --git a/.emacs.d/lisp/bandali-message.el b/.emacs.d/lisp/bandali-message.el index da14f82..9bdbec3 100644 --- a/.emacs.d/lisp/bandali-message.el +++ b/.emacs.d/lisp/bandali-message.el @@ -24,9 +24,41 @@ ;;; Code: -(use-package message - :defer t - :init +(with-eval-after-load 'message + ;; Redefine for a simplified In-Reply-To header + ;; (https://todo.sr.ht/~sircmpwn/lists.sr.ht/67) + (defun message-make-in-reply-to () + "Return the In-Reply-To header for this message." + (when message-reply-headers + (let ((from (mail-header-from message-reply-headers)) + (msg-id (mail-header-id message-reply-headers))) + (when from + msg-id)))) + + (setopt + message-elide-ellipsis "[...]\n" + message-citation-line-format "%N wrote:\n" + message-citation-line-function + #'message-insert-formatted-citation-line + message-confirm-send t + message-fill-column 70 + message-forward-as-mime t + ;; message-kill-buffer-on-exit t + message-send-mail-function #'smtpmail-send-it + message-subscribed-address-functions + '(gnus-find-subscribed-addresses) + message-dont-reply-to-names + (mapconcat + #'identity + '("bandali@kelar\\.org" + "amin@shemshak\\.org" + "\\(bandali\\|mab\\|aminb?\\)@gnu\\.org" + "a?bandali@\\(csclub\\.\\)?uwaterloo\\.ca" + "bandali@gnu\\.ca" + "bandali@ubuntu\\.com" + "bandali@debian\\.org") + "\\|")) + (defun b/newlines-or-asterism (arg) "Create newlines per my liking, or insert asterism if ARG is non-nil." @@ -38,46 +70,10 @@ non-nil." (delete-region (point) (line-end-position)) (newline) (open-line 1)))) - :bind - (:map - message-mode-map - ("C-c C-s" . nil) - ("M-RET" . b/newlines-or-asterism)) - :hook - (message-mode . flyspell-mode) - :custom - (message-elide-ellipsis "[...]\n") - (message-citation-line-format "%N wrote:\n") - (message-citation-line-function - #'message-insert-formatted-citation-line) - (message-confirm-send t) - (message-fill-column 70) - (message-forward-as-mime t) - ;; (message-kill-buffer-on-exit t) - (message-send-mail-function #'smtpmail-send-it) - (message-subscribed-address-functions - '(gnus-find-subscribed-addresses)) - (message-dont-reply-to-names - (mapconcat - #'identity - '("bandali@kelar\\.org" - "amin@shemshak\\.org" - "\\(bandali\\|mab\\|aminb?\\)@gnu\\.org" - "a?bandali@\\(csclub\\.\\)?uwaterloo\\.ca" - "bandali@gnu\\.ca" - "bandali@ubuntu\\.com" - "bandali@debian\\.org") - "\\|")) - :config - ;; Redefine for a simplified In-Reply-To header - ;; (https://todo.sr.ht/~sircmpwn/lists.sr.ht/67) - (defun message-make-in-reply-to () - "Return the In-Reply-To header for this message." - (when message-reply-headers - (let ((from (mail-header-from message-reply-headers)) - (msg-id (mail-header-id message-reply-headers))) - (when from - msg-id))))) + (let ((m message-mode-map)) + (b/keymap-set m "M-RET" #'b/newlines-or-asterism) + (b/keymap-set m "C-c C-s" nil))) +(add-hook 'message-mode-hook #'flyspell-mode) (provide 'bandali-message) ;;; bandali-message.el ends here diff --git a/.emacs.d/lisp/bandali-misc.el b/.emacs.d/lisp/bandali-misc.el index 1c5bfd2..5390615 100644 --- a/.emacs.d/lisp/bandali-misc.el +++ b/.emacs.d/lisp/bandali-misc.el @@ -24,70 +24,73 @@ ;;; Code: -(use-package debbugs - :ensure t - :bind - ("C-c D d" . debbugs-gnu) - ("C-c D b" . debbugs-gnu-bugs) - ("C-c D e" . (lambda () ; bug-gnu-emacs - (interactive) - (setq debbugs-gnu-current-suppress t) - (debbugs-gnu debbugs-gnu-default-severities - '("emacs")))) - ("C-c D g" . (lambda () ; bug-gnuzilla - (interactive) - (setq debbugs-gnu-current-suppress t) - (debbugs-gnu debbugs-gnu-default-severities - '("gnuzilla"))))) +;; `delight' +(run-with-idle-timer 0.5 nil #'require 'delight nil 'noerror) +(with-eval-after-load 'delight + (delight 'auto-fill-function " f" "simple") + (delight 'abbrev-mode nil "abbrev") + (delight 'completion-preview-mode " cprev" "completion-preview") + (delight 'mml-mode " mml" "mml")) -(use-package ffs - :load-path "lisp/ffs" - ;; :defer 0.5 - :hook - ((ffs-start - . - (lambda () - (mapc - (lambda (mode) (funcall mode 1)) ; enable - '(ffs--no-mode-line-minor-mode - ffs--no-cursor-minor-mode)) - (mapc - (lambda (mode) (funcall mode -1)) ; disable - '(show-paren-local-mode - display-battery-mode - display-fill-column-indicator-mode - flyspell-mode - tool-bar-mode - menu-bar-mode - scroll-bar-mode)) - (fringe-mode 0))) - (ffs-quit - . - (lambda () - (mapc - (lambda (mode) (funcall mode -1)) ; disable - '(ffs--no-mode-line-minor-mode - ffs--no-cursor-minor-mode)) - (mapc - (lambda (mode) (funcall mode 1)) ; enable - '(show-paren-local-mode - display-battery-mode - display-fill-column-indicator-mode - flyspell-mode - tool-bar-mode - menu-bar-mode - scroll-bar-mode)) - (fringe-mode nil)))) - :commands ffs - :bind - ("C-c f s" . ffs) - :custom - (ffs-default-face-height 250)) +;; `debbugs' +(b/keymap-global-set "C-c D d" #'debbugs-gnu) +(b/keymap-global-set "C-c D b" #'debbugs-gnu-bugs) +(b/keymap-global-set "C-c D e" ; bug-gnu-emacs + (lambda () + (interactive) + (setq debbugs-gnu-current-suppress t) + (debbugs-gnu debbugs-gnu-default-severities + '("emacs")))) +(b/keymap-global-set "C-c D g" ; bug-gnuzilla + (lambda () + (interactive) + (setq debbugs-gnu-current-suppress t) + (debbugs-gnu debbugs-gnu-default-severities + '("gnuzilla")))) -(use-package debian-el - :load-path "lisp/debian-el" - :defer 0.5 - :config +(add-to-list 'load-path (b/emacs.d "lisp/ffs")) +;; (run-with-idle-timer 0.5 nil #'require 'ffs) +(with-eval-after-load 'ffs + (setopt ffs-default-face-height 250)) +(add-hook 'ffs-start-hook + (lambda () + (mapc + (lambda (mode) (funcall mode 1)) ; enable + '(ffs--no-mode-line-minor-mode + ffs--no-cursor-minor-mode)) + (mapc + (lambda (mode) (funcall mode -1)) ; disable + '(show-paren-local-mode + display-battery-mode + display-fill-column-indicator-mode + flyspell-mode + tool-bar-mode + menu-bar-mode + scroll-bar-mode)) + (fringe-mode 0))) +(add-hook 'ffs-quit-hook + (lambda () + (mapc + (lambda (mode) (funcall mode -1)) ; disable + '(ffs--no-mode-line-minor-mode + ffs--no-cursor-minor-mode)) + (mapc + (lambda (mode) (funcall mode 1)) ; enable + '(show-paren-local-mode + display-battery-mode + display-fill-column-indicator-mode + flyspell-mode + tool-bar-mode + menu-bar-mode + scroll-bar-mode)) + (fringe-mode nil))) +(unless (fboundp 'ffs) + (autoload #'ffs "ffs" nil t)) +(b/keymap-global-set "C-c f s" #'ffs) + +(add-to-list 'load-path (b/emacs.d "lisp/debian-el")) +(run-with-idle-timer 0.5 nil #'require 'debian-el) +(with-eval-after-load 'debian-el (require 'apt-sources) (require 'apt-utils) (require 'debian-bug) @@ -95,10 +98,9 @@ (require 'gnus-BTS) (require 'preseed)) -(use-package dpkg-dev-el - :load-path "lisp/dpkg-dev-el" - :defer 0.5 - :config +(add-to-list 'load-path (b/emacs.d "lisp/dpkg-dev-el")) +(run-with-idle-timer 0.5 nil #'require 'dpkg-dev-el) +(with-eval-after-load 'dpkg-dev-el (require 'debian-changelog-mode) (require 'debian-bts-control) (require 'debian-changelog-mode) diff --git a/.emacs.d/lisp/bandali-prog.el b/.emacs.d/lisp/bandali-prog.el index f777f88..c732ab5 100644 --- a/.emacs.d/lisp/bandali-prog.el +++ b/.emacs.d/lisp/bandali-prog.el @@ -24,41 +24,35 @@ ;;; Code: -(use-package elisp-mode - :bind - ("C-c e e" . eval-last-sexp)) - -(use-package pp - :bind - ("C-c e m" . pp-macroexpand-last-sexp)) - -(use-package lisp-mode - :hook - (lisp-interaction-mode . (lambda () (setq-local indent-tabs-mode nil)))) - -(use-package alloy-mode - :disabled - :load-path "lisp/alloy-mode" - :mode "\\.\\(als\\|dsh\\)\\'" - :hook - (alloy-mode . (lambda nil (setq-local indent-tabs-mode nil))) - :init - (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 - (;; ("TAB" . b/alloy-simple-indent) - "RET" . electric-newline-and-maybe-indent)) - :custom - (alloy-basic-offset 2)) +;; `elisp-mode' +(b/keymap-global-set "C-c e e" #'eval-last-sexp) + +;; `pp' +(b/keymap-global-set "C-c e m" #'pp-macroexpand-last-sexp) + +;; `lisp-mode' +(add-hook + 'lisp-interaction-mode-hook #'b/setq-local-indent-tabs-mode-nil) + +;; (add-to-list 'load-path (b/lisp "alloy-mode")) +;; (with-eval-after-load 'alloy-mode +;; (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))) +;; (define-key alloy-mode-map (kbd "RET") #'electric-newline-and-maybe-indent) +;; ;; (define-key alloy-mode-map (kbd "TAB") #'b/alloy-simple-indent) +;; (define-key alloy-mode-map (kbd "TAB") #'indent-for-tab-command)) +;; (unless (fboundp 'alloy-mode) +;; (autoload #'alloy-mode "alloy-mode" nil t)) +;; (add-to-list 'auto-mode-alist '("\\.\\(als\\|dsh\\)\\'" . alloy-mode)) +;; (add-hook 'alloy-mode-hook #'b/setq-local-indent-tabs-mode-nil) ;; (eval-when-compile (defvar lean-mode-map)) ;; (run-with-idle-timer 0.4 nil #'require 'lean-mode) @@ -73,28 +67,23 @@ ;; ;; local key bindings ;; (define-key lean-mode-map (kbd "S-SPC") #'company-complete)) -(use-package sgml-mode - :defer t - :custom - (sgml-basic-offset 0)) +(with-eval-after-load 'sgml-mode + (setopt sgml-basic-offset 0)) -(use-package css-mode - :defer t - :custom - (css-indent-offset 2)) +(with-eval-after-load 'css-mode + (setopt css-indent-offset 2)) -(use-package cmake-mode - :mode - (("CMakeLists\\.txt\\'" . cmake-mode) - ("\\.cmake\\'" . cmake-mode))) +;; `cmake-mode' +(with-eval-after-load 'cmake-mode + (add-to-list 'load-path (b/emacs.d "lisp/cmake-font-lock")) + (require 'cmake-font-lock)) +(unless (fboundp 'cmake-mode) + (autoload #'cmake-mode "cmake-mode" nil t)) +(add-to-list 'auto-mode-alist '("CMakeLists\\.txt\\'" . cmake-mode)) +(add-to-list 'auto-mode-alist '("\\.cmake\\'" . cmake-mode)) -(use-package cmake-font-lock - :after cmake-mode - :load-path "lisp/cmake-font-lock") - -(use-package reftex - :hook - (latex-mode . reftex-mode)) +;; `reftex' +(add-hook 'latex-mode-hook #'reftex-mode) (provide 'bandali-prog) ;;; bandali-prog.el ends here diff --git a/.emacs.d/lisp/bandali-utils.el b/.emacs.d/lisp/bandali-utils.el index 9edc91e..effeadd 100644 --- a/.emacs.d/lisp/bandali-utils.el +++ b/.emacs.d/lisp/bandali-utils.el @@ -90,5 +90,20 @@ for all frames." (fill-region beg end) (fill-paragraph)))) +(defun b/setq-local-indent-tabs-mode-nil () + "Locally disable indent-tabs-mode. +Useful mainly as a hook for other modes." + (setq-local indent-tabs-mode nil)) + + +;;; Key bindings +(b/keymap-global-set "C-c s c" #'b/*scratch*) +(b/keymap-global-set "C-c d" #'b/duplicate-line-or-region) +(b/keymap-global-set "C-c j" #'b/join-line-top) +(b/keymap-global-set "C-S-j" #'b/join-line-top) +(b/keymap-global-set "C-c v" #'b/invert-default-face) +(b/keymap-global-set "C-c q" #'b/unfill-paragraph-or-region) +(b/keymap-set text-mode-map "M-RET" #'b/insert-asterism) + (provide 'bandali-utils) ;;; bandali-utils.el ends here |