X-Git-Url: https://git.shemshak.org/gitweb.cgi/~bandali/configs/blobdiff_plain/61669f58ca81a8ff9f33e5fb05e29e74d8a97132..0571b240759700a2036605691e1ac31dc59820aa:/init.org diff --git a/init.org b/init.org index 7c49ca2..7f66c99 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; eval: (view-mode 1) -*- #+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 @@ -125,10 +124,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, @@ -379,7 +374,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 @@ -651,18 +646,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 @@ -682,8 +690,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)) @@ -713,151 +736,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 @@ -871,22 +749,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 @@ -895,17 +757,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:]*\\)" @@ -944,13 +795,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)) @@ -979,7 +823,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) @@ -1015,11 +860,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 @@ -1048,7 +891,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) @@ -1069,7 +911,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 @@ -1079,11 +920,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) @@ -1118,7 +954,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) @@ -1136,7 +972,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 @@ -1158,6 +993,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) @@ -1167,20 +1009,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) @@ -1297,15 +1140,6 @@ 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 @@ -1330,6 +1164,7 @@ TODO: break this giant source block down into individual org sections. #+end_src * Syntax and spell checking + #+begin_src emacs-lisp (use-package flycheck :defer 3 @@ -1642,19 +1477,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 @@ -1681,7 +1508,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)) @@ -1731,6 +1558,23 @@ treemacs :after (treemacs)) #+end_src +** 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 ** [[https://github.com/justbur/emacs-which-key][which-key]] @@ -1752,13 +1596,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 @@ -1773,21 +1616,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]] @@ -1795,28 +1637,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) @@ -1849,14 +1683,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]] @@ -1864,8 +1696,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. @@ -1959,7 +1790,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 @@ -1995,12 +1826,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 @@ -2051,7 +1876,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. "")))) #+end_src -** COMMENT slack :ARCHIVE: +** COMMENT slack Hopefully temporary. @@ -2116,18 +1941,6 @@ Hopefully temporary. (setq alert-default-style 'notifier)) #+end_src -** COMMENT magithub :ARCHIVE: - -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 @@ -2140,10 +1953,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 @@ -2169,6 +1981,14 @@ 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 @@ -2186,12 +2006,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 "") @@ -2439,6 +2257,7 @@ I tried using =borg-elpa= instead of doing it like this, but it added #+end_src * Blogging + ** [[https://ox-hugo.scripter.co][ox-hugo]] #+begin_src emacs-lisp @@ -2474,4 +2293,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: