emacs: tweak site url in signatures
[~bandali/configs] / .emacs.d / init.el
index b02ab90..c05ceed 100644 (file)
@@ -1,6 +1,6 @@
 ;;; init.el --- Amin Bandali's Emacs config -*- lexical-binding: t -*-
 
 ;;; init.el --- Amin Bandali's Emacs config -*- lexical-binding: t -*-
 
-;; Copyright (C) 2018-2019  Amin Bandali <bandali@gnu.org>
+;; Copyright (C) 2018-2019  Amin Bandali <mab@gnu.org>
 
 ;; This program is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 
 ;; This program is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 
 ;;; Emacs initialization
 
 
 ;;; Emacs initialization
 
-(defvar a/before-user-init-time (current-time)
+(defvar mab/before-user-init-time (current-time)
   "Value of `current-time' when Emacs begins loading `user-init-file'.")
 (message "Loading Emacs...done (%.3fs)"
   "Value of `current-time' when Emacs begins loading `user-init-file'.")
 (message "Loading Emacs...done (%.3fs)"
-         (float-time (time-subtract a/before-user-init-time
+         (float-time (time-subtract mab/before-user-init-time
                                     before-init-time)))
 
 ;; temporarily increase `gc-cons-threshhold' and `gc-cons-percentage'
 ;; during startup to reduce garbage collection frequency.  clearing
 ;; `file-name-handler-alist' seems to help reduce startup time too.
                                     before-init-time)))
 
 ;; temporarily increase `gc-cons-threshhold' and `gc-cons-percentage'
 ;; during startup to reduce garbage collection frequency.  clearing
 ;; `file-name-handler-alist' seems to help reduce startup time too.
-(defvar a/gc-cons-threshold gc-cons-threshold)
-(defvar a/gc-cons-percentage gc-cons-percentage)
-(defvar a/file-name-handler-alist file-name-handler-alist)
+(defvar mab/gc-cons-threshold gc-cons-threshold)
+(defvar mab/gc-cons-percentage gc-cons-percentage)
+(defvar mab/file-name-handler-alist file-name-handler-alist)
 (setq gc-cons-threshold (* 400 1024 1024)  ; 400 MiB
       gc-cons-percentage 0.6
       file-name-handler-alist nil
 (setq gc-cons-threshold (* 400 1024 1024)  ; 400 MiB
       gc-cons-percentage 0.6
       file-name-handler-alist nil
       esup-child-profile-require-level 0)
 
 ;; set them back to their defaults once we're done initializing
       esup-child-profile-require-level 0)
 
 ;; set them back to their defaults once we're done initializing
-(defun a/post-init ()
-  (setq gc-cons-threshold a/gc-cons-threshold
-        gc-cons-percentage a/gc-cons-percentage
-        file-name-handler-alist a/file-name-handler-alist))
-(add-hook 'after-init-hook #'a/post-init)
+(defun mab/post-init ()
+  (setq gc-cons-threshold mab/gc-cons-threshold
+        gc-cons-percentage mab/gc-cons-percentage
+        file-name-handler-alist mab/file-name-handler-alist))
+(add-hook 'after-init-hook #'mab/post-init)
 
 ;; increase number of lines kept in *Messages* log
 (setq message-log-max 20000)
 
 ;; increase number of lines kept in *Messages* log
 (setq message-log-max 20000)
@@ -74,7 +74,7 @@
 ;;; whoami
 
 (setq user-full-name "Amin Bandali"
 ;;; whoami
 
 (setq user-full-name "Amin Bandali"
-      user-mail-address "amin@bndl.org")
+      user-mail-address "amin@shemshak.org")
 
 \f
 ;;; comment macro
 
 \f
 ;;; comment macro
 (setq straight-repository-branch "develop"
       straight-check-for-modifications '(check-on-save find-when-checking))
 
 (setq straight-repository-branch "develop"
       straight-check-for-modifications '(check-on-save find-when-checking))
 
-(defun a/bootstrap-straight ()
+(defun mab/bootstrap-straight ()
   (defvar bootstrap-version)
   (let ((bootstrap-file
          (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
   (defvar bootstrap-version)
   (let ((bootstrap-file
          (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
 
 ;; Solid rocket booster ignition...
 
 
 ;; Solid rocket booster ignition...
 
-(a/bootstrap-straight)
+(mab/bootstrap-straight)
 
 ;; We have lift off!
 
 
 ;; We have lift off!
 
   (add-to-list 'recentf-exclude
                (expand-file-name "~/.emacs.d/straight/build/")))
 
   (add-to-list 'recentf-exclude
                (expand-file-name "~/.emacs.d/straight/build/")))
 
-(defun a/reload-init ()
+(defun mab/reload-init ()
   "Reload init.el."
   (interactive)
   "Reload init.el."
   (interactive)
-  (setq a/file-name-handler-alist file-name-handler-alist)
+  (setq mab/file-name-handler-alist file-name-handler-alist)
   (load user-init-file nil 'nomessage)
   (load user-init-file nil 'nomessage)
-  (a/post-init))
+  (mab/post-init))
 
 ;; use-package
 (straight-use-package 'use-package)
 
 ;; use-package
 (straight-use-package 'use-package)
 ;; focus follows mouse
 (setq mouse-autoselect-window t)
 
 ;; focus follows mouse
 (setq mouse-autoselect-window t)
 
-(defun a/no-mouse-autoselect-window ()
+(defun mab/no-mouse-autoselect-window ()
   "Conveniently disable `focus-follows-mouse'.
 For disabling the behaviour for certain buffers and/or modes."
   (make-local-variable 'mouse-autoselect-window)
   "Conveniently disable `focus-follows-mouse'.
 For disabling the behaviour for certain buffers and/or modes."
   (make-local-variable 'mouse-autoselect-window)
@@ -295,7 +295,19 @@ For disabling the behaviour for certain buffers and/or modes."
   :config (pixel-scroll-mode 1))
 
 ;; ask for GPG passphrase in minibuffer
   :config (pixel-scroll-mode 1))
 
 ;; ask for GPG passphrase in minibuffer
-(setq epg-pinentry-mode 'loopback)
+(use-feature epg-config
+  :defer 0.4
+  :custom
+  ((epg-gpg-program (executable-find "gpg"))
+   (epg-pinentry-mode 'loopback)))
+(use-feature epg
+  :after epg-config)
+(use-package pinentry
+  :demand
+  :after (epg server)
+  :config
+  (setq pinentry--socket-dir server-socket-dir)
+  (pinentry-start))
 
 ;; useful libraries
 (require 'cl-lib)
 
 ;; useful libraries
 (require 'cl-lib)
@@ -304,12 +316,12 @@ For disabling the behaviour for certain buffers and/or modes."
 \f
 ;;; Useful utilities
 
 \f
 ;;; Useful utilities
 
-(defmacro a/setq-every (value &rest vars)
+(defmacro mab/setq-every (value &rest vars)
   "Set all the variables from VARS to value VALUE."
   (declare (indent defun) (debug t))
   `(progn ,@(mapcar (lambda (x) (list 'setq x value)) vars)))
 
   "Set all the variables from VARS to value VALUE."
   (declare (indent defun) (debug t))
   `(progn ,@(mapcar (lambda (x) (list 'setq x value)) vars)))
 
-(defun a/start-process (program &rest args)
+(defun mab/start-process (program &rest args)
   "Same as `start-process', but doesn't bother about name and buffer."
   (let ((process-name (concat program "_process"))
         (buffer-name  (generate-new-buffer-name
   "Same as `start-process', but doesn't bother about name and buffer."
   (let ((process-name (concat program "_process"))
         (buffer-name  (generate-new-buffer-name
@@ -317,15 +329,15 @@ For disabling the behaviour for certain buffers and/or modes."
     (apply #'start-process
            process-name buffer-name program args)))
 
     (apply #'start-process
            process-name buffer-name program args)))
 
-(defun a/dired-start-process (program &optional args)
+(defun mab/dired-start-process (program &optional args)
   "Open current file with a PROGRAM."
   ;; Shell command looks like this: "program [ARGS]... FILE" (ARGS can
   ;; be nil, so remove it).
   "Open current file with a PROGRAM."
   ;; Shell command looks like this: "program [ARGS]... FILE" (ARGS can
   ;; be nil, so remove it).
-  (apply #'a/start-process
+  (apply #'mab/start-process
          program
          (remove nil (list args (dired-get-file-for-visit)))))
 
          program
          (remove nil (list args (dired-get-file-for-visit)))))
 
-(defun a/add-elisp-section ()
+(defun mab/add-elisp-section ()
   (interactive)
   (insert "\n")
   (previous-line)
   (interactive)
   (insert "\n")
   (previous-line)
@@ -413,12 +425,12 @@ For disabling the behaviour for certain buffers and/or modes."
 ;; https://stackoverflow.com/a/17788551, with changes to use `cl-letf'
 ;; instead of the now obsolete `flet'.
 (with-eval-after-load 'compile
 ;; https://stackoverflow.com/a/17788551, with changes to use `cl-letf'
 ;; instead of the now obsolete `flet'.
 (with-eval-after-load 'compile
-  (defun a/compilation-finish-function (buffer outstr)
+  (defun mab/compilation-finish-function (buffer outstr)
     (unless (string-match "finished" outstr)
       (switch-to-buffer-other-window buffer))
     t)
 
     (unless (string-match "finished" outstr)
       (switch-to-buffer-other-window buffer))
     t)
 
-  (setq compilation-finish-functions #'a/compilation-finish-function)
+  (setq compilation-finish-functions #'mab/compilation-finish-function)
 
   (require 'cl-macs)
 
 
   (require 'cl-macs)
 
@@ -473,8 +485,6 @@ For disabling the behaviour for certain buffers and/or modes."
  ("C-c F d" . delete-frame)
  ("C-c F D" . server-edit)
 
  ("C-c F d" . delete-frame)
  ("C-c F D" . server-edit)
 
- ("C-c o"   . other-window)
-
  ("C-S-h C" . describe-char)
  ("C-S-h F" . describe-face)
 
  ("C-S-h C" . describe-char)
  ("C-S-h F" . describe-face)
 
@@ -484,8 +494,10 @@ For disabling the behaviour for certain buffers and/or modes."
  ("s-p"     . beginning-of-buffer)
  ("s-n"     . end-of-buffer)
 
  ("s-p"     . beginning-of-buffer)
  ("s-n"     . end-of-buffer)
 
+ ("M-O"     . facemenu-keymap)
+
  :map emacs-lisp-mode-map
  :map emacs-lisp-mode-map
- ("<C-return>" . a/add-elisp-section))
+ ("<C-return>" . mab/add-elisp-section))
 
 (when (display-graphic-p)
   (unbind-key "C-z" global-map))
 
 (when (display-graphic-p)
   (unbind-key "C-z" global-map))
@@ -500,14 +512,14 @@ For disabling the behaviour for certain buffers and/or modes."
  ("<drag-mouse-3>" . ivy-switch-buffer))
 
 (bind-keys
  ("<drag-mouse-3>" . ivy-switch-buffer))
 
 (bind-keys
- :prefix-map a/straight-prefix-map
+ :prefix-map mab/straight-prefix-map
  :prefix "C-c p s"
  ("u" . straight-use-package)
  ("f" . straight-freeze-versions)
  ("t" . straight-thaw-versions)
  ("P" . straight-prune-build)
  ("g" . straight-get-recipe)
  :prefix "C-c p s"
  ("u" . straight-use-package)
  ("f" . straight-freeze-versions)
  ("t" . straight-thaw-versions)
  ("P" . straight-prune-build)
  ("g" . straight-get-recipe)
- ("r" . a/reload-init)
+ ("r" . mab/reload-init)
  ;; M-x ^straight-.*-all$
  ("a c" . straight-check-all)
  ("a f" . straight-fetch-all)
  ;; M-x ^straight-.*-all$
  ("a c" . straight-check-all)
  ("a f" . straight-fetch-all)
@@ -600,13 +612,13 @@ For disabling the behaviour for certain buffers and/or modes."
 ;; org file.  closely inspired by
 ;; https://github.com/dieggsy/dotfiles/tree/cc10edf7701958eff1cd94d4081da544d882a28c/emacs.d#dotfiles
 (with-eval-after-load 'org
 ;; org file.  closely inspired by
 ;; https://github.com/dieggsy/dotfiles/tree/cc10edf7701958eff1cd94d4081da544d882a28c/emacs.d#dotfiles
 (with-eval-after-load 'org
-  (defvar a/show-async-tangle-results nil
+  (defvar mab/show-async-tangle-results nil
     "Keep *emacs* async buffers around for later inspection.")
 
     "Keep *emacs* async buffers around for later inspection.")
 
-  (defvar a/show-async-tangle-time nil
+  (defvar mab/show-async-tangle-time nil
     "Show the time spent tangling the file.")
 
     "Show the time spent tangling the file.")
 
-  (defun a/async-babel-tangle ()
+  (defun mab/async-babel-tangle ()
     "Tangle org file asynchronously."
     (interactive)
     (let* ((file-tangle-start-time (current-time))
     "Tangle org file asynchronously."
     (interactive)
     (let* ((file-tangle-start-time (current-time))
@@ -618,12 +630,12 @@ For disabling the behaviour for certain buffers and/or modes."
        `(lambda ()
           (require 'org)
           (org-babel-tangle-file ,file))
        `(lambda ()
           (require 'org)
           (org-babel-tangle-file ,file))
-       (unless a/show-async-tangle-results
+       (unless mab/show-async-tangle-results
          `(lambda (result)
             (if result
                 (message "Tangled %s%s"
                          ,file-nodir
          `(lambda (result)
             (if result
                 (message "Tangled %s%s"
                          ,file-nodir
-                         (if a/show-async-tangle-time
+                         (if mab/show-async-tangle-time
                              (format " (%.3fs)"
                                      (float-time (time-subtract (current-time)
                                                                 ',file-tangle-start-time)))
                              (format " (%.3fs)"
                                      (float-time (time-subtract (current-time)
                                                                 ',file-tangle-start-time)))
@@ -632,7 +644,7 @@ For disabling the behaviour for certain buffers and/or modes."
 
 (add-to-list
  'safe-local-variable-values
 
 (add-to-list
  'safe-local-variable-values
- '(eval add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local))
+ '(eval add-hook 'after-save-hook #'mab/async-babel-tangle 'append 'local))
 
 ;; *the* right way to do git
 (use-package magit
 
 ;; *the* right way to do git
 (use-package magit
@@ -657,8 +669,8 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-feature recentf
   :defer 0.2
   :config
 (use-feature recentf
   :defer 0.2
   :config
-  (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
-  (setq recentf-max-saved-items 40))
+  ;; (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:")
+  (setq recentf-max-saved-items 2000))
 
 ;; smart M-x enhancement (needed by counsel for history)
 (use-package smex)
 
 ;; smart M-x enhancement (needed by counsel for history)
 (use-package smex)
@@ -731,29 +743,29 @@ For disabling the behaviour for certain buffers and/or modes."
   :bind ("C-c a s e" . eshell)
   :config
   (eval-when-compile (defvar eshell-prompt-regexp))
   :bind ("C-c a s e" . eshell)
   :config
   (eval-when-compile (defvar eshell-prompt-regexp))
-  (defun a/eshell-quit-or-delete-char (arg)
+  (defun mab/eshell-quit-or-delete-char (arg)
     (interactive "p")
     (if (and (eolp) (looking-back eshell-prompt-regexp nil))
         (eshell-life-is-too-much)
       (delete-char arg)))
 
     (interactive "p")
     (if (and (eolp) (looking-back eshell-prompt-regexp nil))
         (eshell-life-is-too-much)
       (delete-char arg)))
 
-  (defun a/eshell-clear ()
+  (defun mab/eshell-clear ()
     (interactive)
     (let ((inhibit-read-only t))
       (erase-buffer))
     (eshell-send-input))
 
     (interactive)
     (let ((inhibit-read-only t))
       (erase-buffer))
     (eshell-send-input))
 
-  (defun a/eshell-setup ()
+  (defun mab/eshell-setup ()
     (make-local-variable 'company-idle-delay)
     (defvar company-idle-delay)
     (setq company-idle-delay nil)
     (bind-keys :map eshell-mode-map
     (make-local-variable 'company-idle-delay)
     (defvar company-idle-delay)
     (setq company-idle-delay nil)
     (bind-keys :map eshell-mode-map
-               ("C-d"   . a/eshell-quit-or-delete-char)
-               ("C-S-l" . a/eshell-clear)
+               ("C-d"   . mab/eshell-quit-or-delete-char)
+               ("C-S-l" . mab/eshell-clear)
                ("M-r"   . counsel-esh-history)
                ([tab]   . company-complete)))
 
                ("M-r"   . counsel-esh-history)
                ([tab]   . company-complete)))
 
-  :hook (eshell-mode . a/eshell-setup)
+  :hook (eshell-mode . mab/eshell-setup)
   :custom
   (eshell-hist-ignoredups t)
   (eshell-input-filter 'eshell-input-filter-initial-space))
   :custom
   (eshell-hist-ignoredups t)
   (eshell-input-filter 'eshell-input-filter-initial-space))
@@ -841,8 +853,8 @@ For disabling the behaviour for certain buffers and/or modes."
    ("<s-tab>"  . outline-toggle-children)
    ("M-p"      . outline-previous-visible-heading)
    ("M-n"      . outline-next-visible-heading)
    ("<s-tab>"  . outline-toggle-children)
    ("M-p"      . outline-previous-visible-heading)
    ("M-n"      . outline-next-visible-heading)
-   :prefix-map a/outline-prefix-map
-   :prefix "s-o"
+   :prefix-map mab/outline-prefix-map
+   :prefix "s-O"
    ("TAB" . outline-toggle-children)
    ("a"   . outline-hide-body)
    ("H"   . outline-hide-body)
    ("TAB" . outline-toggle-children)
    ("a"   . outline-hide-body)
    ("H"   . outline-hide-body)
@@ -899,7 +911,7 @@ For disabling the behaviour for certain buffers and/or modes."
               ("\\" . dired-hide-details-mode)
               ("z"  . (lambda ()
                         (interactive)
               ("\\" . dired-hide-details-mode)
               ("z"  . (lambda ()
                         (interactive)
-                        (a/dired-start-process "zathura"))))
+                        (mab/dired-start-process "zathura"))))
   :hook (dired-mode . dired-hide-details-mode))
 
 (use-feature help
   :hook (dired-mode . dired-hide-details-mode))
 
 (use-feature help
@@ -1016,7 +1028,8 @@ For disabling the behaviour for certain buffers and/or modes."
   ;; â€™ can be part of a word
   (setq ispell-local-dictionary-alist
         `((nil "[[:alpha:]]" "[^[:alpha:]]"
   ;; â€™ can be part of a word
   (setq ispell-local-dictionary-alist
         `((nil "[[:alpha:]]" "[^[:alpha:]]"
-               "['\x2019]" nil ("-B") nil utf-8)))
+               "['\x2019]" nil ("-B") nil utf-8))
+        ispell-program-name (executable-find "hunspell"))
   ;; don't send â€™ to the subprocess
   (defun endless/replace-apostrophe (args)
     (cons (replace-regexp-in-string
   ;; don't send â€™ to the subprocess
   (defun endless/replace-apostrophe (args)
     (cons (replace-regexp-in-string
@@ -1111,7 +1124,7 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-package web-mode
   :mode "\\.html\\'"
   :config
 (use-package web-mode
   :mode "\\.html\\'"
   :config
-  (a/setq-every 2
+  (mab/setq-every 2
     web-mode-code-indent-offset
     web-mode-css-indent-offset
     web-mode-markup-indent-offset))
     web-mode-code-indent-offset
     web-mode-css-indent-offset
     web-mode-markup-indent-offset))
@@ -1212,6 +1225,10 @@ For disabling the behaviour for certain buffers and/or modes."
 
 (use-package go-mode)
 
 
 (use-package go-mode)
 
+(use-package po-mode
+  :hook
+  (po-mode . (lambda () (run-with-timer 0.1 nil 'View-exit))))
+
 \f
 ;;; Theme
 
 \f
 ;;; Theme
 
@@ -1222,37 +1239,38 @@ For disabling the behaviour for certain buffers and/or modes."
   :commands (sml/apply-theme)
   :demand
   :config
   :commands (sml/apply-theme)
   :demand
   :config
-  (sml/setup))
+  (sml/setup)
+  (smart-mode-line-enable))
 
 (use-package doom-themes)
 
 
 (use-package doom-themes)
 
-(defvar a/org-mode-font-lock-keywords
+(defvar mab/org-mode-font-lock-keywords
   '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)"
       (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive
       (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind
       (4 '(:foreground "#c5c8c6") t))))                    ; title
 
   '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)"
       (1 '(:foreground "#5a5b5a" :background "#292b2b") t) ; directive
       (3 '(:foreground "#81a2be" :background "#292b2b") t) ; kind
       (4 '(:foreground "#c5c8c6") t))))                    ; title
 
-(defun a/lights-on ()
+(defun mab/lights-on ()
   "Enable my favourite light theme."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
   (load-theme 'tangomod t)
   (sml/apply-theme 'automatic)
   (font-lock-remove-keywords
   "Enable my favourite light theme."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
   (load-theme 'tangomod t)
   (sml/apply-theme 'automatic)
   (font-lock-remove-keywords
-   'org-mode a/org-mode-font-lock-keywords))
+   'org-mode mab/org-mode-font-lock-keywords))
 
 
-(defun a/lights-off ()
+(defun mab/lights-off ()
   "Go dark."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
   (load-theme 'doom-tomorrow-night t)
   (sml/apply-theme 'automatic)
   (font-lock-add-keywords
   "Go dark."
   (interactive)
   (mapc #'disable-theme custom-enabled-themes)
   (load-theme 'doom-tomorrow-night t)
   (sml/apply-theme 'automatic)
   (font-lock-add-keywords
-   'org-mode a/org-mode-font-lock-keywords t))
+   'org-mode mab/org-mode-font-lock-keywords t))
 
 (bind-keys
 
 (bind-keys
- ("s-t d" . a/lights-off)
- ("s-t l" . a/lights-on))
+ ("s-t d" . mab/lights-off)
+ ("s-t l" . mab/lights-on))
 
 \f
 ;;; Emacs enhancements & auxiliary packages
 
 \f
 ;;; Emacs enhancements & auxiliary packages
@@ -1298,7 +1316,7 @@ For disabling the behaviour for certain buffers and/or modes."
     "C-c P 4" "projectile/other-window"
     "C-c q"   "boxquote"
     "s-g"     "magit"
     "C-c P 4" "projectile/other-window"
     "C-c q"   "boxquote"
     "s-g"     "magit"
-    "s-o"     "outline"
+    "s-O"     "outline"
     "s-t"     "themes")
 
   ;; prefixes for major modes
     "s-t"     "themes")
 
   ;; prefixes for major modes
@@ -1336,10 +1354,22 @@ For disabling the behaviour for certain buffers and/or modes."
          ("<end>"  . mwim-end-of-line-or-code)))
 
 (use-package projectile
          ("<end>"  . mwim-end-of-line-or-code)))
 
 (use-package projectile
+  :defer 0.5
   :bind-keymap ("C-c P" . projectile-command-map)
   :config
   (projectile-mode)
 
   :bind-keymap ("C-c P" . projectile-command-map)
   :config
   (projectile-mode)
 
+  (defun mab/projectile-mode-line-fun ()
+  "Report project name and type in the modeline."
+  (let ((project-name (projectile-project-name))
+        (project-type (projectile-project-type)))
+    (format "%s%s"
+            projectile-mode-line-prefix
+            (if project-type
+                (format ":%s" project-type)
+              ""))))
+  (setq projectile-mode-line-function 'mab/projectile-mode-line-fun)
+
   (defun my-projectile-invalidate-cache (&rest _args)
     ;; ignore the args to `magit-checkout'
     (projectile-invalidate-cache nil))
   (defun my-projectile-invalidate-cache (&rest _args)
     ;; ignore the args to `magit-checkout'
     (projectile-invalidate-cache nil))
@@ -1376,7 +1406,7 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-package boxquote
   :defer 0.6
   :bind
 (use-package boxquote
   :defer 0.6
   :bind
-  (:prefix-map a/boxquote-prefix-map
+  (:prefix-map mab/boxquote-prefix-map
    :prefix "C-c q"
    ("b"   . boxquote-buffer)
    ("B"   . boxquote-insert-buffer)
    :prefix "C-c q"
    ("b"   . boxquote-buffer)
    ("B"   . boxquote-insert-buffer)
@@ -1505,7 +1535,7 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-package multiple-cursors
   :bind
   (("C-S-<mouse-1>" . mc/add-cursor-on-click)
 (use-package multiple-cursors
   :bind
   (("C-S-<mouse-1>" . mc/add-cursor-on-click)
-   (:prefix-map a/mc-prefix-map
+   (:prefix-map mab/mc-prefix-map
                :prefix "C-c m"
                ("c" . mc/edit-lines)
                ("n" . mc/mark-next-like-this)
                :prefix "C-c m"
                ("c" . mc/edit-lines)
                ("n" . mc/mark-next-like-this)
@@ -1534,7 +1564,7 @@ For disabling the behaviour for certain buffers and/or modes."
 
 (use-package org-ref
   :init
 
 (use-package org-ref
   :init
-  (a/setq-every '("~/usr/org/references.bib")
+  (mab/setq-every '("~/usr/org/references.bib")
     reftex-default-bibliography
     org-ref-default-bibliography)
   (setq
     reftex-default-bibliography
     org-ref-default-bibliography)
   (setq
@@ -1561,7 +1591,8 @@ For disabling the behaviour for certain buffers and/or modes."
    :token nday-students-token
    :subscribed-channels '(general)
    :full-and-display-names t)
    :token nday-students-token
    :subscribed-channels '(general)
    :full-and-display-names t)
-  (add-to-list 'swiper-font-lock-exclude 'slack-message-buffer-mode t)
+  (with-eval-after-load 'swiper
+    (add-to-list 'swiper-font-lock-exclude 'slack-message-buffer-mode t))
   (setq lui-time-stamp-format "[%Y-%m-%d %H:%M:%S]"
         lui-time-stamp-only-when-changed-p t
         lui-time-stamp-position 'right)
   (setq lui-time-stamp-format "[%Y-%m-%d %H:%M:%S]"
         lui-time-stamp-only-when-changed-p t
         lui-time-stamp-position 'right)
@@ -1595,15 +1626,41 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-package emojify
   :hook (erc-mode . emojify-mode))
 
 (use-package emojify
   :hook (erc-mode . emojify-mode))
 
+(use-feature window
+  :bind
+  (("s-o"   . other-window)
+   ("M-o"   . other-window)
+   ("s-/ ." . split-window-right)
+   ("s-/ ," . split-window-below)
+   ("s-/ 0" . delete-window)
+   ("s-q"   . delete-window)))
+
+(use-feature windmove
+  :defer 0.6
+  :bind
+  (("s-h" . windmove-left)
+   ("s-j" . windmove-down)
+   ("s-k" . windmove-up)
+   ("s-l" . windmove-right)
+   ("s-H" . windmove-swap-states-left)
+   ("s-J" . windmove-swap-states-down)
+   ("s-K" . windmove-swap-states-up)
+   ("s-L" . windmove-swap-states-right)))
+
+(use-package pass
+  :commands pass
+  :bind ("C-c a p" . pass)
+  :hook (pass-mode . View-exit))
+
 \f
 ;;; Email (with Gnus)
 
 \f
 ;;; Email (with Gnus)
 
-(defvar a/maildir (expand-file-name "~/mail/"))
+(defvar mab/maildir (expand-file-name "~/mail/"))
 (with-eval-after-load 'recentf
 (with-eval-after-load 'recentf
-  (add-to-list 'recentf-exclude a/maildir))
+  (add-to-list 'recentf-exclude mab/maildir))
 
 (setq
 
 (setq
a/gnus-init-file  (no-littering-expand-etc-file-name "gnus")
mab/gnus-init-file  (no-littering-expand-etc-file-name "gnus")
  mail-user-agent   'gnus-user-agent
  read-mail-command 'gnus)
 
  mail-user-agent   'gnus-user-agent
  read-mail-command 'gnus)
 
@@ -1619,7 +1676,7 @@ For disabling the behaviour for certain buffers and/or modes."
             (nnimap-address "127.0.0.1")
             (nnimap-server-port 143)
             (nnimap-authenticator plain)
             (nnimap-address "127.0.0.1")
             (nnimap-server-port 143)
             (nnimap-authenticator plain)
-            (nnimap-user "amin@bndl.local"))
+            (nnimap-user "amin@shemshak.local"))
      (nnimap "gnu"
             (nnimap-stream plain)
             (nnimap-address "127.0.0.1")
      (nnimap "gnu"
             (nnimap-stream plain)
             (nnimap-address "127.0.0.1")
@@ -1629,7 +1686,7 @@ For disabling the behaviour for certain buffers and/or modes."
             (nnimap-inbox "INBOX")
             (nnimap-split-methods 'nnimap-split-fancy)
             (nnimap-split-fancy (|
             (nnimap-inbox "INBOX")
             (nnimap-split-methods 'nnimap-split-fancy)
             (nnimap-split-fancy (|
-                                 (: gnus-registry-split-fancy-with-parent)
+                                 ;; (: gnus-registry-split-fancy-with-parent)
                                  ;; (: gnus-group-split-fancy "INBOX" t "INBOX")
                                  ;; gnu
                                  (list ".*emacs-devel.gnu.org" "l.gnu.emacs.devel")
                                  ;; (: gnus-group-split-fancy "INBOX" t "INBOX")
                                  ;; gnu
                                  (list ".*emacs-devel.gnu.org" "l.gnu.emacs.devel")
@@ -1644,7 +1701,9 @@ For disabling the behaviour for certain buffers and/or modes."
                                  (list ".*bug-gnuzilla.gnu.org" "l.gnu.gnuzilla.bug")
                                  (list ".*gnuzilla-dev.gnu.org" "l.gnu.gnuzilla.dev")
                                  (list ".*guile-devel.gnu.org" "l.gnu.guile.devel")
                                  (list ".*bug-gnuzilla.gnu.org" "l.gnu.gnuzilla.bug")
                                  (list ".*gnuzilla-dev.gnu.org" "l.gnu.gnuzilla.dev")
                                  (list ".*guile-devel.gnu.org" "l.gnu.guile.devel")
+                                 (list ".*guile-user.gnu.org" "l.gnu.guile.user")
                                  (list ".*guix-devel.gnu.org" "l.gnu.guix.devel")
                                  (list ".*guix-devel.gnu.org" "l.gnu.guix.devel")
+                                 (list ".*help-guix.gnu.org" "l.gnu.guix.help")
                                  (list ".*info-guix.gnu.org" "l.gnu.guix.info")
                                  (list ".*savannah-hackers-public.gnu.org" "l.gnu.savannah.hackers.public")
                                  (list ".*savannah-users.gnu.org" "l.gnu.savannah.users")
                                  (list ".*info-guix.gnu.org" "l.gnu.guix.info")
                                  (list ".*savannah-hackers-public.gnu.org" "l.gnu.savannah.hackers.public")
                                  (list ".*savannah-users.gnu.org" "l.gnu.savannah.users")
@@ -1675,7 +1734,7 @@ For disabling the behaviour for certain buffers and/or modes."
              (nnimap-inbox "INBOX")
              (nnimap-split-methods 'nnimap-split-fancy)
              (nnimap-split-fancy (|
              (nnimap-inbox "INBOX")
              (nnimap-split-methods 'nnimap-split-fancy)
              (nnimap-split-fancy (|
-                                  (: gnus-registry-split-fancy-with-parent)
+                                  ;; (: gnus-registry-split-fancy-with-parent)
                                   ;; se463-s19
                                   ("subject" "\\(SE\\s-?463\\|Deliverable\\)" "course.se463-s19")
                                   (from "\\(SE\\s-?463\\|Gema\\|Hemant\\|Davood\\|Camilo\\|Reza\\|Michael\\|Sandy\\)" "course.se463-s19")
                                   ;; se463-s19
                                   ("subject" "\\(SE\\s-?463\\|Deliverable\\)" "course.se463-s19")
                                   (from "\\(SE\\s-?463\\|Gema\\|Hemant\\|Davood\\|Camilo\\|Reza\\|Michael\\|Sandy\\)" "course.se463-s19")
@@ -1735,9 +1794,15 @@ For disabling the behaviour for certain buffers and/or modes."
      ("l\\.gnu\\.guile\\.devel"
       (to-address . "guile-devel@gnu.org")
       (to-list    . "guile-devel@gnu.org"))
      ("l\\.gnu\\.guile\\.devel"
       (to-address . "guile-devel@gnu.org")
       (to-list    . "guile-devel@gnu.org"))
+     ("l\\.gnu\\.guile\\.user"
+      (to-address . "guile-user@gnu.org")
+      (to-list    . "guile-user@gnu.org"))
      ("l\\.gnu\\.guix\\.devel"
       (to-address . "guix-devel@gnu.org")
       (to-list    . "guix-devel@gnu.org"))
      ("l\\.gnu\\.guix\\.devel"
       (to-address . "guix-devel@gnu.org")
       (to-list    . "guix-devel@gnu.org"))
+     ("l\\.gnu\\.guix\\.help"
+      (to-address . "help-guix@gnu.org")
+      (to-list    . "help-guix@gnu.org"))
      ("l\\.gnu\\.guix\\.info"
       (to-address . "info-guix@gnu.org")
       (to-list    . "info-guix@gnu.org"))
      ("l\\.gnu\\.guix\\.info"
       (to-address . "info-guix@gnu.org")
       (to-list    . "info-guix@gnu.org"))
@@ -1806,7 +1871,7 @@ For disabling the behaviour for certain buffers and/or modes."
   (require 'ebdb-mua)
   (require 'ebdb-gnus)
 
   (require 'ebdb-mua)
   (require 'ebdb-gnus)
 
-  (gnus-registry-initialize)
+  ;; (gnus-registry-initialize)
 
   (with-eval-after-load 'recentf
     (add-to-list 'recentf-exclude gnus-home-directory)))
 
   (with-eval-after-load 'recentf
     (add-to-list 'recentf-exclude gnus-home-directory)))
@@ -1814,6 +1879,7 @@ For disabling the behaviour for certain buffers and/or modes."
 (use-feature gnus-art
   :config
   (setq
 (use-feature gnus-art
   :config
   (setq
+   gnus-buttonized-mime-types '("multipart/\\(signed\\|encrypted\\)")
    gnus-visible-headers
    (concat gnus-visible-headers "\\|^List-Id:\\|^X-RT-Originator:\\|^User-Agent:")
    gnus-sorted-header-list
    gnus-visible-headers
    (concat gnus-visible-headers "\\|^List-Id:\\|^X-RT-Originator:\\|^User-Agent:")
    gnus-sorted-header-list
@@ -1840,7 +1906,7 @@ For disabling the behaviour for certain buffers and/or modes."
 
 (use-feature gnus-sum
   :bind (:map gnus-summary-mode-map
 
 (use-feature gnus-sum
   :bind (:map gnus-summary-mode-map
-              :prefix-map a/gnus-summary-prefix-map
+              :prefix-map mab/gnus-summary-prefix-map
               :prefix "v"
               ("r" . gnus-summary-reply)
               ("w" . gnus-summary-wide-reply)
               :prefix "v"
               ("r" . gnus-summary-reply)
               ("w" . gnus-summary-wide-reply)
@@ -1849,40 +1915,46 @@ For disabling the behaviour for certain buffers and/or modes."
   (bind-keys
    :map gnus-summary-mode-map
    ("M-L" . org-store-link))
   (bind-keys
    :map gnus-summary-mode-map
    ("M-L" . org-store-link))
-  :hook (gnus-summary-mode . a/no-mouse-autoselect-window))
+  :hook (gnus-summary-mode . mab/no-mouse-autoselect-window))
 
 (use-feature gnus-msg
   :config
 
 (use-feature gnus-msg
   :config
-  (defvar a/gnu-signature "Amin Bandali | GNU Webmaster
-https://bandali.eu.org | https://gnu.org
-GPG Key: BE62 7373 8E61 6D6D 1B3A  08E8 A21A 0202 4881 6103")
-  (defvar a/uw-signature "Amin Bandali, MMath Student
+  (defvar mab/signature "Amin Bandali
+Free Software Activist | GNU Webmaster & Volunteer
+GPG: BE62 7373 8E61 6D6D 1B3A  08E8 A21A 0202 4881 6103
+https://shemshak.org/~amin")
+  (defvar mab/uw-signature "Amin Bandali, MMath Student
 Cheriton School of Computer Science
 University of Waterloo
 Cheriton School of Computer Science
 University of Waterloo
-https://bandali.eu.org")
-  (defvar a/csc-signature "Amin Bandali | Termcom, CSC
-https://csclub.uwaterloo.ca/~abandali/")
+https://shemshak.org/~amin")
+  (defvar mab/csc-signature "Amin Bandali
+Termcom, Computer Science Club
+University of Waterloo
+https://shemshak.org/~amin")
   (setq gnus-posting-styles
         '((".*"
   (setq gnus-posting-styles
         '((".*"
-           (address "amin@bndl.org")
+           (address "amin@shemshak.org")
            (body "\nBest,\n")
            (body "\nBest,\n")
-           (eval (setq a/message-cite-say-hi t)))
+           (signature mab/signature)
+           (eval (setq mab/message-cite-say-hi t)))
           ("nnimap\\+gnu:.*"
           ("nnimap\\+gnu:.*"
-           (address "bandali@gnu.org")
-           (signature a/gnu-signature)
+           (address "mab@gnu.org")
+           (organization "GNU Project")
            (eval (set (make-local-variable 'message-user-fqdn) "fencepost.gnu.org")))
           ((header "subject" "ThankCRM")
            (to "webmasters-comment@gnu.org")
            (eval (set (make-local-variable 'message-user-fqdn) "fencepost.gnu.org")))
           ((header "subject" "ThankCRM")
            (to "webmasters-comment@gnu.org")
-           (body "Added  to 2019supporters.html.\n\nMoving to campaigns.\n")
-           (eval (setq a/message-cite-say-hi nil)))
+           (body "")
+           (eval (setq mab/message-cite-say-hi nil)))
           ("nnimap\\+uw:.*"
            (address "abandali@uwaterloo.ca")
           ("nnimap\\+uw:.*"
            (address "abandali@uwaterloo.ca")
-           (signature a/uw-signature))
+           (organization "University of Waterloo")
+           (signature mab/uw-signature))
           ("nnimap\\+uw:INBOX"
            (gcc "\"nnimap+uw:Sent Items\""))
           ("nnimap\\+csc:.*"
            (address "abandali@csclub.uwaterloo.ca")
           ("nnimap\\+uw:INBOX"
            (gcc "\"nnimap+uw:Sent Items\""))
           ("nnimap\\+csc:.*"
            (address "abandali@csclub.uwaterloo.ca")
-           (signature a/csc-signature)
+           (organization "Computer Science Club, University of Waterloo")
+           (signature mab/csc-signature)
            (gcc "nnimap+csc:Sent")))))
 
 (use-feature gnus-topic
            (gcc "nnimap+csc:Sent")))))
 
 (use-feature gnus-topic
@@ -1911,11 +1983,13 @@ https://csclub.uwaterloo.ca/~abandali/")
 
 (use-feature mm-decode
   :config
 
 (use-feature mm-decode
   :config
-  (setq mm-discouraged-alternatives '("text/html" "text/richtext")))
+  (setq mm-discouraged-alternatives '("text/html" "text/richtext")
+        mm-decrypt-option 'known
+        mm-verify-option 'known))
 
 (use-feature sendmail
   :config
 
 (use-feature sendmail
   :config
-  (setq sendmail-program "/usr/bin/msmtp"
+  (setq sendmail-program (executable-find "msmtp")
         ;; message-sendmail-extra-arguments '("-v" "-d")
         mail-specify-envelope-from t
         mail-envelope-from 'header))
         ;; message-sendmail-extra-arguments '("-v" "-d")
         mail-specify-envelope-from t
         mail-envelope-from 'header))
@@ -1932,7 +2006,7 @@ https://csclub.uwaterloo.ca/~abandali/")
         (when from
           msg-id))))
 
         (when from
           msg-id))))
 
-  (defconst a/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:")
+  (defconst mab/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:")
   (defconst message-cite-style-bandali
     '((message-cite-function  'message-cite-original)
       (message-citation-line-function  'message-insert-formatted-citation-line)
   (defconst message-cite-style-bandali
     '((message-cite-function  'message-cite-original)
       (message-citation-line-function  'message-insert-formatted-citation-line)
@@ -1941,9 +2015,9 @@ https://csclub.uwaterloo.ca/~abandali/")
       (message-yank-cited-prefix  ">")
       (message-yank-empty-prefix  ">")
       (message-citation-line-format
       (message-yank-cited-prefix  ">")
       (message-yank-empty-prefix  ">")
       (message-citation-line-format
-       (if a/message-cite-say-hi
-           (concat "Hi %F,\n\n" a/message-cite-style-format)
-         a/message-cite-style-format)))
+       (if mab/message-cite-say-hi
+           (concat "Hi %F,\n\n" mab/message-cite-style-format)
+         mab/message-cite-style-format)))
     "Citation style based on Mozilla Thunderbird's. Use with message-cite-style.")
   (setq ;; message-cite-style 'message-cite-style-bandali
         message-kill-buffer-on-exit t
     "Citation style based on Mozilla Thunderbird's. Use with message-cite-style.")
   (setq ;; message-cite-style 'message-cite-style-bandali
         message-kill-buffer-on-exit t
@@ -1952,7 +2026,7 @@ https://csclub.uwaterloo.ca/~abandali/")
         message-subscribed-address-functions
         '(gnus-find-subscribed-addresses)
         message-dont-reply-to-names
         message-subscribed-address-functions
         '(gnus-find-subscribed-addresses)
         message-dont-reply-to-names
-        "\\(\\(amin@bndl\\.org\\)\\|\\(.*@\\(aminb\\|amin\\.bndl\\)\\.org\\)\\|\\(\\(bandali\\|aminb?\\|mab\\)@gnu\\.org\\)\\|\\(a\\(min\\.\\)?bandali@uwaterloo\\.ca\\)\\|\\(abandali@csclub\\.uwaterloo\\.ca\\)\\)")
+        "\\(\\(amin@\\(shemshak\\|bndl\\)\\.org\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(mab\\|bandali\\|aminb?\\)@gnu\\.org\\)\\|\\(a\\(min\\.\\)?bandali@uwaterloo\\.ca\\)\\|\\(abandali@csclub\\.uwaterloo\\.ca\\)\\)")
   (require 'company-ebdb)
   :hook (;; (message-setup . mml-secure-message-sign-pgpmime)
          (message-mode . flyspell-mode)
   (require 'company-ebdb)
   :hook (;; (message-setup . mml-secure-message-sign-pgpmime)
          (message-mode . flyspell-mode)
@@ -1983,7 +2057,7 @@ https://csclub.uwaterloo.ca/~abandali/")
   ;;       footnote-style     'unicode)
   :bind
   (:map message-mode-map
   ;;       footnote-style     'unicode)
   :bind
   (:map message-mode-map
-        :prefix-map a/footnote-prefix-map
+        :prefix-map mab/footnote-prefix-map
         :prefix "C-c f"
         ("a" . footnote-add-footnote)
         ("b" . footnote-back-to-message)
         :prefix "C-c f"
         ("a" . footnote-add-footnote)
         ("b" . footnote-back-to-message)
@@ -2107,6 +2181,7 @@ https://csclub.uwaterloo.ca/~abandali/")
 (use-feature erc-track
   :after erc
   :custom
 (use-feature 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-priority-faces-only 'all)
   (erc-track-exclude-types '("JOIN" "MODE" "NICK" "PART" "QUIT"
                              "324" "329" "332" "333" "353" "477"))
   (erc-track-priority-faces-only 'all)
@@ -2119,7 +2194,7 @@ https://csclub.uwaterloo.ca/~abandali/")
   :after erc)
 
 (use-package znc
   :after erc)
 
 (use-package znc
-  :straight (:host nil :repo "https://git.bndl.org/amin/znc.el")
+  :straight (:host nil :repo "https://git.shemshak.org/amin/znc.el")
   :bind (("C-c a e e" . znc-erc)
          ("C-c a e a" . znc-all))
   :config
   :bind (("C-c a e e" . znc-erc)
          ("C-c a e a" . znc-all))
   :config
@@ -2128,11 +2203,11 @@ https://csclub.uwaterloo.ca/~abandali/")
                 ((null auth) (error "Couldn't find znca's authinfo"))
                 (t (funcall (plist-get (car auth) :secret)))))))
     (setq znc-servers
                 ((null auth) (error "Couldn't find znca's authinfo"))
                 (t (funcall (plist-get (car auth) :secret)))))))
     (setq znc-servers
-          `(("znc.bndl.org" 1337 t
+          `(("znc.shemshak.org" 1337 t
              ((freenode "amin/freenode" ,pwd)))
              ((freenode "amin/freenode" ,pwd)))
-            ("znc.bndl.org" 1337 t
+            ("znc.shemshak.org" 1337 t
              ((moznet "amin/moznet" ,pwd)))
              ((moznet "amin/moznet" ,pwd)))
-            ("znc.bndl.org" 1337 t
+            ("znc.shemshak.org" 1337 t
              ((oftc "amin/oftc" ,pwd)))))))
 
 \f
              ((oftc "amin/oftc" ,pwd)))))))
 
 \f
@@ -2140,6 +2215,6 @@ https://csclub.uwaterloo.ca/~abandali/")
 
 (message "Loading %s...done (%.3fs)" user-init-file
          (float-time (time-subtract (current-time)
 
 (message "Loading %s...done (%.3fs)" user-init-file
          (float-time (time-subtract (current-time)
-                                    a/before-user-init-time)))
+                                    mab/before-user-init-time)))
 
 ;;; init.el ends here
 
 ;;; init.el ends here