** Naming conventions
-The conventions below were inspired by [[https://github.com/hlissner/doom-emacs][Doom]]'s conventions, found
-[[https://github.com/hlissner/doom-emacs/blob/5dacbb7cb1c6ac246a9ccd15e6c4290def67757c/core/core.el#L3-L17][here]]. Naturally, I use my initials, =ab=, instead of =doom=.
+The conventions below were inspired by [[https://github.com/hlissner/doom-emacs][Doom]]'s, found [[https://github.com/hlissner/doom-emacs/blob/5dacbb7cb1c6ac246a9ccd15e6c4290def67757c/core/core.el#L3-L17][here]].
#+begin_src emacs-lisp :comments none
;; Naming conventions:
;;
-;; ab-... public variables or non-interactive functions
-;; ab--... private anything (non-interactive), not safe for direct use
-;; ab/... an interactive function; safe for M-x or keybinding
-;; ab:... an evil operator, motion, or command
-;; ab|... a hook function
-;; ab*... an advising function
-;; ab@... a hydra command
-;; ...! a macro
+;; amin-... public variables or non-interactive functions
+;; amin--... private anything (non-interactive), not safe for direct use
+;; amin/... an interactive function; safe for M-x or keybinding
+;; amin:... an evil operator, motion, or command
+;; amin|... a hook function
+;; amin*... an advising function
+;; amin@... a hydra command
+;; ...! a macro
#+end_src
* Initial setup
=init.el=, i.e. =user-init-file=:
#+begin_src emacs-lisp
-(defvar ab--before-user-init-time (current-time)
+(defvar amin--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 ab--before-user-init-time
+ (float-time (time-subtract amin--before-user-init-time
before-init-time)))
#+end_src
startup time as well.
#+begin_src emacs-lisp
-(defvar ab--gc-cons-threshold gc-cons-threshold)
-(defvar ab--gc-cons-percentage gc-cons-percentage)
-(defvar ab--file-name-handler-alist file-name-handler-alist)
+(defvar amin--gc-cons-threshold gc-cons-threshold)
+(defvar amin--gc-cons-percentage gc-cons-percentage)
+(defvar amin--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
(add-hook
'after-init-hook
(lambda ()
- (setq gc-cons-threshold ab--gc-cons-threshold
- gc-cons-percentage ab--gc-cons-percentage
- file-name-handler-alist ab--file-name-handler-alist)))
+ (setq gc-cons-threshold amin--gc-cons-threshold
+ gc-cons-percentage amin--gc-cons-percentage
+ file-name-handler-alist amin--file-name-handler-alist)))
#+end_src
Increase the number of lines kept in message logs (the =*Messages*=
** Useful utilities
#+begin_src emacs-lisp
-(defun ab-enlist (exp)
+(defun amin-enlist (exp)
"Return EXP wrapped in a list, or as-is if already a list."
(if (listp exp) exp (list exp)))
compilation."
(declare (indent defun) (debug t))
(list (if (or (not (bound-and-true-p byte-compile-current-file))
- (dolist (next (ab-enlist features))
+ (dolist (next (amin-enlist features))
(if (symbolp next)
(require next nil :no-error)
(load next :no-message :no-error))))
using the Xfce panel anymore. Also, I don't need to see the load
average on a regular basis, so disable that.
-#+begin_src emacs-lisp
+Note: using =i3status= on sway at the moment, so disabling this.
+
+#+begin_src emacs-lisp :tangle no
(use-package time
:ensure nil
:init
version-control t)
#+end_src
+*** Auto revert
+
+Enable automatic reloading of changed buffers and files.
+
+#+begin_src emacs-lisp
+(global-auto-revert-mode 1)
+(setq auto-revert-verbose nil
+ global-auto-revert-non-file-buffers t)
+#+end_src
+
+*** Always use space for indentation
+
+#+begin_src emacs-lisp
+(setq-default
+ indent-tabs-mode nil
+ require-final-newline t
+ tab-width 4)
+#+end_src
+
** Packages
The packages in this section are absolutely essential to my everyday
("n" next-line)
("p" previous-line)
("f" forward-char)
- ("a" move-beginning-of-line)
- ("e" move-end-of-line)
+ ("/" undo)
+ ("i" ryo-modal-mode)
+ ("l" recenter-top-bottom)
+ ("v" scroll-up-command)
+ ("V" scroll-down-command)
+ ("x" delete-forward-char)
("SPC" (("b" (("b" ibuffer-list-buffers)
("k" kill-this-buffer)
("o" other-window)
("s" save-buffer)))
+ ("B" (("A" borg-activate)
+ ("a" borg-assimilate)
+ ("b" borg-build)
+ ("c" borg-clone)
+ ("r" borg-remove)))
("h" (("c" describe-char)
("f" describe-function)
("F" describe-face)
("v" describe-variable)))
("q" (("q" save-buffers-kill-terminal)))))
("d" (("w" kill-word)
- ("d" kill-whole-line)
("b" backward-kill-word)))
- ("c" (("w" kill-word :exit t)
- ("c" kill-whole-line :exit t))))
+ ("c w" kill-word :exit t))
(ryo-modal-keys
;; First argyment to ryo-modal-keys may be a list of keywords.
:config
(setq org-src-tab-acts-natively t
org-src-preserve-indentation nil
- org-edit-src-content-indentation 0
- org-html-divs '((preamble "header" "preamble")
- (content "main" "content")
- (postamble "footer" "postamble"))
- org-html-doctype "html5"
- org-html-html5-fancy t
- org-html-postamble nil)
+ org-edit-src-content-indentation 0)
:hook (org-mode . org-indent-mode))
-(use-package htmlize
- :after org)
(use-package org-notmuch
:after (:any org notmuch))
#+end_src
(use-package undo-tree
:ryo
- ("/" undo-tree-undo)
+ ("?" undo-tree-undo)
("_" undo-tree-redo)
- :bind (("C-/" . undo-tree-undo)
+ :bind (("C-?" . undo-tree-undo)
("M-_" . undo-tree-redo))
:config
(global-undo-tree-mode)
- (setq undo-tree-mode-lighter ""))
+ (setq undo-tree-mode-lighter ""
+ undo-tree-auto-save-history t))
#+end_src
* Editing
(load-theme 'eink t)
#+end_src
+** [[https://github.com/bbatsov/crux][crux]]
+
+#+begin_src emacs-lisp
+(use-package crux
+ :bind (("C-c d" . crux-duplicate-current-line-or-region)
+ ("C-c M-d" . crux-duplicate-and-comment-current-line-or-region))
+ :ryo
+ ("o" crux-smart-open-line :exit t)
+ ("O" crux-smart-open-line-above :exit t)
+ ("SPC b K" crux-kill-other-buffers)
+ ("d d" crux-kill-whole-line)
+ ("c c" crux-kill-whole-line :then '(crux-smart-open-line-above) :exit t)
+ ("SPC f" (("c" crux-copy-file-preserve-attributes)
+ ("D" crux-delete-file-and-buffer)
+ ("R" crux-rename-file-and-buffer))))
+#+end_src
+
+** [[https://github.com/alezost/mwim.el][mwim]]
+
+#+begin_src emacs-lisp
+(use-package mwim
+ :bind (("C-a" . mwim-beginning-of-code-or-line)
+ ("C-e" . mwim-end-of-code-or-line)
+ ("<home>" . mwim-beginning-of-line-or-code)
+ ("<end>" . mwim-end-of-line-or-code))
+ :ryo
+ ("a" mwim-beginning-of-code-or-line)
+ ("e" mwim-end-of-code-or-line))
+#+end_src
+
+** [[https://www.emacswiki.org/emacs/KeyChord][key-chord]]
+
+#+begin_src emacs-lisp
+(use-package key-chord
+ :demand t
+ :config
+ (key-chord-mode 1)
+ (key-chord-define-global "jk" 'ryo-modal-mode)
+ (setq key-chord-one-key-delay 0 ; i don't need one-key chords for now
+ key-chord-two-keys-delay 0.005))
+#+end_src
+
* Email
** [[https://notmuchmail.org][notmuch]]
See [[notmuch:id:87muuqsvci.fsf@fencepost.gnu.org][bug follow-up]].
#+begin_src emacs-lisp
-(defun ab/notmuch ()
+(defun amin/notmuch ()
"Delete other windows, then launch `notmuch'."
(interactive)
(require 'notmuch)
;; (map!
;; :leader
-;; :desc "notmuch" :n "m" #'ab/notmuch
+;; :desc "notmuch" :n "m" #'amin/notmuch
;; (:desc "search" :prefix "/"
;; :desc "notmuch" :n "m" #'counsel-notmuch))
#+end_src
#+begin_src emacs-lisp
-(defvar ab-maildir "~/mail")
+(defvar amin-maildir "~/mail")
(use-package sendmail
;; :ensure nil
:config
(setq sendmail-program "/usr/bin/msmtp"
+ ; message-sendmail-extra-arguments '("-v" "-d")
mail-specify-envelope-from t
mail-envelope-from 'header))
mml-secure-openpgp-sign-with-sender t))
(use-package notmuch
- :ryo ("SPC m" ab/notmuch)
+ :ryo ("SPC m" amin/notmuch)
:config
(setq notmuch-hello-sections
'(notmuch-hello-insert-header
notmuch-hello-thousands-separator ","
notmuch-fcc-dirs
'(("amin@aminb.org" . "amin/Sent")
+ ("amin@gnu.org" . "gnu/Sent")
("abandali@uwaterloo.ca" . "\"uwaterloo/Sent Items\"")
- ("amin.bandali@uwaterloo.ca" . "\"uwaterloo/Sent Items\"")
+ ("mab@gnu.org" . "gnu/Sent")
("aminb@gnu.org" . "gnu/Sent")
(".*" . "sent"))
notmuch-search-result-format
:bind
(:map notmuch-hello-mode-map
("g" . notmuch-poll-and-refresh-this-buffer)
- ("i" . (lambda ()
- "Search for `inbox' tagged messages"
- (interactive)
- (notmuch-hello-search "tag:inbox")))
("u" . (lambda ()
"Search for `unread' tagged messages"
(interactive)
(notmuch-hello-search "tag:unread")))
+ ("i" . (lambda ()
+ "Search for `inbox' tagged messages"
+ (interactive)
+ (notmuch-hello-search "tag:inbox")))
("l" . (lambda ()
- "Search for `latest tagged messages"
+ "Search for `latest' tagged messages"
(interactive)
(notmuch-hello-search "tag:latest")))
+ ("e" . (lambda ()
+ "Search for `encrypted' tagged messages"
+ (interactive)
+ (notmuch-hello-search "tag:encrypted")))
("M" . (lambda ()
"Compose new mail and prompt for sender"
(interactive)
;; (notmuch-tree-mode . emacs))))
(after! recentf
- (add-to-list 'recentf-exclude (expand-file-name ab-maildir)))
+ (add-to-list 'recentf-exclude (expand-file-name amin-maildir)))
#+end_src
** supercite
#+begin_src emacs-lisp
(message "Loading %s...done (%.3fs)" user-init-file
(float-time (time-subtract (current-time)
- ab--before-user-init-time)))
+ amin--before-user-init-time)))
#+end_src
* Footer