X-Git-Url: https://git.shemshak.org/gitweb.cgi/~bandali/configs/blobdiff_plain/1d55cea327429e7f12863b6a3d217f96049cfbcb..981ff3ce9a26c24ad5fd0a2cdfed33a015156edf:/init.org?ds=inline diff --git a/init.org b/init.org index 5a163e3..79dbbd2 100644 --- a/init.org +++ b/init.org @@ -65,7 +65,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 -*- #+end_src Enable =view-mode=, which both makes the file read-only (as a reminder @@ -113,7 +113,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 @@ -127,6 +126,9 @@ The conventions below were inspired by [[https://github.com/hlissner/doom-emacs] #+begin_src emacs-lisp :comments none ;;; Code: + + +;; * Initial setup #+end_src ** Emacs initialization @@ -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 @@ -351,12 +352,14 @@ in my shell. (exec-path-from-shell-copy-env "SSH_AUTH_SOCK")) #+end_src -** COMMENT Only one custom theme at a time +** Only one custom theme at a time #+begin_src emacs-lisp -(defadvice load-theme (before clear-previous-themes activate) - "Clear existing theme settings instead of layering them" - (mapc #'disable-theme custom-enabled-themes)) +;; only one custom theme at a time +;; +;; (defadvice load-theme (before clear-previous-themes activate) +;; "Clear existing theme settings instead of layering them" +;; (mapc #'disable-theme custom-enabled-themes)) #+end_src ** Server @@ -375,42 +378,44 @@ See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.htm :config (or (server-running-p) (server-mode))) #+end_src -** COMMENT Unicode support +** Unicode support Font stack with better unicode support, around =Ubuntu Mono= and =Hack=. -#+begin_src emacs-lisp :tangle no -(dolist (ft (fontset-list)) - (set-fontset-font - ft - 'unicode - (font-spec :name "Source Code Pro" :size 14)) - (set-fontset-font - ft - 'unicode - (font-spec :name "DejaVu Sans Mono") - nil - 'append) - ;; (set-fontset-font - ;; ft - ;; 'unicode - ;; (font-spec - ;; :name "Symbola monospacified for DejaVu Sans Mono") - ;; nil - ;; 'append) - ;; (set-fontset-font - ;; ft - ;; #x2115 ; ℕ - ;; (font-spec :name "DejaVu Sans Mono") - ;; nil - ;; 'append) - (set-fontset-font - ft - (cons ?Α ?ω) - (font-spec :name "DejaVu Sans Mono" :size 14) - nil - 'prepend)) +#+begin_src emacs-lisp +;; unicode support +;; +;; (dolist (ft (fontset-list)) +;; (set-fontset-font +;; ft +;; 'unicode +;; (font-spec :name "Source Code Pro" :size 14)) +;; (set-fontset-font +;; ft +;; 'unicode +;; (font-spec :name "DejaVu Sans Mono") +;; nil +;; 'append) +;; ;; (set-fontset-font +;; ;; ft +;; ;; 'unicode +;; ;; (font-spec +;; ;; :name "Symbola monospacified for DejaVu Sans Mono") +;; ;; nil +;; ;; 'append) +;; ;; (set-fontset-font +;; ;; ft +;; ;; #x2115 ; ℕ +;; ;; (font-spec :name "DejaVu Sans Mono") +;; ;; nil +;; ;; 'append) +;; (set-fontset-font +;; ft +;; (cons ?Α ?ω) +;; (font-spec :name "DejaVu Sans Mono" :size 14) +;; nil +;; 'prepend)) #+end_src ** Gentler font resizing @@ -493,6 +498,11 @@ Convenience macro for =setq='ing multiple variables to the same value: :CUSTOM_ID: core :END: +#+begin_src emacs-lisp :comments none + +;; * Core +#+end_src + ** Defaults *** Time and battery in mode-line @@ -683,8 +693,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)) @@ -714,151 +739,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) - (magit-blame-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 @@ -872,22 +752,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 @@ -896,17 +760,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:]*\\)" @@ -945,13 +798,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)) @@ -1016,11 +862,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 - "g l" 'magit-log-buffer-file) - :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 @@ -1049,7 +893,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) @@ -1070,7 +913,6 @@ 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))) #+end_src @@ -1080,11 +922,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) @@ -1137,7 +974,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 @@ -1220,6 +1056,11 @@ There's no way I could top that, so I won't attempt to. * Borg's =layer/essentials= +#+begin_src emacs-lisp :comments none + +;; * Borg's `layer/essentials' +#+end_src + TODO: break this giant source block down into individual org sections. #+begin_src emacs-lisp @@ -1311,6 +1152,11 @@ TODO: break this giant source block down into individual org sections. * Editing +#+begin_src emacs-lisp :comments none + +;; * Editing +#+end_src + ** Company #+begin_src emacs-lisp @@ -1331,6 +1177,12 @@ TODO: break this giant source block down into individual org sections. #+end_src * Syntax and spell checking + +#+begin_src emacs-lisp :comments none + +;; * Syntax and spell checking +#+end_src + #+begin_src emacs-lisp (use-package flycheck :defer 3 @@ -1374,6 +1226,11 @@ TODO: break this giant source block down into individual org sections. #+end_src * Programming modes +#+begin_src emacs-lisp :comments none + +;; * Programming modes +#+end_src + ** [[http://alloytools.org][Alloy]] (with [[https://github.com/dwwmmn/alloy-mode][alloy-mode]]) #+begin_src emacs-lisp @@ -1734,6 +1591,11 @@ treemacs * Emacs Enhancements +#+begin_src emacs-lisp :comments none + +;; * Emacs Enhancements +#+end_src + ** [[https://github.com/justbur/emacs-which-key][which-key]] #+begin_quote @@ -1785,10 +1647,9 @@ Emacs package that displays available keybindings in popup (mapc #'disable-theme custom-enabled-themes) (load-theme 'doom-tomorrow-night t))) -(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]] @@ -1796,28 +1657,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) @@ -1850,14 +1703,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)) + :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/knu/shell-toggle.el][shell-toggle]] @@ -1865,8 +1716,7 @@ Emacs package that displays available keybindings in popup #+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) + :bind ("C-c a s e" . amin/shell-toggle) :config (defun amin/shell-toggle (make-cd) "Toggle between the shell buffer and whatever buffer you are editing. @@ -1960,10 +1810,11 @@ 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: +** [[https://github.com/DarthFennec/highlight-indent-guides][highlight-indent-guides]] #+begin_src emacs-lisp (use-package highlight-indent-guides + :disabled t :defer 3 :hook ((prog-mode . highlight-indent-guides-mode) ;; (org-mode . highlight-indent-guides-mode) @@ -2012,12 +1863,53 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. :hook (text-mode . typo-mode)) #+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 + ** slack Hopefully temporary. #+begin_src emacs-lisp (use-package slack + :disabled t :commands (slack-start) :init (eval-when-compile ; silence the byte-compiler @@ -2077,58 +1969,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 - -** COMMENT 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 @@ -2141,10 +1981,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 @@ -2170,8 +2009,21 @@ 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 + * Email +#+begin_src emacs-lisp :comments none + +;; * Email +#+end_src + #+begin_src emacs-lisp (defvar amin-maildir (expand-file-name "~/mail/")) (after! recentf @@ -2187,10 +2039,6 @@ 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)) :init @@ -2412,10 +2260,11 @@ I tried using =borg-elpa= instead of doing it like this, but it added (bbdb-initialize 'gnus 'message)) #+end_src -** COMMENT message-x +** message-x #+begin_src emacs-lisp (use-package message-x + :disabled t :custom (message-x-completion-alist (quote @@ -2427,10 +2276,11 @@ I tried using =borg-elpa= instead of doing it like this, but it added . message-expand-group))))) #+end_src -** COMMENT gnus-harvest +** gnus-harvest #+begin_src emacs-lisp (use-package gnus-harvest + :disabled t :commands gnus-harvest-install :demand t :config @@ -2440,6 +2290,12 @@ I tried using =borg-elpa= instead of doing it like this, but it added #+end_src * Blogging + +#+begin_src emacs-lisp :comments none + +;; * Blogging +#+end_src + ** [[https://ox-hugo.scripter.co][ox-hugo]] #+begin_src emacs-lisp @@ -2455,6 +2311,11 @@ I tried using =borg-elpa= instead of doing it like this, but it added :CUSTOM_ID: post-initialization :END: +#+begin_src emacs-lisp :comments none + +;; * Post initialization +#+end_src + Display how long it took to load the init file. #+begin_src emacs-lisp