emacs: use alloy-mode for dsh (DASH) files as well
[~bandali/configs] / .emacs.d / init.el
index 8036cf2..76f3eea 100644 (file)
@@ -17,9 +17,9 @@
 
 ;;; Commentary:
 
 
 ;;; Commentary:
 
-;; Emacs configuration of Amin Bandali, computer scientist, functional
-;; programmer, and free software activist.  Uses straight.el for
-;; purely functional and fully reproducible package management.
+;; Emacs configuration of Amin Bandali, computer scientist, free
+;; software activist, GNU maintainer & webmaster.  Uses straight.el
+;; for purely functional and fully reproducible package management.
 
 ;; Over the years, I've taken inspiration from configurations of many
 ;; great people.  Some that I can remember off the top of my head are:
 
 ;; Over the years, I've taken inspiration from configurations of many
 ;; great people.  Some that I can remember off the top of my head are:
   (previous-line)
   (insert "\n\f\n;;; "))
 
   (previous-line)
   (insert "\n\f\n;;; "))
 
+;; (defvar b/fill-column 47
+;;   "My custom `fill-column'.")
+
+(defconst b/asterism "* * *")
+
 (defun b/insert-asterism ()
 (defun b/insert-asterism ()
+  "Insert a centred asterism."
   (interactive)
   (interactive)
-  (insert "\n\n                                 * * *\n\n"))
+  (insert
+   (concat
+    "\n\n"
+    (make-string (floor (/ (- fill-column (length b/asterism)) 2))
+                 ?\s)
+    b/asterism
+    "\n\n")))
 
 (defun b/no-mouse-autoselect-window ()
   "Conveniently disable `focus-follows-mouse'.
 
 (defun b/no-mouse-autoselect-window ()
   "Conveniently disable `focus-follows-mouse'.
@@ -543,12 +555,13 @@ For disabling the behaviour for certain buffers and/or modes."
  ;; for back and forward mouse keys
  ("<XF86Back>"     . previous-buffer)
  ("<mouse-8>"      . previous-buffer)
  ;; for back and forward mouse keys
  ("<XF86Back>"     . previous-buffer)
  ("<mouse-8>"      . previous-buffer)
- ("<drag-mouse-8>" . previous-buffer)
;; ("<drag-mouse-8>" . previous-buffer)
  ("<XF86Forward>"  . next-buffer)
  ("<mouse-9>"      . next-buffer)
  ("<XF86Forward>"  . next-buffer)
  ("<mouse-9>"      . next-buffer)
- ("<drag-mouse-9>" . next-buffer)
- ("<drag-mouse-2>" . kill-this-buffer)
- ("<drag-mouse-3>" . switch-to-buffer))
+ ;; ("<drag-mouse-9>" . next-buffer)
+ ;; ("<drag-mouse-2>" . kill-this-buffer)
+ ;; ("<drag-mouse-3>" . switch-to-buffer)
+ )
 
 (bind-keys
  :prefix-map b/straight-prefix-map
 
 (bind-keys
  :prefix-map b/straight-prefix-map
@@ -1019,9 +1032,10 @@ This function is intended for use with `ivy-ignore-buffers'."
 
   (ivy-mode 1)
   :custom-face
 
   (ivy-mode 1)
   :custom-face
+  (ivy-minibuffer-match-face-1 ((t (:background "#eeeeee"))))
   (ivy-minibuffer-match-face-2 ((t (:background "#e7e7e7" :weight bold))))
   (ivy-minibuffer-match-face-2 ((t (:background "#e7e7e7" :weight bold))))
-  (ivy-minibuffer-match-face-3 ((t (:background "#bbbbff" :weight semi-bold))))
-  (ivy-minibuffer-match-face-4 ((t (:background "#ffbbff" :weight semi-bold))))
+  (ivy-minibuffer-match-face-3 ((t (:background "light goldenrod" :weight semi-bold))))
+  (ivy-minibuffer-match-face-4 ((t (:background "misty rose" :weight semi-bold))))
   (ivy-current-match ((((class color) (background light))
                        :background "#d7d7d7" :foreground "black")
                       (((class color) (background dark))
   (ivy-current-match ((((class color) (background light))
                        :background "#d7d7d7" :foreground "black")
                       (((class color) (background dark))
@@ -1030,16 +1044,14 @@ This function is intended for use with `ivy-ignore-buffers'."
 (use-package swiper
   :demand
   :after ivy
 (use-package swiper
   :demand
   :after ivy
-  :bind (("C-s"   . swiper-isearch)
-         ("C-r"   . swiper-isearch-backward)
-         ("C-S-s" . swiper-isearch)))
+  :bind (("C-S-s" . swiper-isearch)))
 
 (use-package counsel
 
 (use-package counsel
-  :bind (;; ([remap execute-extended-command] . counsel-M-x)
-         ;; ([remap find-file]                . counsel-find-file)
-         ("C-c f r" . counsel-recentf)
+  :demand
+  :after ivy
+  :bind (("C-c f r" . counsel-recentf)
          :map minibuffer-local-map
          :map minibuffer-local-map
-              ("C-r" . counsel-minibuffer-history))
+         ("C-r" . counsel-minibuffer-history))
   :config
   (counsel-mode 1)
   (defalias 'locate #'counsel-locate))
   :config
   (counsel-mode 1)
   (defalias 'locate #'counsel-locate))
@@ -1087,7 +1099,8 @@ This function is intended for use with `ivy-ignore-buffers'."
                ("C-S-l" . b/eshell-clear)
                ("M-r"   . counsel-esh-history)
                ;; ([tab]   . company-complete)
                ("C-S-l" . b/eshell-clear)
                ("M-r"   . counsel-esh-history)
                ;; ([tab]   . company-complete)
-               ))
+               :map eshell-hist-mode-map
+               ("M-r" . counsel-esh-history)))
 
   :hook (eshell-mode . b/eshell-setup)
   :custom
 
   :hook (eshell-mode . b/eshell-setup)
   :custom
@@ -1313,7 +1326,8 @@ This function is intended for use with `ivy-ignore-buffers'."
 
 (use-feature text-mode
   :bind (:map text-mode-map ("C-*" . b/insert-asterism))
 
 (use-feature text-mode
   :bind (:map text-mode-map ("C-*" . b/insert-asterism))
-  :hook (text-mode . indicate-buffer-boundaries-left))
+  :hook ((text-mode . indicate-buffer-boundaries-left)
+         (text-mode . flyspell-mode)))
 
 (use-feature conf-mode
   :mode "\\.*rc$")
 
 (use-feature conf-mode
   :mode "\\.*rc$")
@@ -1401,8 +1415,22 @@ This function is intended for use with `ivy-ignore-buffers'."
 
 (use-package alloy-mode
   :straight (:host github :repo "dwwmmn/alloy-mode")
 
 (use-package alloy-mode
   :straight (:host github :repo "dwwmmn/alloy-mode")
-  :mode "\\.als\\'"
-  :config (setq alloy-basic-offset 2)
+  :mode "\\.\\(als\\|dsh\\)\\'"
+  :config
+  (setq alloy-basic-offset 2)
+  ;; (defun b/alloy-simple-indent (start end)
+  ;;   (interactive "r")
+  ;;   ;; (if (region-active-p)
+  ;;   ;;     (indent-rigidly start end alloy-basic-offset)
+  ;;   ;;   (if (bolp)
+  ;;   ;;       (indent-rigidly (line-beginning-position)
+  ;;   ;;                       (line-end-position)
+  ;;   ;;                       alloy-basic-offset)))
+  ;;   (indent-to (+ (current-column) alloy-basic-offset)))
+  :bind (:map alloy-mode-map
+              ("RET" . electric-newline-and-maybe-indent)
+              ;; ("TAB" . b/alloy-simple-indent)
+              ("TAB" . indent-for-tab-command))
   :hook (alloy-mode . (lambda () (setq-local indent-tabs-mode nil))))
 
 (eval-when-compile (defvar lean-mode-map))
   :hook (alloy-mode . (lambda () (setq-local indent-tabs-mode nil))))
 
 (eval-when-compile (defvar lean-mode-map))
@@ -1461,7 +1489,9 @@ This function is intended for use with `ivy-ignore-buffers'."
   (b/setq-every 2
     web-mode-code-indent-offset
     web-mode-css-indent-offset
   (b/setq-every 2
     web-mode-code-indent-offset
     web-mode-css-indent-offset
-    web-mode-markup-indent-offset))
+    web-mode-markup-indent-offset)
+  :custom
+  (web-mode-enable-auto-indentation nil))
 
 (use-package emmet-mode
   :after (:any web-mode css-mode sgml-mode)
 
 (use-package emmet-mode
   :after (:any web-mode css-mode sgml-mode)
@@ -1675,10 +1705,10 @@ This function is intended for use with `ivy-ignore-buffers'."
     ;; prefixes for global prefixes and minor modes
     "C-c @"   "outline"
     "C-c !"   "flycheck"
     ;; prefixes for global prefixes and minor modes
     "C-c @"   "outline"
     "C-c !"   "flycheck"
-    "C-c 8"   "typo"
-    "C-c 8 -" "typo/dashes"
-    "C-c 8 <" "typo/left-brackets"
-    "C-c 8 >" "typo/right-brackets"
+    ;; "C-c 8"   "typo"
+    ;; "C-c 8 -" "typo/dashes"
+    ;; "C-c 8 <" "typo/left-brackets"
+    ;; "C-c 8 >" "typo/right-brackets"
     "C-x RET" "coding system"
     "C-x 8"   "unicode"
     "C-x @"   "event modifiers"
     "C-x RET" "coding system"
     "C-x 8"   "unicode"
     "C-x @"   "event modifiers"
@@ -1736,7 +1766,7 @@ This function is intended for use with `ivy-ignore-buffers'."
 (use-package crux            ; results in Waiting for git... [2 times]
   :defer 0.4
   :bind (("C-c d"   . crux-duplicate-current-line-or-region)
 (use-package crux            ; results in Waiting for git... [2 times]
   :defer 0.4
   :bind (("C-c d"   . crux-duplicate-current-line-or-region)
-         ("C-c D"   . crux-duplicate-and-comment-current-line-or-region)
+         ("C-c M-d" . crux-duplicate-and-comment-current-line-or-region)
          ("C-c f C" . crux-copy-file-preserve-attributes)
          ("C-c f D" . crux-delete-file-and-buffer)
          ("C-c f R" . crux-rename-file-and-buffer)
          ("C-c f C" . crux-copy-file-preserve-attributes)
          ("C-c f D" . crux-delete-file-and-buffer)
          ("C-c f R" . crux-rename-file-and-buffer)
@@ -1777,7 +1807,7 @@ This function is intended for use with `ivy-ignore-buffers'."
        (advice-add 'magit-branch-and-checkout
                    :after #'my-projectile-invalidate-cache)))
   :custom
        (advice-add 'magit-branch-and-checkout
                    :after #'my-projectile-invalidate-cache)))
   :custom
-  ;; (projectile-completion-system 'ivy)
+  (projectile-completion-system 'ivy)
   (projectile-mode-line-prefix " proj"))
 
 (use-package helpful
   (projectile-mode-line-prefix " proj"))
 
 (use-package helpful
@@ -1833,12 +1863,19 @@ This function is intended for use with `ivy-ignore-buffers'."
 
 ;; easily type pretty quotes & other typography, like ‘’“”-–—«»‹›
 (use-package typo
 
 ;; easily type pretty quotes & other typography, like ‘’“”-–—«»‹›
 (use-package typo
+  :disabled
   :defer 0.5
   :config
   (typo-global-mode 1)
   :hook (((text-mode erc-mode web-mode) . typo-mode)
          (tex-mode                      . (lambda ()(typo-mode -1)))))
 
   :defer 0.5
   :config
   (typo-global-mode 1)
   :hook (((text-mode erc-mode web-mode) . typo-mode)
          (tex-mode                      . (lambda ()(typo-mode -1)))))
 
+(use-feature electric
+  :disabled
+  :demand
+  :config
+  (electric-quote-mode))
+
 ;; highlight TODOs in buffers
 (use-package hl-todo
   :defer 0.5
 ;; highlight TODOs in buffers
 (use-package hl-todo
   :defer 0.5
@@ -1967,7 +2004,24 @@ This function is intended for use with `ivy-ignore-buffers'."
   :straight (debbugs
              :host github
              :repo "emacs-straight/debbugs"
   :straight (debbugs
              :host github
              :repo "emacs-straight/debbugs"
-             :files (:defaults "Debbugs.wsdl")))
+             :files (:defaults "Debbugs.wsdl"))
+  :bind
+  (("C-c D d" . debbugs-gnu)
+   ("C-c D e" .
+    (lambda ()
+      (interactive)
+      (setq debbugs-gnu-current-suppress t)
+      (debbugs-gnu debbugs-gnu-default-severities '("emacs"))))
+   ("C-c D g" .
+    (lambda ()
+      (interactive)
+      (setq debbugs-gnu-current-suppress t)
+      (debbugs-gnu debbugs-gnu-default-severities '("gnuzilla"))))
+   ("C-c D G" .
+    (lambda ()
+      (interactive)
+      (setq debbugs-gnu-current-suppress t)
+      (debbugs-gnu debbugs-gnu-default-severities '("guix"))))))
 
 (use-package org-ref
   :init
 
 (use-package org-ref
   :init
@@ -2115,6 +2169,12 @@ This function is intended for use with `ivy-ignore-buffers'."
   :custom
   (debpaste-paste-is-hidden t))
 
   :custom
   (debpaste-paste-is-hidden t))
 
+(use-package scpaste
+  :disabled
+  :config
+  (setq scpaste-http-destination "https://p.bndl.org"
+        scpaste-scp-destination "nix:/var/www/p.bndl.org"))
+
 \f
 ;;; Email (with Gnus)
 
 \f
 ;;; Email (with Gnus)
 
@@ -2155,6 +2215,10 @@ This function is intended for use with `ivy-ignore-buffers'."
                                   ;; (: gnus-group-split-fancy "INBOX" t "INBOX")
                                   ;; gnu
                                   (list ".*<\\(.*\\)\\.\\(non\\)?gnu\\.org>.*" "l.\\1")
                                   ;; (: gnus-group-split-fancy "INBOX" t "INBOX")
                                   ;; gnu
                                   (list ".*<\\(.*\\)\\.\\(non\\)?gnu\\.org>.*" "l.\\1")
+                                  ;; gnus
+                                  (list ".*<\\(.*\\)\\.gnus\\.org>.*" "l.\\1")
+                                  ;; libreplanet
+                                  (list ".*<\\(.*\\)\\.libreplanet\\.org>.*" "l.\\1")
                                   ;; *.lists.sr.ht, omitting one dot if present
                                   ;;    add more \\.?\\([^.]*\\) if needed
                                   (list ".*<~\\(.*\\)/\\([^.]*\\)\\.?\\([^.]*\\)\\.lists.sr.ht>.*" "l.~\\1.\\2\\3")
                                   ;; *.lists.sr.ht, omitting one dot if present
                                   ;;    add more \\.?\\([^.]*\\) if needed
                                   (list ".*<~\\(.*\\)/\\([^.]*\\)\\.?\\([^.]*\\)\\.lists.sr.ht>.*" "l.~\\1.\\2\\3")
@@ -2327,7 +2391,7 @@ This function is intended for use with `ivy-ignore-buffers'."
       (to-list    . "webmasters@gnu.org"))
      ("gnu.*"
       (gcc-self . t))
       (to-list    . "webmasters@gnu.org"))
      ("gnu.*"
       (gcc-self . t))
-     ("gnu\\."
+     ("l\\."
       (subscribed . t))
      ("nnimap\\+uw:.*"
       (gcc-self . t)))
       (subscribed . t))
      ("nnimap\\+uw:.*"
       (gcc-self . t)))
@@ -2420,10 +2484,6 @@ This function is intended for use with `ivy-ignore-buffers'."
 
 (use-feature gnus-msg
   :config
 
 (use-feature gnus-msg
   :config
-  (defvar b/gnu-signature "Amin Bandali
-Free Software Activist | GNU Maintainer & Webmaster
-GPG: BE62 7373 8E61 6D6D 1B3A  08E8 A21A 0202 4881 6103
-https://bandali.eu.org")
   (defvar b/shemshak-signature "Amin Bandali
 https://shemshak.org/~amin")
   (defvar b/uw-signature "Amin Bandali, MMath Student
   (defvar b/shemshak-signature "Amin Bandali
 https://shemshak.org/~amin")
   (defvar b/uw-signature "Amin Bandali, MMath Student
@@ -2437,8 +2497,7 @@ https://csclub.uwaterloo.ca/~abandali")
   (setq gnus-message-replysign t
         gnus-posting-styles
         '((".*"
   (setq gnus-message-replysign t
         gnus-posting-styles
         '((".*"
-           (address "bandali@gnu.org")
-           (signature b/gnu-signature))
+           (address "bandali@gnu.org"))
           ("nnimap\\+gnu:l\\..*"
            (signature nil))
           ((header "subject" "ThankCRM")
           ("nnimap\\+gnu:l\\..*"
            (signature nil))
           ((header "subject" "ThankCRM")
@@ -2461,8 +2520,9 @@ https://csclub.uwaterloo.ca/~abandali")
            (address "bandali@csclub.uwaterloo.ca")
            (signature b/csc-signature)
            (gcc "nnimap+csc:Sent"))))
            (address "bandali@csclub.uwaterloo.ca")
            (signature b/csc-signature)
            (gcc "nnimap+csc:Sent"))))
-  ;; :hook (gnus-message-setup . mml-secure-message-sign)
-  )
+  :hook (gnus-message-setup . (lambda ()
+                                (unless (mml-secure-is-encrypted-p)
+                                  (mml-secure-message-sign)))))
 
 (use-feature gnus-topic
   :hook (gnus-group-mode . gnus-topic-mode)
 
 (use-feature gnus-topic
   :hook (gnus-group-mode . gnus-topic-mode)
@@ -2500,6 +2560,8 @@ https://csclub.uwaterloo.ca/~abandali")
         mm-verify-option 'known))
 
 (use-feature mm-uu
         mm-verify-option 'known))
 
 (use-feature mm-uu
+  :config
+  (set-face-attribute 'mm-uu-extract nil :extend t)
   :custom
   (mm-uu-diff-groups-regexp
    "\\(gmane\\|gnu\\|l\\)\\..*\\(diff\\|commit\\|cvs\\|bug\\|dev\\)"))
   :custom
   (mm-uu-diff-groups-regexp
    "\\(gmane\\|gnu\\|l\\)\\..*\\(diff\\|commit\\|cvs\\|bug\\|dev\\)"))
@@ -2549,8 +2611,8 @@ https://csclub.uwaterloo.ca/~abandali")
   :hook (;; (message-setup . mml-secure-message-sign-pgpmime)
          (message-mode . flyspell-mode)
          (message-mode . (lambda ()
   :hook (;; (message-setup . mml-secure-message-sign-pgpmime)
          (message-mode . flyspell-mode)
          (message-mode . (lambda ()
-                           ;; (setq fill-column 65
-                           ;;       message-fill-column 65)
+                           ;; (setq-local fill-column b/fill-column
+                           ;;             message-fill-column b/fill-column)
                            (make-local-variable 'company-idle-delay)
                            (setq company-idle-delay 0.2))))
   ;; :custom-face
                            (make-local-variable 'company-idle-delay)
                            (setq company-idle-delay 0.2))))
   ;; :custom-face
@@ -2585,6 +2647,17 @@ https://csclub.uwaterloo.ca/~abandali")
         ("r" . footnote-renumber-footnotes)
         ("s" . footnote-set-style)))
 
         ("r" . footnote-renumber-footnotes)
         ("s" . footnote-set-style)))
 
+(use-package bbdb
+  :disabled
+  :demand
+  :after gnus
+  :bind (:map gnus-group-mode-map ("e" . bbdb))
+  :config
+  (bbdb-initialize 'gnus 'message)
+  :custom
+  (bbdb-complete-mail-allow-cycling t)
+  (bbdb-user-mail-address-re message-dont-reply-to-names))
+
 (use-package ebdb
   :demand
   :after gnus
 (use-package ebdb
   :demand
   :after gnus
@@ -2701,7 +2774,7 @@ https://csclub.uwaterloo.ca/~abandali")
 (use-feature erc-pcomplete
   :after erc
   :custom
 (use-feature erc-pcomplete
   :after erc
   :custom
-  (erc-pcomplete-nick-postfix ","))
+  (erc-pcomplete-nick-postfix ", "))
 
 (use-feature erc-track
   :after erc
 
 (use-feature erc-track
   :after erc