summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmin Bandali <bandali@kelar.org>2025-02-10 15:05:56 -0500
committerAmin Bandali <bandali@kelar.org>2025-02-10 15:05:56 -0500
commit70026d07d0bef09468b93caabf9a1f425533a69a (patch)
treec5379ac39bff3fb3e818eba88844c136c7e1c239
parent99332da43b8324814ca6c1af7f0076f83c8ce233 (diff)
downloadconfigs-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.el61
-rw-r--r--.emacs.d/lisp/bandali-dired.el45
-rw-r--r--.emacs.d/lisp/bandali-erc.el151
-rw-r--r--.emacs.d/lisp/bandali-eshell.el42
-rw-r--r--.emacs.d/lisp/bandali-essentials.el627
-rw-r--r--.emacs.d/lisp/bandali-gnus.el506
-rw-r--r--.emacs.d/lisp/bandali-ibuffer.el42
-rw-r--r--.emacs.d/lisp/bandali-message.el82
-rw-r--r--.emacs.d/lisp/bandali-misc.el134
-rw-r--r--.emacs.d/lisp/bandali-prog.el97
-rw-r--r--.emacs.d/lisp/bandali-utils.el15
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