;;; 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
;;; Commentary:
;; Emacs configuration of Amin Bandali, computer scientist, functional
-;; programmer, and free software advocate. Uses straight.el for
+;; programmer, and free software activist. Uses straight.el for
;; purely functional and fully reproducible package management.
;; Over the years, I've taken inspiration from configurations of many
;;; 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)"
- (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.
-(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
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)
;;; whoami
(setq user-full-name "Amin Bandali"
- user-mail-address "amin@bndl.org")
+ user-mail-address "mab@shemshak.org")
\f
;;; comment macro
(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))
;; Solid rocket booster ignition...
-(a/bootstrap-straight)
+(mab/bootstrap-straight)
;; We have lift off!
(add-to-list 'recentf-exclude
(expand-file-name "~/.emacs.d/straight/build/")))
-(defun a/reload-init ()
+(defun mab/reload-init ()
"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)
- (a/post-init))
+ (mab/post-init))
;; use-package
(straight-use-package 'use-package)
;; 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)
: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)
\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)))
-(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
(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).
- (apply #'a/start-process
+ (apply #'mab/start-process
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)
;; 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)
- (setq compilation-finish-functions #'a/compilation-finish-function)
+ (setq compilation-finish-functions #'mab/compilation-finish-function)
(require 'cl-macs)
;; allow scrolling in Isearch
(setq isearch-allow-scroll t)
+;; open read-only file buffers in view-mode
+;; (enables niceties like `q' for quit)
+(setq view-read-only t)
+
(use-feature vc
:bind ("C-x v C-=" . vc-ediff))
("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)
("s-p" . beginning-of-buffer)
("s-n" . end-of-buffer)
+ ("M-O" . facemenu-keymap)
+
: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))
(bind-keys
- :prefix-map a/straight-prefix-map
+ ;; for back and forward mouse keys
+ ("<mouse-8>" . previous-buffer)
+ ("<drag-mouse-8>" . previous-buffer)
+ ("<mouse-9>" . next-buffer)
+ ("<drag-mouse-9>" . next-buffer)
+ ("<drag-mouse-2>" . kill-this-buffer)
+ ("<drag-mouse-3>" . ivy-switch-buffer))
+
+(bind-keys
+ :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)
- ("r" . a/reload-init)
+ ("r" . mab/reload-init)
;; M-x ^straight-.*-all$
("a c" . straight-check-all)
("a f" . straight-fetch-all)
org-catch-invisible-edits 'show-and-error
org-log-done 'time)
(add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t)
+ (add-to-list 'org-modules 'org-habit)
:bind
(("C-c a o a" . org-agenda)
:map org-mode-map
(org-mode . flyspell-mode))
:custom
(org-agenda-files '("~/usr/org/todos/personal.org"
+ "~/usr/org/todos/habits.org"
"~/usr/org/todos/masters.org"))
(org-agenda-start-on-weekday 0)
+ (org-agenda-time-leading-zero t)
+ (org-habit-graph-column 44)
(org-latex-packages-alist '(("" "listings") ("" "color")))
:custom-face
'(org-block-begin-line ((t (:foreground "#5a5b5a" :background "#1d1f21"))))
;; 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.")
- (defvar a/show-async-tangle-time nil
+ (defvar mab/show-async-tangle-time nil
"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))
`(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
- (if a/show-async-tangle-time
+ (if mab/show-async-tangle-time
(format " (%.3fs)"
(float-time (time-subtract (current-time)
',file-tangle-start-time)))
(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
(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)
: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)))
- (defun a/eshell-clear ()
+ (defun mab/eshell-clear ()
(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
- ("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)))
- :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))
("<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)
("\\" . 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
(use-package company
:defer 0.6
- :delight " company"
+ :delight " comp"
:bind
(:map company-active-map
([tab] . company-complete-common-or-cycle)
;; ’ 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
(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))
(use-package go-mode)
+(use-package po-mode
+ :hook
+ (po-mode . (lambda () (run-with-timer 0.1 nil 'View-exit))))
+
\f
;;; Theme
:commands (sml/apply-theme)
:demand
:config
- (sml/setup))
+ (sml/setup)
+ (smart-mode-line-enable))
(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
-(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
- '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
- 'org-mode a/org-mode-font-lock-keywords t))
+ 'org-mode mab/org-mode-font-lock-keywords t))
(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
"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
("<end>" . mwim-end-of-line-or-code)))
(use-package projectile
+ :defer 0.5
: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))
(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)
(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)
(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
org-ref-bibliography-notes "~/usr/org/notes.org"
org-ref-pdf-directory "~/usr/org/bibtex-pdfs/"))
+;; ugh, temporary (still better than using the proprietary web app)
+(use-package slack
+ :commands (slack-start)
+ :init
+ (eval-when-compile ; silence the byte-compiler
+ (defvar url-http-data nil)
+ (defvar url-http-extra-headers nil)
+ (defvar url-http-method nil)
+ (defvar url-callback-function nil)
+ (defvar url-callback-arguments nil)
+ (defvar oauth--token-data nil))
+ (setq slack-buffer-emojify t
+ slack-prefer-current-team t)
+ :config
+ (slack-register-team
+ :name "nday-students"
+ :default t
+ :token nday-students-token
+ :subscribed-channels '(general)
+ :full-and-display-names 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)
+ :bind
+ (("C-c s s" . slack-start)
+ ("C-c s u" . slack-select-unread-rooms)
+ ("C-c s b" . slack-select-rooms)
+ ("C-c s t" . slack-change-current-team)
+ ("C-c s c" . slack-ws-close)
+ :map slack-mode-map
+ ("M-p" . slack-buffer-goto-prev-message)
+ ("M-n" . slack-buffer-goto-next-message)
+ ("C-c e" . slack-message-edit)
+ ("C-c k" . slack-message-delete)
+ ("C-c C-k" . slack-channel-leave)
+ ("C-c r a" . slack-message-add-reaction)
+ ("C-c r r" . slack-message-remove-reaction)
+ ("C-c r s" . slack-message-show-reaction-users)
+ ("C-c p l" . slack-room-pins-list)
+ ("C-c p a" . slack-message-pins-add)
+ ("C-c p r" . slack-message-pins-remove)
+ ("@" . slack-message-embed-mention)
+ ("#" . slack-message-embed-channel)))
+
(use-package alert
:commands (alert)
:init (setq alert-default-style 'notifications))
-(use-package ivy-xref
- :init
- (setq xref-show-xrefs-function #'ivy-xref-show-xrefs))
-
;; (use-package fill-column-indicator)
(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)
-(defvar a/maildir (expand-file-name "~/mail/"))
+(defvar mab/maildir (expand-file-name "~/mail/"))
(with-eval-after-load 'recentf
- (add-to-list 'recentf-exclude a/maildir))
+ (add-to-list 'recentf-exclude mab/maildir))
(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)
(setq
gnus-select-method '(nnnil "")
gnus-secondary-select-methods
- '((nnimap "amin"
+ '((nnimap "shemshak"
(nnimap-stream plain)
(nnimap-address "127.0.0.1")
(nnimap-server-port 143)
(nnimap-authenticator plain)
- (nnimap-user "amin@bndl.local"))
+ (nnimap-user "mab@shemshak.local"))
(nnimap "gnu"
(nnimap-stream plain)
(nnimap-address "127.0.0.1")
(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")
(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 ".*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")
(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" "course.se463-s19")
- (from "\\(SE\\s-?463\\|Gema\\)" "course.se463-s19")
+ ("subject" "\\(SE\\s-?463\\|Deliverable\\)" "course.se463-s19")
+ (from "\\(SE\\s-?463\\|Gema\\|Hemant\\|Davood\\|Camilo\\|Reza\\|Michael\\|Sandy\\)" "course.se463-s19")
;; catch-all
"INBOX")))
(nnimap "csc"
(nnimap-server-port 143)
(nnimap-authenticator plain)
(nnimap-user "abandali@csc.uw.local")))
- gnus-message-archive-group "nnimap+amin:Sent"
+ gnus-message-archive-group "nnimap+shemshak:Sent"
gnus-parameters
'(("l\\.deepspec"
(to-address . "deepspec@lists.cs.princeton.edu")
("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\\.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"))
(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)))
(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
(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)
(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
- (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/~mab")
+ (defvar mab/uw-signature "Amin Bandali, MMath Student
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/~mab")
+ (defvar mab/csc-signature "Amin Bandali
+Termcom, Computer Science Club
+University of Waterloo
+https://shemshak.org/~mab")
(setq gnus-posting-styles
'((".*"
- (address "amin@bndl.org")
+ (address "mab@shemshak.org")
(body "\nBest,\n")
- (eval (setq a/message-cite-say-hi t)))
+ (signature mab/signature)
+ (eval (setq mab/message-cite-say-hi t)))
("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")
- (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")
- (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")
- (signature a/csc-signature)
+ (organization "Computer Science Club, University of Waterloo")
+ (signature mab/csc-signature)
(gcc "nnimap+csc:Sent")))))
(use-feature gnus-topic
(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
- (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))
(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)
(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
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\\)\\)")
+ "\\(\\(\\(mab\\|amin\\)@shemshak\\.org\\)\\|\\(amin@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)
;; 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)
(gnus-harvest-install))))
\f
-;;; IRC
+;;; IRC (with ERC and ZNC)
(use-feature erc
:bind (("C-c a e b" . erc-switch-to-buffer)
:map erc-mode-map
("M-a" . erc-track-switch-buffer))
:custom
- (erc-fill-function 'erc-fill-static)
- (erc-fill-static-center 18)
(erc-join-buffer 'bury)
(erc-lurker-hide-list '("JOIN" "PART" "QUIT"))
(erc-nick "bandali")
- (erc-pcomplete-nick-postfix ",")
(erc-rename-buffers t)
(erc-server-reconnect-attempts 5)
(erc-server-reconnect-timeout 3)
- (erc-track-exclude-types '("JOIN" "MODE" "NICK" "PART" "QUIT"
- "324" "329" "332" "333" "353" "477"))
- (erc-track-priority-faces-only 'all)
:config
(with-eval-after-load 'ivy
;; ignore channel buffer names
(add-to-list 'erc-modules 'scrolltoplace)
(erc-update-modules))
+(use-feature erc-fill
+ :after erc
+ :custom
+ (erc-fill-function 'erc-fill-static)
+ (erc-fill-static-center 18))
+
+(use-feature erc-pcomplete
+ :after erc
+ :custom
+ (erc-pcomplete-nick-postfix ","))
+
+(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-shorten-function nil))
+
(use-package erc-hl-nicks
:after erc)
:after erc)
(use-package znc
- :straight (:host nil :repo "https://git.bndl.org/amin/znc.el")
+ :straight (:host nil :repo "https://git.shemshak.org/mab/znc.el")
:bind (("C-c a e e" . znc-erc)
("C-c a e a" . znc-all))
:config
((null auth) (error "Couldn't find znca's authinfo"))
(t (funcall (plist-get (car auth) :secret)))))))
(setq znc-servers
- `(("znc.bndl.org" 1337 t
- ((freenode "amin/freenode" ,pwd)))
- ("znc.bndl.org" 1337 t
- ((moznet "amin/moznet" ,pwd)))
- ("znc.bndl.org" 1337 t
- ((oftc "amin/oftc" ,pwd)))))))
+ `(("znc.shemshak.org" 1337 t
+ ((freenode "mab/freenode" ,pwd)))
+ ("znc.shemshak.org" 1337 t
+ ((moznet "mab/moznet" ,pwd)))
+ ("znc.shemshak.org" 1337 t
+ ((oftc "mab/oftc" ,pwd)))))))
\f
;;; Post initialization
(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