X-Git-Url: https://git.shemshak.org/gitweb.cgi/~bandali/configs/blobdiff_plain/2ec331fcb08163313f9eb0490f7d7dbd6d9ded0a..e931bbddd5b72fa2edf21778c96fa95227cbe36d:/init.org?ds=sidebyside diff --git a/init.org b/init.org index 4e3ee52..257e868 100644 --- a/init.org +++ b/init.org @@ -207,6 +207,13 @@ does that (and more). See =straight-package-neutering-mode=. *** =straight.el= +#+begin_quote +Next-generation, purely functional package manager for the Emacs +hacker. +#+end_quote + +=straight.el= allows me to have a fully reproducible Emacs setup. + #+begin_src emacs-lisp (setq straight-repository-branch "develop") @@ -226,6 +233,19 @@ does that (and more). See =straight-package-neutering-mode=. (setq straight-use-package-by-default t) #+end_src +Since we enable =straight.el='s =straight-use-package-by-default= +integration, we will define a =use-feature= for plain ole +=use-package= without any of the =straight.el= stuff. + +#+begin_src emacs-lisp +(defmacro use-feature (name &rest args) + "Like `use-package', but with `straight-use-package-by-default' disabled." + (declare (indent defun)) + `(use-package ,name + :straight nil +,@args)) +#+end_src + *** COMMENT Borg #+begin_quote @@ -276,6 +296,8 @@ and without compromising on performance. debug-on-error t) (setq use-package-verbose nil use-package-expand-minimally t)) + +(setq use-package-always-defer t) #+end_src *** COMMENT Epkg @@ -330,8 +352,7 @@ definitely don't want it mixing with =init.el=. So, here; let's give it it's own file. While at it, treat themes as safe. #+begin_src emacs-lisp -(use-package custom - :straight nil +(use-feature custom :no-require t :config (setq custom-file (no-littering-expand-etc-file-name "custom.el")) @@ -385,8 +406,7 @@ login; so starting the server from inside Emacs is good enough for me. See [[https://www.gnu.org/software/emacs/manual/html_node/emacs/Emacs-Server.html#Emacs-Server][Using Emacs as a Server]]. #+begin_src emacs-lisp -(use-package server - :straight nil +(use-feature server :defer 1 :config (or (server-running-p) (server-mode))) #+end_src @@ -700,9 +720,16 @@ for this. (setq-default cursor-type 'bar) #+end_src +*** Allow scrolling in Isearch + +#+begin_src emacs-lisp +(setq isearch-allow-scroll t) +#+end_src + ** Bindings #+begin_src emacs-lisp +(require 'bind-key) (bind-keys ("C-c a i" . ielm) @@ -804,8 +831,7 @@ We will use the =org-plus-contrib= package to get the whole deal: And here's where my actual Org configurations begin: #+begin_src emacs-lisp -(use-package org - :straight nil +(use-feature org :defer 0.5 :config (setq org-src-tab-acts-natively t @@ -836,8 +862,7 @@ And here's where my actual Org configurations begin: '(org-block ((t (:background "#1d1f21")))) '(org-latex-and-related ((t (:foreground "#b294bb"))))) -(use-package ox-latex - :straight nil +(use-feature ox-latex :after ox :config (setq org-latex-listings 'listings @@ -854,13 +879,8 @@ And here's where my actual Org configurations begin: ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) t)) -(use-package ox-beamer - :straight nil +(use-feature ox-beamer :after ox) - -(use-package orgalist - :after message - :hook (message-mode . orgalist-mode)) #+end_src **** asynchronous tangle @@ -877,9 +897,12 @@ file. (defvar a/show-async-tangle-time nil "Show the time spent tangling the file.") - (defvar a/async-tangle-post-compile "make ti" + (defvar a/async-tangle-post-compile nil "If non-nil, pass to `compile' after successful tangle.") + (defvar a/async-tangle-byte-recompile t + "If non-nil, byte-recompile the file on successful tangle.") + (defun a/async-babel-tangle () "Tangle org file asynchronously." (interactive) @@ -887,7 +910,7 @@ file. (file (buffer-file-name)) (file-nodir (file-name-nondirectory file)) ;; (async-quiet-switch "-q") - ) + (file-noext (file-name-sans-extension file))) (async-start `(lambda () (require 'org) @@ -896,6 +919,7 @@ file. `(lambda (result) (if result (progn + (setq byte-compile-warnings '(not noruntime unresolved)) (message "Tangled %s%s" ,file-nodir (if a/show-async-tangle-time @@ -904,7 +928,9 @@ file. ',file-tangle-start-time))) "")) (when a/async-tangle-post-compile - (compile a/async-tangle-post-compile))) + (compile a/async-tangle-post-compile)) + (when a/async-tangle-byte-recompile + (byte-recompile-file (concat ,file-noext ".el")))) (message "Tangling %s failed" ,file-nodir)))))))) (add-to-list @@ -940,7 +966,31 @@ Not just how I do git, but /the/ way to do git. :custom-face (magit-diff-file-heading ((t (:weight normal))))) #+end_src -*** COMMENT [[https://github.com/abo-abo/swiper][Ivy]] (and friends) +*** recentf + +Recently opened files. + +#+begin_src emacs-lisp +(use-feature recentf + :defer 0.5 + :config + (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:") + (setq recentf-max-saved-items 40)) +#+end_src + +*** smex + +#+begin_quote +A smart M-x enhancement for Emacs. +#+end_quote + +Mostly because =counsel= needs it to remember history. + +#+begin_src emacs-lisp +(use-package smex) +#+end_src + +*** [[https://github.com/abo-abo/swiper][Ivy]] (and friends) #+begin_quote Ivy - a generic completion frontend for Emacs, Swiper - isearch with @@ -953,7 +1003,7 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package ivy - :defer 1 + :defer 0.6 :bind (:map ivy-minibuffer-map ([escape] . keyboard-escape-quit) @@ -974,6 +1024,7 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package swiper + :after ivy :bind (("C-s" . swiper) ("C-r" . swiper) ("C-S-s" . isearch-forward))) @@ -983,7 +1034,7 @@ There's no way I could top that, so I won't attempt to. #+begin_src emacs-lisp (use-package counsel - :defer 1 + :after ivy :bind (([remap execute-extended-command] . counsel-M-x) ([remap find-file] . counsel-find-file) ("s-r" . counsel-recentf) @@ -996,10 +1047,10 @@ There's no way I could top that, so I won't attempt to. (defalias 'locate #'counsel-locate)) #+end_src -*** COMMENT eshell +*** eshell #+begin_src emacs-lisp -(use-package eshell +(use-feature eshell :defer 1 :commands eshell :bind ("C-c a s e" . eshell) @@ -1033,11 +1084,10 @@ There's no way I could top that, so I won't attempt to. (eshell-input-filter 'eshell-input-filter-initial-space)) #+end_src -*** COMMENT Ibuffer +*** Ibuffer #+begin_src emacs-lisp -(use-package ibuffer - :defer t +(use-feature ibuffer :bind (("C-x C-b" . ibuffer-other-window) :map ibuffer-mode-map @@ -1104,11 +1154,10 @@ There's no way I could top that, so I won't attempt to. :hook (ibuffer . (lambda () (ibuffer-switch-to-saved-filter-groups "default")))) #+end_src -*** COMMENT Outline +*** Outline #+begin_src emacs-lisp -(use-package outline - :defer t +(use-feature outline :hook (prog-mode . outline-minor-mode) :bind (:map @@ -1126,28 +1175,13 @@ There's no way I could top that, so I won't attempt to. ("s" . outline-show-subtree))) #+end_src -* COMMENT Borg's =layer/essentials= -:PROPERTIES: -:CUSTOM_ID: borg-essentials -:END: - -TODO: break this giant source block down into individual org sections. +*** Dired #+begin_src emacs-lisp -(use-package dash - :config (dash-enable-font-lock)) - -(use-package diff-hl - :config - (setq diff-hl-draw-borders nil) - (global-diff-hl-mode) - (add-hook 'magit-post-refresh-hook 'diff-hl-magit-post-refresh t)) - -(use-package ls-lisp +(use-feature ls-lisp :custom (ls-lisp-dirs-first t)) -(use-package dired - :defer t +(use-feature dired :config (setq dired-listing-switches "-alh" ls-lisp-use-insert-directory-program nil) @@ -1156,6 +1190,7 @@ TODO: break this giant source block down into individual org sections. ;; https://oremacs.com/2017/03/18/dired-ediff/ (defun dired-ediff-files () (interactive) + (require 'dired-aux) (defvar ediff-after-quit-hook-internal) (let ((files (dired-get-marked-files)) (wnd (current-window-configuration))) @@ -1175,6 +1210,7 @@ TODO: break this giant source block down into individual org sections. (set-window-configuration wnd)))) (error "no more than 2 files should be marked")))) :bind (:map dired-mode-map + ("b" . dired-up-directory) ("e" . dired-ediff-files) ("E" . dired-toggle-read-only) ("\\" . dired-hide-details-mode) @@ -1182,76 +1218,108 @@ TODO: break this giant source block down into individual org sections. (interactive) (a/dired-start-process "zathura")))) :hook (dired-mode . dired-hide-details-mode)) +#+end_src -(use-package eldoc - :when (version< "25" emacs-version) - :config (global-eldoc-mode)) +*** Help -(use-package help - :defer t +#+begin_src emacs-lisp +(use-feature help :config (temp-buffer-resize-mode) (setq help-window-select t)) +#+end_src -(progn ; `isearch' - (setq isearch-allow-scroll t)) +*** Tramp -(use-package lisp-mode +#+begin_src emacs-lisp +(use-feature tramp :config - (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode) - (add-hook 'emacs-lisp-mode-hook 'reveal-mode) - (defun indent-spaces-mode () - (setq indent-tabs-mode nil)) - (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode)) + (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:")) + (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil)) + (add-to-list 'tramp-default-proxies-alist + (list (regexp-quote (system-name)) nil nil))) +#+end_src -(use-package man - :defer t - :config (setq Man-width 80)) +*** Dash -(use-package paren - :config (show-paren-mode)) +#+begin_src emacs-lisp +(use-package dash + :config (dash-enable-font-lock)) +#+end_src -(use-package prog-mode - :config (global-prettify-symbols-mode) - (defun indicate-buffer-boundaries-left () - (setq indicate-buffer-boundaries 'left)) - (add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left)) +* Editing +:PROPERTIES: +:CUSTOM_ID: editing +:END: -(use-package recentf - :defer 0.5 +** =diff-hl= + +Highlight uncommitted changes in the left fringe. + +#+begin_src emacs-lisp +(use-package diff-hl :config - (add-to-list 'recentf-exclude "^/\\(?:ssh\\|su\\|sudo\\)?:") - (setq recentf-max-saved-items 40)) + (setq diff-hl-draw-borders nil) + (global-diff-hl-mode) + :hook (magit-post-refresh . diff-hl-magit-post-refresh)) +#+end_src + +** ElDoc -(use-package savehist +Display Lisp objects at point in the echo area. + +#+begin_src emacs-lisp +(use-feature eldoc + :when (version< "25" emacs-version) + :config (global-eldoc-mode)) +#+end_src + +** paren + +Highlight matching parens. + +#+begin_src emacs-lisp +(use-feature paren + :config (show-paren-mode)) +#+end_src + +** =savehist= + +Save minibuffer history. + +#+begin_src emacs-lisp +(use-feature savehist :config (savehist-mode)) +#+end_src + +** =saveplace= + +Automatically save place in each file. -(use-package saveplace +#+begin_src emacs-lisp +(use-feature saveplace :when (version< "25" emacs-version) :config (save-place-mode)) +#+end_src -(use-package simple - :config (column-number-mode)) +** =prog-mode= -(progn ; `text-mode' - (add-hook 'text-mode-hook #'indicate-buffer-boundaries-left) - (add-hook 'text-mode-hook #'abbrev-mode)) +#+begin_src emacs-lisp +(use-feature prog-mode + :config (global-prettify-symbols-mode) + (defun indicate-buffer-boundaries-left () + (setq indicate-buffer-boundaries 'left)) + (add-hook 'prog-mode-hook #'indicate-buffer-boundaries-left)) +#+end_src -(use-package tramp - :defer t - :config - (add-to-list 'tramp-default-proxies-alist '(nil "\\`root\\'" "/ssh:%h:")) - (add-to-list 'tramp-default-proxies-alist '("localhost" nil nil)) - (add-to-list 'tramp-default-proxies-alist - (list (regexp-quote (system-name)) nil nil))) +** =text-mode= +#+begin_src emacs-lisp +(use-feature text-mode + :hook ((text-mode . indicate-buffer-boundaries-left) + (text-mode . abbrev-mode))) #+end_src -* COMMENT Editing -:PROPERTIES: -:CUSTOM_ID: editing -:END: - ** Company #+begin_src emacs-lisp @@ -1271,10 +1339,7 @@ TODO: break this giant source block down into individual org sections. (global-company-mode t)) #+end_src -* COMMENT Syntax and spell checking -:PROPERTIES: -:CUSTOM_ID: syntax-spell-checking -:END: +** Flycheck #+begin_src emacs-lisp (use-package flycheck @@ -1318,25 +1383,36 @@ TODO: break this giant source block down into individual org sections. #'endless/replace-quote)) #+end_src -* COMMENT Programming modes +* Programming modes :PROPERTIES: :CUSTOM_ID: programming-modes :END: +** Lisp + +#+begin_src emacs-lisp +(use-feature lisp-mode + :config + (add-hook 'emacs-lisp-mode-hook 'outline-minor-mode) + (add-hook 'emacs-lisp-mode-hook 'reveal-mode) + (defun indent-spaces-mode () + (setq indent-tabs-mode nil)) + (add-hook 'lisp-interaction-mode-hook #'indent-spaces-mode)) +#+end_src + ** [[http://alloytools.org][Alloy]] (with [[https://github.com/dwwmmn/alloy-mode][alloy-mode]]) #+begin_src emacs-lisp (use-package alloy-mode - :defer t + :straight (:host github :repo "dwwmmn/alloy-mode") :config (setq alloy-basic-offset 2)) #+end_src ** [[https://coq.inria.fr][Coq]] (with [[https://github.com/ProofGeneral/PG][Proof General]]) #+begin_src emacs-lisp -(use-package proof-site ; Proof General - :defer t - :load-path "lib/proof-site/generic/") +(use-package proof-site + :straight proof-general) #+end_src ** [[https://leanprover.github.io][Lean]] (with [[https://github.com/leanprover/lean-mode][lean-mode]]) @@ -1363,7 +1439,6 @@ TODO: break this giant source block down into individual org sections. #+begin_src emacs-lisp (use-package haskell-mode - :defer t :config (setq haskell-indentation-layout-offset 4 haskell-indentation-left-offset 4 @@ -1546,13 +1621,12 @@ instead. ("C-c l l" . hs-lint))) #+end_src -** Web dev +** Web *** SGML and HTML #+begin_src emacs-lisp (use-package sgml-mode - :defer t :config (setq sgml-basic-offset 2)) #+end_src @@ -1561,7 +1635,6 @@ instead. #+begin_src emacs-lisp (use-package css-mode - :defer t :config (setq css-indent-offset 2)) #+end_src @@ -1570,7 +1643,6 @@ instead. #+begin_src emacs-lisp (use-package web-mode - :defer t :mode "\\.html\\'" :config (a/setq-every 2 @@ -1673,28 +1745,34 @@ treemacs :after (treemacs)) #+end_src -** geiser +** COMMENT geiser #+begin_src emacs-lisp (use-package geiser) -(use-package geiser-guile +(use-feature geiser-guile :config (setq geiser-guile-load-path "~/src/git/guix")) #+end_src -** guix +** COMMENT guix #+begin_src emacs-lisp -(use-package guix - :load-path "lib/guix/elisp") +(use-package guix) #+end_src -* COMMENT Emacs enhancements +* Emacs enhancements :PROPERTIES: :CUSTOM_ID: emacs-enhancements :END: +** man + +#+begin_src emacs-lisp +(use-feature man + :config (setq Man-width 80)) +#+end_src + ** [[https://github.com/justbur/emacs-which-key][which-key]] #+begin_quote @@ -1762,6 +1840,7 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package smart-mode-line + :commands (sml/apply-theme) :config (sml/setup)) #+end_src @@ -1797,7 +1876,7 @@ Emacs package that displays available keybindings in popup ** [[https://github.com/bbatsov/crux][crux]] #+begin_src emacs-lisp -(use-package crux +(use-package crux ; results in Waiting for git... [2 times] :defer 1 :bind (("C-c b k" . crux-kill-other-buffers) ("C-c d" . crux-duplicate-current-line-or-region) @@ -1823,7 +1902,6 @@ Emacs package that displays available keybindings in popup #+begin_src emacs-lisp (use-package projectile - :defer t :bind-keymap ("C-c p" . projectile-command-map) :config (projectile-mode) @@ -1906,6 +1984,14 @@ Make =*scratch*= and =*Messages*= unkillable. Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. +** orgalist + +#+begin_src emacs-lisp +(use-package orgalist + :after message + :hook (message-mode . orgalist-mode)) +#+end_src + ** typo.el #+begin_src emacs-lisp @@ -1929,7 +2015,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. #+begin_src emacs-lisp (use-package shrink-path - :after eshell + :defer 2 :config (setq eshell-prompt-regexp "\\(.*\n\\)*λ " eshell-prompt-function #'+eshell/prompt) @@ -1960,6 +2046,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. #+begin_src emacs-lisp (use-package eshell-up + :commands eshell-up :after eshell) #+end_src @@ -2027,7 +2114,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. ("a" . mc/mark-all-like-this)))) #+end_src -* COMMENT Email +* Email :PROPERTIES: :CUSTOM_ID: email :END: @@ -2046,7 +2133,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. mail-user-agent 'gnus-user-agent read-mail-command 'gnus) -(use-package gnus +(use-feature gnus :bind (("s-m" . gnus) ("s-M" . gnus-unplugged)) :init @@ -2079,7 +2166,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. gnus-interactive-exit nil gnus-gcc-mark-as-read t)) -(use-package gnus-art +(use-feature gnus-art :config (setq gnus-visible-headers @@ -2108,7 +2195,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. ("R" . gnus-article-wide-reply-with-original) ("M-L" . org-store-link))) -(use-package gnus-sum +(use-feature gnus-sum :bind (:map gnus-summary-mode-map :prefix-map a/gnus-summary-prefix-map :prefix "v" @@ -2123,7 +2210,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. ("M-L" . org-store-link)) :hook (gnus-summary-mode . a/no-mouse-autoselect-window)) -(use-package gnus-msg +(use-feature gnus-msg :config (setq gnus-posting-styles '((".*" @@ -2140,19 +2227,19 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. (address "abandali@uwaterloo.ca") (gcc "\"nnimap+uwaterloo:Sent Items\""))))) -(use-package gnus-topic +(use-feature gnus-topic :hook (gnus-group-mode . gnus-topic-mode)) -(use-package gnus-agent +(use-feature gnus-agent :config (setq gnus-agent-synchronize-flags 'ask) :hook (gnus-group-mode . gnus-agent-mode)) -(use-package gnus-group +(use-feature gnus-group :config (setq gnus-permanently-visible-groups "\\((INBOX\\|gnu$\\)")) -(use-package mm-decode +(use-feature mm-decode :config (setq mm-discouraged-alternatives '("text/html" "text/richtext"))) #+end_src @@ -2160,7 +2247,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. ** sendmail #+begin_src emacs-lisp -(use-package sendmail +(use-feature sendmail :config (setq sendmail-program "/usr/bin/msmtp" ;; message-sendmail-extra-arguments '("-v" "-d") @@ -2171,7 +2258,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. ** message #+begin_src emacs-lisp -(use-package message +(use-feature message :config (defconst a/message-cite-style-format "On %Y-%m-%d %l:%M %p, %N wrote:") (defconst message-cite-style-bandali @@ -2216,7 +2303,7 @@ Also see [[https://www.emacswiki.org/emacs/rebox2][rebox2]]. Convenient footnotes in =message-mode=. #+begin_src emacs-lisp -(use-package footnote +(use-feature footnote :after message :bind (:map message-mode-map @@ -2239,14 +2326,14 @@ Convenient footnotes in =message-mode=. #+begin_src emacs-lisp (use-package ebdb - :defer 1 + :after gnus :bind (:map gnus-group-mode-map ("e" . ebdb)) :config (setq ebdb-sources (no-littering-expand-var-file-name "ebdb")) (with-eval-after-load 'swiper (add-to-list 'swiper-font-lock-exclude 'ebdb-mode t))) -(use-package ebdb-com +(use-feature ebdb-com :after ebdb) ;; (use-package ebdb-complete @@ -2263,7 +2350,7 @@ Convenient footnotes in =message-mode=. (add-to-list (make-local-variable 'company-backends) 'company-ebdb)))) -(use-package ebdb-gnus +(use-feature ebdb-gnus :after ebdb :custom (ebdb-gnus-window-configuration @@ -2274,7 +2361,7 @@ Convenient footnotes in =message-mode=. (article 1.0) (ebdb-gnus 0.3)))))) -(use-package ebdb-mua +(use-feature ebdb-mua :after ebdb ;; :custom (ebdb-mua-pop-up nil) ) @@ -2314,7 +2401,7 @@ Convenient footnotes in =message-mode=. (gnus-harvest-install))) #+end_src -* COMMENT Blogging +* Blogging :PROPERTIES: :CUSTOM_ID: blogging :END: @@ -2325,8 +2412,8 @@ Convenient footnotes in =message-mode=. (use-package ox-hugo :after ox) -(use-package ox-hugo-auto-export - :load-path "lib/ox-hugo") +(use-feature ox-hugo-auto-export + :after ox-hugo) #+end_src * Post initialization @@ -2353,6 +2440,6 @@ Display how long it took to load the init file. * COMMENT Local Variables :ARCHIVE: # Local Variables: -# eval: ;; (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local) +# eval: (add-hook 'after-save-hook #'a/async-babel-tangle 'append 'local) # eval: (typo-mode -1) # End: