X-Git-Url: https://git.shemshak.org/gitweb.cgi/~bandali/configs/blobdiff_plain/12f3e4b8d79650fed11279051e0ec951fc500c02..23cd3185f768c68aed6d8035a72502e95587db1d:/init.org?ds=sidebyside diff --git a/init.org b/init.org index 1c69169..31c7a86 100644 --- a/init.org +++ b/init.org @@ -54,6 +54,13 @@ make build - [[#header][Header]] - [[#initial-setup][Initial setup]] - [[#core][Core]] +- [[#borg-essentials][Borg's =layer/essentials=]] +- [[#editing][Editing]] +- [[#syntax-spell-checking][Syntax and spell checking]] +- [[#programming-modes][Programming modes]] +- [[#emacs-enhancements][Emacs enhancements]] +- [[#email][Email]] +- [[#blogging][Blogging]] - [[#post-initialization][Post initialization]] - [[#footer][Footer]] @@ -65,7 +72,7 @@ make build ** First line #+begin_src emacs-lisp :comments none -;;; init.el --- Amin Bandali's Emacs config -*- lexical-binding: t ; eval: (view-mode 1)-*- +;;; init.el --- Amin Bandali's Emacs config -*- lexical-binding: t; eval: (view-mode 1) -*- #+end_src Enable =view-mode=, which both makes the file read-only (as a reminder @@ -113,7 +120,6 @@ The conventions below were inspired by [[https://github.com/hlissner/doom-emacs] ;; 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 @@ -125,10 +131,6 @@ The conventions below were inspired by [[https://github.com/hlissner/doom-emacs] :CUSTOM_ID: initial-setup :END: -#+begin_src emacs-lisp :comments none -;;; Code: -#+end_src - ** Emacs initialization I'd like to do a couple of measurements of Emacs' startup time. First, @@ -191,7 +193,7 @@ but for now I've decided to keep them enabled. See documentation for #+begin_src emacs-lisp (setq user-full-name "Amin Bandali" - user-mail-address "amin@bandali.me") + user-mail-address "amin@aminb.org") #+end_src ** Package management @@ -244,7 +246,6 @@ can then be managed with the help of Magit or other tools. ("C-c b a" . borg-assimilate) ("C-c b b" . borg-build) ("C-c b c" . borg-clone) - ("C-c b m" . borg-insert-update-message) ("C-c b r" . borg-remove))) #+end_src @@ -380,7 +381,7 @@ See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.htm Font stack with better unicode support, around =Ubuntu Mono= and =Hack=. -#+begin_src emacs-lisp :tangle no +#+begin_src emacs-lisp (dolist (ft (fontset-list)) (set-fontset-font ft @@ -419,6 +420,24 @@ Font stack with better unicode support, around =Ubuntu Mono= and (setq text-scale-mode-step 1.05) #+end_src +** Focus follows mouse + +I’d like focus to follow the mouse when I move the cursor from one +window to the next. + +#+begin_src emacs-lisp +(setq mouse-autoselect-window t) +#+end_src + +Let’s define a function to conveniently disable this for certain +buffers and/or modes. + +#+begin_src emacs-lisp +(defun amin--no-mouse-autoselect-window () + (make-local-variable 'mouse-autoselect-window) + (setq mouse-autoselect-window nil)) +#+end_src + ** Libraries #+begin_src emacs-lisp @@ -634,18 +653,31 @@ Enable =winner-mode=. (winner-mode 1) #+end_src -*** Close =*compilation*= on success +*** Don’t display =*compilation*= on success + +Based on https://stackoverflow.com/a/17788551, with changes to use +=cl-letf= instead of the now obsolete =flet=. #+begin_src emacs-lisp -(setq compilation-exit-message-function - (lambda (status code msg) - "Close the compilation window if successful." - ;; if M-x compile exits with 0 - (when (and (eq status 'exit) (zerop code)) - (bury-buffer) - (delete-window (get-buffer-window (get-buffer "*compilation*")))) - ;; return the result of compilation-exit-message-function - (cons msg code))) +(use-package compile + :config + (defun amin--compilation-finish-function (buffer outstr) + (unless (string-match "finished" outstr) + (switch-to-buffer-other-window buffer)) + t) + + (setq compilation-finish-functions #'amin--compilation-finish-function) + + (require 'cl-macs) + + (defadvice compilation-start + (around inhibit-display + (command &optional mode name-function highlight-regexp)) + (if (not (string-match "^\\(find\\|grep\\)" command)) + (cl-letf (((symbol-function 'display-buffer) #'ignore)) + (save-window-excursion ad-do-it)) + ad-do-it)) + (ad-activate 'compilation-start)) #+end_src *** Search for non-ASCII characters @@ -665,8 +697,23 @@ for this. #+begin_src emacs-lisp (bind-keys - ("s-c e b" . eval-buffer) - ("s-c e r" . eval-region) + ("C-c a i" . ielm) + + ("C-c e b" . eval-buffer) + ("C-c e r" . eval-region) + + ("C-c F m" . make-frame-command) + ("C-c F d" . delete-frame) + ("C-c F D" . delete-other-frames) + + ("C-c o" . other-window) + + ("C-c Q" . save-buffers-kill-terminal) + + ("C-S-h C" . describe-char) + ("C-S-h F" . describe-face) + + ("C-x K" . kill-this-buffer) ("s-p" . beginning-of-buffer) ("s-n" . end-of-buffer)) @@ -696,150 +743,6 @@ customizing it. 'auto-compile-inhibit-compile-detached-git-head)) #+end_src -*** [[https://github.com/noctuid/general.el][general]] - -#+begin_src emacs-lisp -(use-package general - :demand t - :config - (general-evil-setup t) - (general-override-mode) - - (general-create-definer - amin--leader-keys - :keymaps 'override - :states '(emacs normal visual motion insert) - :non-normal-prefix "M-m" - :prefix "SPC")) -#+end_src - -*** [[https://github.com/emacs-evil/evil][evil]] - -#+begin_src emacs-lisp -(use-package evil - :demand t - ;; :hook (org-src-mode . evil-motion-state) - :config - (evil-mode 1) - (general-swap-key nil '(normal motion) ";" ":") - - (setq evil-want-visual-char-semi-exclusive t - evil-cross-lines t) - - ;; custom mode state mappings - (dolist (mspair '((ebdb-mode . emacs) - (term-mode . emacs) - (helpful-mode . motion) - (view-mode . motion))) - (evil-set-initial-state (car mspair) (cdr mspair))) - - ;; fix tab and indentation in src blocks inside org-mode buffer - ;; also see https://git.sr.ht/~bandali/dotfiles/commit/0e2ffd584aafdd4cf256bcdf2473f01c3aaaed55 - (unbind-key "TAB" evil-motion-state-map) - - (unbind-key "C-d" evil-insert-state-map) - (unbind-key "C-v" evil-insert-state-map) - (unbind-key "C-y" evil-insert-state-map) - (unbind-key "C-a" evil-insert-state-map) - (unbind-key "C-e" evil-insert-state-map) - (unbind-key "C-p" evil-insert-state-map) - (unbind-key "C-n" evil-insert-state-map) - (unbind-key "C-k" evil-insert-state-map) - (bind-keys - :map evil-insert-state-map - ("C-k" . kill-line) - ("C-S-k" . evil-insert-digraph) - :map evil-motion-state-map - ([down-mouse-1] . nil))) -#+end_src - -#+begin_src emacs-lisp -(use-package evil-escape - :after evil - :init - (setq evil-escape-excluded-states '(normal visual multiedit emacs motion) - evil-escape-excluded-major-modes '(neotree-mode) - evil-escape-key-sequence "jk" - evil-escape-delay 0.25) - ;; :general - ;; (:states '(insert replace visual operator) - ;; "C-g" #'evil-escape) - :config - (evil-escape-mode 1) - ;; no `evil-escape' in minibuffer - (push #'minibufferp evil-escape-inhibit-functions)) -#+end_src - -#+begin_src emacs-lisp -(use-package evil-nerd-commenter - :after evil - :general - (nmap - "gc" 'evilnc-comment-operator - "gy" 'evilnc-copy-and-comment-lines)) -#+end_src - -#+begin_src emacs-lisp -(use-package evil-surround - :after evil - :general - (omap - "s" 'evil-surround-edit - "S" 'evil-Surround-edit) - (vmap - "S" 'evil-surround-region - "gS" 'evil-Surround-region)) -#+end_src - -#+begin_src emacs-lisp -(amin--leader-keys - "/" '(:ignore t :wk "search") - - "a" '(:ignore t :wk "apps") - "a i" 'ielm - - "a s" '(:ignore t :wk "shells/terms") - - "b" '(:ignore t :wk "buffers") - "b k" 'kill-this-buffer - "b s" 'save-buffer - - "e" '(:ignore t :wk "eval") - "e b" 'eval-buffer - "e r" 'eval-region - - "f" '(:ignore t :wk "files") - - "F" '(:ignore t :wk "frames") - "F m" 'make-frame-command - "F d" 'delete-frame - "F D" 'delete-other-frames - - "h" '(:ignore t :wk "help(ful)") - "h c" 'describe-char - "h f" 'describe-function - "h F" 'describe-face - "h H" 'view-hello-file - "h i" 'info - "h k" 'describe-key - "h l" 'view-lossage - "h v" 'describe-variable - - "o" 'other-window - - "w" '(:ignore t :wk "window") - "w o" 'other-window - "w 0" 'delete-window - "w 1" 'delete-other-windows - "w 2" 'split-window-below - "w 3" 'split-window-right - "w u" 'winner-undo - "w r" 'winner-redo - - "q" '(:ignore t :wk "quit") - "q q" 'save-buffers-kill-terminal) -#+end_src - *** [[https://orgmode.org/][Org mode]] #+begin_quote @@ -853,22 +756,6 @@ In short, my favourite way of life. #+begin_src emacs-lisp (use-package org :defer 1 - :general - (amin--leader-keys - :states 'normal - :keymaps 'org-mode-map - "'" 'org-edit-special) - (amin--leader-keys - :definer 'minor-mode - :states 'normal - :keymaps 'org-src-mode - "'" 'org-edit-src-exit - "k" 'org-edit-src-abort) - (general-define-key - :definer 'minor-mode - :states 'normal - :keymaps 'org-src-mode - "q" 'org-edit-src-exit) :config (setq org-src-tab-acts-natively t org-src-preserve-indentation nil @@ -877,17 +764,6 @@ In short, my favourite way of life. org-highlight-latex-and-related '(entities) org-log-done 'time) (add-to-list 'org-structure-template-alist '("L" . "src emacs-lisp") t) - (after! org-src - (define-key org-src-mode-map [remap evil-write] 'org-edit-src-save) - (define-key org-src-mode-map [remap evil-save-and-close] - (lambda () (interactive) - (org-edit-src-save) - (org-edit-src-exit))) - (define-key org-src-mode-map [remap evil-save-modified-and-close] - (lambda () (interactive) - (org-edit-src-save) - (org-edit-src-exit))) - (define-key org-src-mode-map [remap evil-quit] 'org-edit-src-abort)) (font-lock-add-keywords 'org-mode '(("[ \t]*\\(#\\+\\(BEGIN\\|END\\|begin\\|end\\)_\\(\\S-+\\)\\)[ \t]*\\([^\n:]*\\)" @@ -926,13 +802,6 @@ In short, my favourite way of life. (use-package ox-beamer :after ox) -(use-package ob-tangle - :general - (amin--leader-keys - :states 'normal - :keymaps 'org-mode-map - "b t" 'org-babel-tangle)) - (use-package orgalist :after message :hook (message-mode . orgalist-mode)) @@ -961,7 +830,8 @@ file. (let* ((file-tangle-start-time (current-time)) (file (buffer-file-name)) (file-nodir (file-name-nondirectory file)) - (async-quiet-switch "-q")) + ;; (async-quiet-switch "-q") + ) (async-start `(lambda () (require 'org) @@ -997,8 +867,9 @@ Not just how I do git, but /the/ way to do git. #+begin_src emacs-lisp (use-package magit :defer 1 - :general (amin--leader-keys "g s" 'magit-status) - :bind ("s-g" . magit-status) + :bind (("C-x g" . magit-status) + ("s-g s" . magit-status) + ("s-g l" . magit-log-buffer-file)) :config (magit-add-section-hook 'magit-status-sections-hook 'magit-insert-modules @@ -1027,7 +898,6 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package ivy :defer 1 - :general (amin--leader-keys "," 'ivy-switch-buffer) :bind (:map ivy-minibuffer-map ([escape] . keyboard-escape-quit) @@ -1048,9 +918,9 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package swiper - :general (:states '(normal motion) "/" 'swiper) - :bind (("C-s" . swiper) - ("C-r" . swiper))) + :bind (("C-s" . swiper) + ("C-r" . swiper) + ("C-S-s" . isearch-forward))) #+end_src **** Counsel @@ -1058,11 +928,6 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package counsel :defer 1 - :general - (amin--leader-keys - "r" 'counsel-recentf - "SPC" 'counsel-M-x - "." 'counsel-find-file) :bind (([remap execute-extended-command] . counsel-M-x) ([remap find-file] . counsel-find-file) ("s-r" . counsel-recentf) @@ -1081,6 +946,7 @@ There's no way I could top that, so I won't attempt to. (use-package eshell :defer 1 :commands eshell + :bind ("C-c a s e" . eshell) :config (eval-when-compile (defvar eshell-prompt-regexp)) (defun amin/eshell-quit-or-delete-char (arg) @@ -1097,7 +963,7 @@ There's no way I could top that, so I won't attempt to. (defun amin|eshell-setup () (make-local-variable 'company-idle-delay) - (setq company-idle-delay nil) + (defvar company-idle-delay nil) (bind-keys :map eshell-mode-map ("C-d" . amin/eshell-quit-or-delete-char) ("C-S-l" . amin/eshell-clear) @@ -1115,7 +981,6 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package ibuffer :defer t - :general (amin--leader-keys "b b" 'ibuffer-other-window) :bind (("C-x C-b" . ibuffer-other-window) :map ibuffer-mode-map @@ -1137,6 +1002,13 @@ There's no way I could top that, so I won't attempt to. '(("default" ("dired" (mode . dired-mode)) ("org" (mode . org-mode)) + ("gnus" + (or + (mode . gnus-group-mode) + (mode . gnus-summary-mode) + (mode . gnus-article-mode) + ;; not really, but... + (mode . message-mode))) ("web" (or (mode . web-mode) @@ -1146,20 +1018,21 @@ There's no way I could top that, so I won't attempt to. ("shell" (or (mode . eshell-mode) - (mode . shell-mode))) - ("notmuch" (name . "\*notmuch\*")) + (mode . shell-mode) + (mode . term-mode))) ("programming" (or (mode . python-mode) + (mode . c-mode) (mode . c++-mode) - (mode . emacs-lisp-mode))) + (mode . emacs-lisp-mode) + (mode . scheme-mode) + (mode . haskell-mode) + (mode . lean-mode))) ("emacs" (or (name . "^\\*scratch\\*$") - (name . "^\\*Messages\\*$"))) - ("slack" - (or - (name . "^\\*Slack*")))))) + (name . "^\\*Messages\\*$")))))) (ibuffer-formats '((mark modified read-only locked " " (name 18 18 :left :elide) @@ -1197,6 +1070,9 @@ There's no way I could top that, so I won't attempt to. #+end_src * Borg's =layer/essentials= +:PROPERTIES: +:CUSTOM_ID: borg-essentials +:END: TODO: break this giant source block down into individual org sections. @@ -1276,18 +1152,12 @@ TODO: break this giant source block down into individual org sections. (add-to-list 'tramp-default-proxies-alist (list (regexp-quote (system-name)) nil nil))) -(use-package undo-tree - :config - (global-undo-tree-mode -1)) - ;; :bind (("C-?" . undo-tree-undo) - ;; ("M-_" . undo-tree-redo)) - ;; :config - ;; (global-undo-tree-mode) - ;; (setq undo-tree-mode-lighter "" - ;; undo-tree-auto-save-history t)) #+end_src * Editing +:PROPERTIES: +:CUSTOM_ID: editing +:END: ** Company @@ -1309,6 +1179,10 @@ TODO: break this giant source block down into individual org sections. #+end_src * Syntax and spell checking +:PROPERTIES: +:CUSTOM_ID: syntax-spell-checking +:END: + #+begin_src emacs-lisp (use-package flycheck :defer 3 @@ -1351,6 +1225,9 @@ TODO: break this giant source block down into individual org sections. #'endless/replace-quote)) #+end_src * Programming modes +:PROPERTIES: +:CUSTOM_ID: programming-modes +:END: ** [[http://alloytools.org][Alloy]] (with [[https://github.com/dwwmmn/alloy-mode][alloy-mode]]) @@ -1621,19 +1498,11 @@ instead. :hook (web-mode css-mode html-mode sgml-mode)) #+end_src -** Nix - -#+begin_src emacs-lisp -(use-package nix-mode - :defer t - :mode "\\.nix\\'") -#+end_src - -** Java +** COMMENT Java *** meghanada -#+begin_src emacs-lisp :tangle no +#+begin_src emacs-lisp (use-package meghanada :bind (:map meghanada-mode-map @@ -1660,7 +1529,7 @@ tree-mode treemacs #+end_comment -#+begin_src emacs-lisp :tangle no +#+begin_src emacs-lisp (use-package treemacs :config (setq treemacs-never-persist t)) @@ -1710,7 +1579,27 @@ treemacs :after (treemacs)) #+end_src -* Emacs Enhancements +** geiser + +#+begin_src emacs-lisp +(use-package geiser) + +(use-package geiser-guile + :config + (setq geiser-guile-load-path "~/src/git/guix")) +#+end_src + +** guix + +#+begin_src emacs-lisp +(use-package guix + :load-path "lib/guix/elisp") +#+end_src + +* Emacs enhancements +:PROPERTIES: +:CUSTOM_ID: emacs-enhancements +:END: ** [[https://github.com/justbur/emacs-which-key][which-key]] @@ -1731,13 +1620,12 @@ Emacs package that displays available keybindings in popup (load-theme 'tangomod t) #+end_src -** doom-modeline +** smart-mode-line #+begin_src emacs-lisp -(use-package doom-modeline - :demand t - :config (setq doom-modeline-height 32) - :hook (after-init . doom-modeline-init)) +(use-package smart-mode-line + :config + (sml/setup)) #+end_src ** doom-themes @@ -1752,21 +1640,20 @@ Emacs package that displays available keybindings in popup (defun amin/lights-on () "Enable my favourite light theme." (interactive) - (progn - (mapc #'disable-theme custom-enabled-themes) - (load-theme 'tangomod t))) + (mapc #'disable-theme custom-enabled-themes) + (load-theme 'tangomod t) + (sml/apply-theme 'automatic)) (defun amin/lights-off () "Go dark." (interactive) - (progn - (mapc #'disable-theme custom-enabled-themes) - (load-theme 'doom-tomorrow-night t))) + (mapc #'disable-theme custom-enabled-themes) + (load-theme 'doom-tomorrow-night t) + (sml/apply-theme 'automatic)) -(amin--leader-keys - "t" '(:ignore t :wk "theme") - "t d" 'amin/lights-off - "t l" 'amin/lights-on) +(bind-keys + ("s-t d" . amin/lights-off) + ("s-t l" . amin/lights-on)) #+end_src ** [[https://github.com/bbatsov/crux][crux]] @@ -1774,28 +1661,20 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package crux :defer 1 - :general - (amin--leader-keys - "b K" 'crux-kill-other-buffers - "c d" 'crux-duplicate-current-line-or-region - "c D" 'crux-duplicate-and-comment-current-line-or-region - "f c" 'crux-copy-file-preserve-attributes - "f d" 'crux-delete-file-and-buffer - "f r" 'crux-rename-file-and-buffer) - :bind (("C-c d" . crux-duplicate-current-line-or-region) - ("C-c D" . crux-duplicate-and-comment-current-line-or-region) - ("C-S-j" . crux-top-join-line) - ("C-c j" . crux-top-join-line))) + :bind (("C-c b k" . crux-kill-other-buffers) + ("C-c d" . crux-duplicate-current-line-or-region) + ("C-c 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 j" . crux-top-join-line) + ("C-S-j" . crux-top-join-line))) #+end_src ** [[https://github.com/alezost/mwim.el][mwim]] #+begin_src emacs-lisp (use-package mwim - :general - (:states '(normal visual) - "0" 'mwim-beginning-of-code-or-line - "$" 'mwim-end-of-code-or-line) :bind (("C-a" . mwim-beginning-of-code-or-line) ("C-e" . mwim-end-of-code-or-line) ("" . mwim-beginning-of-line-or-code) @@ -1828,62 +1707,12 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package helpful :defer 1 - :general - (amin--leader-keys - "h h" '(:ignore t :wk "helpful") - "h h c" 'helpful-command - "h h f" 'helpful-callable ; helpful-function - "h h v" 'helpful-variable - "h h k" 'helpful-key - "h h p" 'helpful-at-point)) -#+end_src - -** [[https://github.com/knu/shell-toggle.el][shell-toggle]] - -#+begin_src emacs-lisp -(use-package shell-toggle - :after eshell - :general (amin--leader-keys "a s e" 'amin/shell-toggle) - :bind ("C-c e" . amin/shell-toggle) - :config - (defun amin/shell-toggle (make-cd) - "Toggle between the shell buffer and whatever buffer you are editing. -With a prefix argument MAKE-CD also insert a \"cd DIR\" command -into the shell, where DIR is the directory of the current buffer. - -When called in the shell buffer returns you to the buffer you were editing -before calling this the first time. - -Options: `shell-toggle-goto-eob'" - (interactive "P") - ;; Try to decide on one of three possibilities: - ;; If not in shell-buffer, switch to it. - ;; If in shell-buffer, return to state before going to the shell-buffer - (if (eq (current-buffer) shell-toggle-shell-buffer) - (shell-toggle-buffer-return-from-shell) - (progn - (shell-toggle-buffer-goto-shell make-cd) - (if shell-toggle-full-screen-window-only (delete-other-windows))))) - - ;; override to split horizontally instead - (defun shell-toggle-buffer-switch-to-other-window () - "Switch to other window. -If the current window is the only window in the current frame, -create a new window and switch to it. - -\(This is less intrusive to the current window configuration than -`switch-buffer-other-window')" - (let ((this-window (selected-window))) - (other-window 1) - ;; If we did not switch window then we only have one window and need to - ;; create a new one. - (if (eq this-window (selected-window)) - (progn - (split-window-horizontally) - (other-window 1))))) - - :custom - (shell-toggle-launch-shell 'shell-toggle-eshell)) + :bind + (("C-S-h c" . helpful-command) + ("C-S-h f" . helpful-callable) ; helpful-function + ("C-S-h v" . helpful-variable) + ("C-S-h k" . helpful-key) + ("C-S-h p" . helpful-at-point))) #+end_src ** [[https://github.com/EricCrosson/unkillable-scratch][unkillable-scratch]] @@ -1938,7 +1767,7 @@ Make =*scratch*= and =*Messages*= unkillable. Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. -** COMMENT [[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guides]] :ARCHIVE: +** COMMENT [[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guides]] #+begin_src emacs-lisp (use-package highlight-indent-guides @@ -1974,12 +1803,6 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. ("l" . image-forward-hscroll))) #+end_src -** anzu - -#+begin_src emacs-lisp -(use-package anzu) -#+end_src - ** typo.el #+begin_src emacs-lisp @@ -1990,7 +1813,47 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. :hook (text-mode . typo-mode)) #+end_src -** slack +** hl-todo + +#+begin_src emacs-lisp +(use-package hl-todo + :defer 4 + :config + (global-hl-todo-mode)) +#+end_src + +** shrink-path + +#+begin_src emacs-lisp +(use-package shrink-path + :after eshell + :config + (setq eshell-prompt-regexp "\\(.*\n\\)*λ " + eshell-prompt-function #'+eshell/prompt) + + (defun +eshell/prompt () + (let ((base/dir (shrink-path-prompt default-directory))) + (concat (propertize (car base/dir) + 'face 'font-lock-comment-face) + (propertize (cdr base/dir) + 'face 'font-lock-constant-face) + (propertize (+eshell--current-git-branch) + 'face 'font-lock-function-name-face) + "\n" + (propertize "λ" 'face 'eshell-prompt-face) + ;; needed for the input text to not have prompt face + (propertize " " 'face 'default)))) + + (defun +eshell--current-git-branch () + (let ((branch (car (loop for match in (split-string (shell-command-to-string "git branch") "\n") + when (string-match "^\*" match) + collect match)))) + (if (not (eq branch nil)) + (concat " " (substring branch 2)) + "")))) +#+end_src + +** COMMENT slack Hopefully temporary. @@ -2055,58 +1918,6 @@ Hopefully temporary. (setq alert-default-style 'notifier)) #+end_src -** hl-todo - -#+begin_src emacs-lisp -(use-package hl-todo - :defer 4 - :config - (global-hl-todo-mode)) -#+end_src - -** shrink-path - -#+begin_src emacs-lisp -(use-package shrink-path - :after eshell - :config - (setq eshell-prompt-regexp "\\(.*\n\\)*λ " - eshell-prompt-function #'+eshell/prompt) - - (defun +eshell/prompt () - (let ((base/dir (shrink-path-prompt default-directory))) - (concat (propertize (car base/dir) - 'face 'font-lock-comment-face) - (propertize (cdr base/dir) - 'face 'font-lock-constant-face) - (propertize (+eshell--current-git-branch) - 'face 'font-lock-function-name-face) - "\n" - (propertize "λ" 'face 'eshell-prompt-face) - ;; needed for the input text to not have prompt face - (propertize " " 'face 'default)))) - - (defun +eshell--current-git-branch () - (let ((branch (car (loop for match in (split-string (shell-command-to-string "git branch") "\n") - when (string-match "^\*" match) - collect match)))) - (if (not (eq branch nil)) - (concat " " (substring branch 2)) - "")))) -#+end_src - -** magithub - -For when I /have to/ use GH. - -#+begin_src emacs-lisp -(use-package magithub - :after magit - :config - (magithub-feature-autoinject t) - (setq magithub-clone-default-directory "~/src/git")) -#+end_src - ** [[https://github.com/peterwvj/eshell-up][eshell-up]] #+begin_src emacs-lisp @@ -2119,10 +1930,9 @@ For when I /have to/ use GH. #+begin_src emacs-lisp (use-package multi-term :defer 1 - :general (amin--leader-keys - "a s m" 'multi-term - "a s p" 'multi-term-dedicated-toggle) - :bind ("C-c C-j" . term-line-mode) + :bind (("C-c C-j" . term-line-mode) + ("C-c a s m m" . multi-term) + ("C-c a s m p" . multi-term-dedicated-toggle)) :config (setq multi-term-program "/bin/screen" ;; TODO: add separate bindings for connecting to existing @@ -2148,7 +1958,25 @@ For when I /have to/ use GH. '("C-z" "C-x" "C-c" "C-h" "C-y" ""))) #+end_src +** page-break-lines + +#+begin_src emacs-lisp +(use-package page-break-lines + :config + (global-page-break-lines-mode)) +#+end_src + +** expand-region + +#+begin_src emacs-lisp +(use-package expand-region + :bind ("C-=" . er/expand-region)) +#+end_src + * Email +:PROPERTIES: +:CUSTOM_ID: email +:END: #+begin_src emacs-lisp (defvar amin-maildir (expand-file-name "~/mail/")) @@ -2165,12 +1993,10 @@ For when I /have to/ use GH. read-mail-command 'gnus) (use-package gnus - :general - (amin--leader-keys - "m" 'gnus - "M" 'gnus-unplugged) - :bind (("s-m" . gnus) - ("s-M" . gnus-unplugged)) + :bind (("C-c m" . gnus) + ("C-c M" . gnus-unplugged) + ("s-m" . gnus) + ("s-M" . gnus-unplugged)) :init (setq gnus-select-method '(nnnil "") @@ -2242,27 +2068,25 @@ For when I /have to/ use GH. :map gnus-summary-mode-map ("r" . gnus-summary-reply-with-original) ("R" . gnus-summary-wide-reply-with-original) - ("M-L" . org-store-link))) + ("M-L" . org-store-link)) + :hook (gnus-summary-mode . amin--no-mouse-autoselect-window)) (use-package gnus-msg :config (setq gnus-posting-styles '((".*" - (address "amin@bandali.me") + (address "amin@aminb.org") (body "\nBest,\namin\n") - (signature-file "~/.signature-amin") (eval (setq amin--message-cite-say-hi t))) ("gnu.*" - (address "bandali@gnu.org") - (signature-file nil)) + (address "bandali@gnu.org")) ((header "subject" "ThankCRM") (to "webmasters-comment@gnu.org") (body "\nAdded to 2018supporters.html.\n\nMoving to campaigns.\n\n-amin\n") (eval (setq amin--message-cite-say-hi nil))) ("nnimap\\+uwaterloo:.*" (address "abandali@uwaterloo.ca") - (gcc "\"nnimap+uwaterloo:Sent Items\"") - (signature-file nil))))) + (gcc "\"nnimap+uwaterloo:Sent Items\""))))) (use-package gnus-topic :hook (gnus-group-mode . gnus-topic-mode)) @@ -2315,7 +2139,7 @@ For when I /have to/ use GH. message-send-mail-function 'message-send-mail-with-sendmail message-sendmail-envelope-from 'header message-dont-reply-to-names - "\\(\\(amin@bandali\\.me\\)\\|\\(.*@aminb\\.org\\)\\|\\(\\(aminb?\\|mab\\|bandali\\)@gnu\\.org\\)\\|\\(\\(m\\|a\\(min\\.\\)?\\)bandali@uwaterloo\\.ca\\)\\)" + "\\(\\(.*@aminb\\.org\\)\\|\\(amin@bandali\\.me\\)\\|\\(\\(aminb?\\|mab\\|bandali\\)@gnu\\.org\\)\\|\\(\\(m\\|a\\(min\\.\\)?\\)bandali@uwaterloo\\.ca\\)\\)" message-user-fqdn "aminb.org") :hook (;; (message-setup . mml-secure-message-sign-pgpmime) (message-mode . flyspell-mode) @@ -2359,7 +2183,59 @@ Convenient footnotes in =message-mode=. footnote-style 'unicode)) #+end_src -** bbdb +** ebdb + +#+begin_src emacs-lisp +(use-package ebdb + :defer 1 + :bind (:map gnus-group-mode-map ("e" . ebdb)) + :config + (setq ebdb-sources (no-littering-expand-var-file-name "ebdb")) + (after! swiper + (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t))) + +(use-package ebdb-com + :after ebdb) + +;; (use-package ebdb-complete +;; :after ebdb +;; :config +;; (ebdb-complete-enable)) + +(use-package company-ebdb + :after (:all company message) + :config + (defun company-ebdb--post-complete (_) nil) + :hook + (message-mode . (lambda () + (add-to-list (make-local-variable 'company-backends) + 'company-ebdb)))) + +(use-package ebdb-gnus + :after ebdb + :custom + (ebdb-gnus-window-configuration + '(article + (vertical 1.0 + (summary 0.25 point) + (horizontal 1.0 + (article 1.0) + (ebdb-gnus 0.3)))))) + +(use-package ebdb-mua + :after ebdb + ;; :custom (ebdb-mua-pop-up nil) + ) + +;; (use-package ebdb-message +;; :after ebdb) + + +;; (use-package ebdb-vcard +;; :after ebdb) +#+end_src + +** COMMENT bbdb Manually install bbdb (=lisp/bbdb= copied from an ELPA-based setup), because installing it from source on Emacs 27 using the following @@ -2420,6 +2296,10 @@ I tried using =borg-elpa= instead of doing it like this, but it added #+end_src * Blogging +:PROPERTIES: +:CUSTOM_ID: blogging +:END: + ** [[https://ox-hugo.scripter.co][ox-hugo]] #+begin_src emacs-lisp @@ -2455,4 +2335,5 @@ Display how long it took to load the init file. * COMMENT Local Variables :ARCHIVE: # Local Variables: # eval: (add-hook 'after-save-hook #'amin/async-babel-tangle 'append 'local) +# eval: (typo-mode -1) # End: