From 026bca14f78b62cd011574d8f97176813a7b7ce1 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Mon, 17 Feb 2025 15:44:21 -0500 Subject: [PATCH 01/10] tweak(org-roam): invert unlinked refs toggle property --- config.org | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.org b/config.org index e6ae040..972c66c 100644 --- a/config.org +++ b/config.org @@ -3558,8 +3558,8 @@ The unlinked references section is turned off by default for performance reasons #+begin_src emacs-lisp (defadvice! ~/org-roam-unlinked-references-p (node) "A predicate to control when unlinked references are shown in the `org-roam' buffer." - :before-while #'org-roam-unlinked-references-section - (assoc "UNLINKED_REFS" (org-roam-node-properties node))) + :before-until #'org-roam-unlinked-references-section + (assoc "ROAM_NO_UNLINKED" (org-roam-node-properties node))) #+end_src #+begin_src emacs-lisp From e468119f0682dad17ce33c554bda33135920cf84 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Mon, 17 Feb 2025 15:45:46 -0500 Subject: [PATCH 02/10] fix(dirvish): remove unnecessary load order delay --- config.org | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/config.org b/config.org index 972c66c..f429b0d 100644 --- a/config.org +++ b/config.org @@ -4023,8 +4023,7 @@ This is the configuration for all the mode-related packages, including programmi The variable ~+workspaces-switch-project-function~ contains a function that is run whenever a project is opened. A file explorer seems like a natural place to open at this point. #+begin_src emacs-lisp -(after! doom-modules - (setq +workspaces-switch-project-function #'dirvish)) +(setq +workspaces-switch-project-function #'dirvish) #+end_src *** Bindings From bfa54c8f5feda477fa383611d10956db46607b8c Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 19 Feb 2025 17:40:56 -0500 Subject: [PATCH 03/10] tweak: change calc keybindings --- config.org | 61 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/config.org b/config.org index f429b0d..64a1e66 100644 --- a/config.org +++ b/config.org @@ -2493,15 +2493,46 @@ If prefix ARG is given, delete the window instead of selecting it." Emacs Calc is the best calculator I've ever used, and given the fact that it's an RPN calculator, that's saying something. -*** Leader Key Bindings +*** Bindings -Typing =C-x *= every time I want to use Calc (very often) is annoying. +**** Evil Bindings + +I want to have vim keybindings in Calc, so let's enable the =evil-collection= module for it by removing it from ~+evil-collection-disabled-list~. + +#+begin_src emacs-lisp +;; Enable evil-collection-calc +(delq 'calc +evil-collection-disabled-list) +#+end_src + +**** Rebindings + +Let's also rebind some keys: + +- We'll set =[= and =]= to directly begin and end vectors like it did originally, as there is very little reason to use Evil's bindings on these keys. +- =C-r= makes more sense as a redo binding than =D D=. +- The "keep arguments" binding (=K=) was removed by =evil-collection= for some reason? I'm putting it back. +- Selection commands are important, so we'll use =J= for them instead of =z j=. + +#+begin_src emacs-lisp +(defadvice! ~/evil-collection-calc-bindings () + :after #'evil-collection-calc-setup + (map! :map calc-mode-map + :n "C-r" #'calc-redo + :n "[" #'calc-begin-vector + :n "]" #'calc-end-vector + :n "K" #'calc-keep-args + :n "J" (keymap-lookup calc-mode-map " z j")) + (map! :map calc-mode-map + :n "z j" nil)) +#+end_src + +**** Leader Key Bindings + +Typing =C-x *= every time I want to use Calc (very often) is annoying. To alleviate this problem, we can create some keybindings under =SPC C=: #+begin_src emacs-lisp (map! :leader - :prefix ("#" . "calc") - :desc "Emacs Calc" - "#" #'calc + :prefix ("C" . "calc") :desc "Emacs Calc" "c" #'calc :desc "Emacs Calc (full window)" @@ -2553,26 +2584,6 @@ what type of visual state is currently active." (calc-grab-region top bot arg))) #+end_src -*** Evil Bindings - -I want to have vim keybindings in Calc, so let's enable the =evil-collection= module for it by removing it from ~+evil-collection-disabled-list~. - -#+begin_src emacs-lisp -;; Enable evil-collection-calc -(delq 'calc +evil-collection-disabled-list) -#+end_src - -Let's also rebind some keys. We'll set =[= and =]= to directly begin and end vectors like it did originally, and =C-r= makes more sense as a redo binding than =D D=. - -#+begin_src emacs-lisp -(defadvice! ~/evil-collection-calc-bindings () - :after #'evil-collection-calc-setup - (map! :map calc-mode-map - :n "C-r" #'calc-redo - :n "[" #'calc-begin-vector - :n "]" #'calc-end-vector)) -#+end_src - *** Appearance Calc doesn't use faces to show selections by default, which I think is rather strange. From e4f0ee27e4a3b3041ce72049fcd8f3a26d9d4581 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 19 Feb 2025 17:41:23 -0500 Subject: [PATCH 04/10] tweak(calc): change default fraction format --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index 64a1e66..917b61d 100644 --- a/config.org +++ b/config.org @@ -2603,6 +2603,8 @@ Calc doesn't use faces to show selections by default, which I think is rather st (after! calc (setq calc-window-height 13 ; Make window taller calc-angle-mode 'rad ; Default to radians + calc-prefer-frac t ; Divide into fractions + calc-frac-format '("/" nil) ; Use more normal syntax for fractions calc-symbolic-mode t ; Symbolic evaluation calc-kill-line-numbering nil ; Don't copy stack position numbers )) From 34225c8d9f1a0b82f82e7dce6963c1cf2ae16e1f Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 19 Feb 2025 17:42:14 -0500 Subject: [PATCH 05/10] tweak(org): allow sub/superscripts after emphasis --- config.org | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/config.org b/config.org index 917b61d..8d84069 100644 --- a/config.org +++ b/config.org @@ -3105,11 +3105,11 @@ Since we've disabled =+pretty=, we need to add the packages we do want from it, *** Emphasis -When marking text for =*emphasis*=, Org mode normally only allows emphasized sections to span 2 lines. This strikes me as needlessly limited, so let's bump up that number to 20 lines. +When marking text for =*emphasis*=, Org mode normally only allows emphasized sections to span 2 lines. This strikes me as needlessly limited, so let's bump up that number to 20 lines. We can also use this variable to modify Org's parser to support sub/superscripts immediately after emphasized text, which is useful. #+begin_src emacs-lisp -(after! org - (setf (nth 4 org-emphasis-regexp-components) 20)) +(setq org-emphasis-regexp-components + '("-[:space:]('\"{" "-[:space:].,:!?;'\"_^)}\\[" "[:space:]" "." 20)) #+end_src *** Popups From d4adbc2a16e101964adb858de66eaa2f517de5fd Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Wed, 19 Feb 2025 17:42:54 -0500 Subject: [PATCH 06/10] scratch: row reduction in `calc` --- config.org | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/config.org b/config.org index 8d84069..6fbcf68 100644 --- a/config.org +++ b/config.org @@ -4322,3 +4322,64 @@ This section is for code with little or no associated documentation. This could 2. Self-explanatory 3. Hard to categorize 4. Just not really worth the time it takes to write commentary + +** Calc + +*** Row Reduction + +This code is adapted (stolen) from [[github:oantolin][oantolin]]'s personal config. + +#+begin_src emacs-lisp +(defun calc-rref (arg) + "Compute the reduced row echelon form (RREF) of a matrix." + (interactive "P") + (calc-slow-wrapper + (calc-unary-op "rref" 'calcFunc-rref arg))) + +(defun calcFunc-rref (m) + "Compute the reduced row echelon form (RREF) of the matrix M." + (if (math-matrixp m) + (math-with-extra-prec 2 (rref-raw m)) + (math-reject-arg m 'matrixp))) + +;; Algorithm from http://rosettacode.org/wiki/Reduced_row_echelon_form +(defun rref-raw (orig-m) + (let* ((m (math-copy-matrix orig-m)) + (rows (1- (length m))) + (cols (1- (length (nth 1 m)))) + (lead 1) + (r 1)) + (catch 'done + (while (and (<= r rows) (<= lead cols)) + (let ((i r)) + (while (math-zerop (nth lead (nth i m))) + (setq i (1+ i)) + (when (> i rows) + (setq i r lead (1+ lead)) + (when (> lead cols) (throw 'done m)))) + (cl-psetf (nth i m) (nth r m) + (nth r m) (nth i m)) + (let ((pivot (nth lead (nth r m))) (i 1)) + (unless (math-zerop pivot) + (let ((j lead)) + (while (<= j cols) + (setcar (nthcdr j (nth r m)) + (math-div (nth j (nth r m)) pivot)) + (setq j (1+ j))))) + (while (<= i rows) + (unless (= i r) + (let ((j lead) (c (nth lead (nth i m)))) + (while (<= j cols) + (setcar (nthcdr j (nth i m)) + (math-sub (nth j (nth i m)) + (math-mul c (nth j (nth r m))))) + (setq j (1+ j))))) + (setq i (1+ i))))) + (setq r (1+ r) lead (1+ lead))) + m))) + +(map! :after calc + :map calc-mode-map + "v !" #'calc-rref + "V !" #'calc-rref) +#+end_src From 25343ca965b4a2bdf2200b8c6fb49e2d6bf315c5 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Thu, 20 Feb 2025 02:02:46 -0500 Subject: [PATCH 07/10] refactor(winum): enable preexisting Doom module It turns out that we don't have to write all this configuration ourselves, we can just override the `winum` package recipe. --- config.org | 36 ++++++++---------------------------- 1 file changed, 8 insertions(+), 28 deletions(-) diff --git a/config.org b/config.org index 6fbcf68..b9db323 100644 --- a/config.org +++ b/config.org @@ -975,7 +975,7 @@ ophints unicode (vc-gutter +pretty) vi-tilde-fringe -;;(window-select +numbers) +(window-select +numbers) workspaces ;;zen #+end_src @@ -2392,35 +2392,15 @@ To solve this issue, I've written my own fork of =winum=: This fork generalizes the window numbering system to support indexing windows with any Lisp object, instead of just integers. We can then index regular windows with integers ~N~, and popup windows with cons cells ~(popup . N)~, allowing us to number them separately. -*** Configuration +*** Bindings #+begin_src emacs-lisp -(use-package! winum - :after-call doom-switch-window-hook - :config - (setq winum-auto-setup-mode-line nil) - (winum-mode +1) - (map! :map evil-window-map - "0" #'winum-select-window-0-or-10 - "1" #'winum-select-window-1 - "2" #'winum-select-window-2 - "3" #'winum-select-window-3 - "4" #'winum-select-window-4 - "5" #'winum-select-window-5 - "6" #'winum-select-window-6 - "7" #'winum-select-window-7 - "8" #'winum-select-window-8 - "9" #'winum-select-window-9) - (map! :leader - :desc "Select window 1" "1" #'winum-select-window-1 - :desc "Select window 2" "2" #'winum-select-window-2 - :desc "Select window 3" "3" #'winum-select-window-3 - :desc "Select window 4" "4" #'winum-select-window-4 - :desc "Select window 5" "5" #'winum-select-window-5 - :desc "Select window 6" "6" #'winum-select-window-6 - :desc "Select window 7" "7" #'winum-select-window-7 - :desc "Select window 8" "8" #'winum-select-window-8 - :desc "Select window 9" "9" #'winum-select-window-9)) +(dolist (n (number-sequence 1 9)) + (let ((function (intern (format "winum-select-window-%s" n)))) + (eval + `(map! :leader + :desc ,(format "Select window %s" n) + ,(format "%s" n) #',function)))) #+end_src *** Popup Management From dabf36e48e46b448fa4964d4179e58d5d3b3d603 Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Thu, 20 Feb 2025 02:05:28 -0500 Subject: [PATCH 08/10] feat(org): add org entity for non-breaking space --- config.org | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config.org b/config.org index b9db323..cb82ff2 100644 --- a/config.org +++ b/config.org @@ -2930,7 +2930,8 @@ It's sometimes nice to be able to click a link in an Org file that takes me to o (after! org (setq org-pretty-entities t org-entities-user - '(("top" "\\top" t "⊤" "" "22A4" "⊤") + '(("nbsp" "~" nil " " " " " " " ") + ("top" "\\top" t "⊤" "" "22A4" "⊤") ("bot" "\\bot" t "⊥" "" "22A5" "⊥") ("bbN" "\\mathbb{N}" t "" "" "2115" "ℕ") ("bbZ" "\\mathbb{Z}" t "" "" "2124" "ℤ") From 539452bdd848bee13639bef43a9db1857402a32d Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Thu, 20 Feb 2025 02:06:18 -0500 Subject: [PATCH 09/10] docs: prose edits --- config.org | 60 +++++++++++++++++++++++++----------------------------- 1 file changed, 28 insertions(+), 32 deletions(-) diff --git a/config.org b/config.org index cb82ff2..fa10159 100644 --- a/config.org +++ b/config.org @@ -76,7 +76,7 @@ The solution is [[https://en.wikipedia.org/wiki/Literate_programming][literate p You are currently reading the published version of this literate program[fn:1]. If you were to download this repository and use it as your config, Emacs would be running the tangled version. These versions are generated in separate processes, but both are ultimately derived from the content and metadata inside of the Org file. -[fn:1] Unless you're reading the raw file on Github, in which case you are probably already decently familiar with =org-mode= to be able to read its markup. +[fn:1] Unless you're reading the raw text file, which would not have any formatting whatsoever. **** Code and Comprehension @@ -88,22 +88,18 @@ It's not the right tool for every codebase, but proper use of literate programmi ** Current Issues +*** TODO [#A] Doom Autoloads + +I am currently unaware of a way to trigger code to run after a Doom module's =autoload.el= file is run. Look into this! + *** TODO Nix Creating garbage collection roots currently doesn't work. -*** TODO Idris - -The configuration for Idris is a bit light, and could use some touching up. - *** TODO Mail My mail client currently requires GPG access to sync emails, which doesn't properly work. Using the mail client requires running ~mbsync -a~ externally instead. -*** Org - -**** TODO Configure Org popups - * Configuration Support A proper Emacs configuration is often so complex that it requires its own support code to ease the process of writing and maintaining it. Before the configuration itself, here's all the support systems it uses (aside from Doom Emacs itself, which is also configuration support). @@ -812,7 +808,7 @@ The package allows you to define /patches/ which modify the definitions of funct Some packages in this config such as =dirvish=, =org-roam=, etc. require certain tools to be in the environment. On a Nix-based system, there are a few different ways to handle this: -1. Put that tool in the actual environment, e.g. in a profile. This makes sense for simple things (=ripgrep=, =sqlite=, etc) but for more opinionated things like an instance of Python it becomes less desirable. +1. Put that tool in the actual environment, e.g. in a profile. This makes sense for simple things (=ripgrep=, =sqlite=, etc) but for more opinionated things like a specific version of Python it becomes less desirable. 2. Build the tool and put a symlink to the output somewhere, e.g. in the HOME directory. This avoids polluting the environment, but you still have to deal with an unwieldy symlink that breaks Emacs if you accidentally delete it. This was my approach before coming up with the third option: 3. Build the tool and point Emacs directly to the store path. This is the most automatic solution, but requires the most complex Emacs configuration. @@ -1152,15 +1148,16 @@ This is mostly config settings that don't belong to any particular package and a It wouldn't be Emacs if there wasn't an endless list of config variables to change every aspect of its function! #+begin_src emacs-lisp -(setq-default delete-by-moving-to-trash t ; Delete files to trash - window-combination-resize t ; Resize windows more evenly +(setq-default delete-by-moving-to-trash t ; Delete files to trash + window-combination-resize t ; Resize windows more evenly ) (setq compile-command "nix build" - shell-file-name (executable-find "bash") ; Use bash instead of fish for default shell - disabled-command-function nil ; Disabled commands are a stupid idea - password-cache-expiry nil ; Security? Never heard of it - scroll-margin 2 ; A few extra lines on each end of the window + shell-file-name + (executable-find "bash") ; Use bash instead of fish for default shell + disabled-command-function nil ; Disabled commands are a stupid idea + password-cache-expiry nil ; Security? Never heard of it + scroll-margin 2 ; A few extra lines on each end of the window ) (global-subword-mode +1) @@ -1181,7 +1178,7 @@ Emacs uses this basic personal information for a few different things, mostly ap #+call: confpkg("Auth") -The =auth-source-pass= module lets you use [[*Password Management][pass]] as a source for authentication. Let's turn that on. +The =auth-source-pass= package lets you use [[*Password Management][pass]] as a source for authentication. Let's turn that on. #+begin_src emacs-lisp (require 'auth-source-pass) @@ -1383,11 +1380,11 @@ When a window is split in Emacs, the result is two windows that show the same bu #+call: confpkg("Visual") -If you're going to be staring at your screen for hours a day, you might as well make the thing you're staring at look nice. +If you're going to be staring at your screen for hours a day, you might as well make the thing you're staring at look nice! ** Theme -My favorite color theme has always been Tokyo Night. I use it literally everywhere I can, and Doom Emacs is no exception. +My favorite color theme has always been Tokyo Night. I use it literally everywhere I can, and Emacs is no exception. #+begin_src emacs-lisp (setq doom-theme 'doom-tokyo-night) @@ -1395,7 +1392,7 @@ My favorite color theme has always been Tokyo Night. I use it literally everywhe ** Fonts -Victor Mono is my preferred coding font. I also use Source Sans Pro as my sans-serif font, though that is more an arbitrary pick than actually liking how it looks. +Victor Mono is my preferred coding font. I'm also using Source Sans Pro as my sans-serif font, though that is more an arbitrary pick than actually liking how it looks. #+begin_src emacs-lisp (setq doom-font (font-spec :family "VictorMono" :size 13) @@ -1479,7 +1476,7 @@ When a buffer has line numbers, they can interfere with the margins and make the #+call: confpkg("Dashboard") -There's a lot of reasons why I don't like Spacemacs and why I left it for Doom Emacs (mainly the fact that it's slow and often opaque to the user), but there's one thing that Spacemacs undoubtedly has Doom beat in: +There's a lot of reasons why I don't like Spacemacs and why I left it for Doom Emacs (the most prominent being its extreme sluggishness), but there's one thing that Spacemacs undoubtedly has Doom beat in: [[https://user-images.githubusercontent.com/33982951/39624821-a4abccee-4f92-11e8-9e91-3d5b542bbb85.png][Spacemacs's dashboard has /impeccable/ style.]] @@ -1503,7 +1500,7 @@ The image can be set like thus: *** Title -Since our banner no longer includes a title, we should add one after the splash image. This title format is inspired by Spacemacs! +Since our banner no longer includes a title, we should add one after the splash image. This title format is inspired by the Spacemacs dashboard shown above. #+begin_src emacs-lisp (defface doom-dashboard-title @@ -2380,9 +2377,10 @@ I've set my default Emacs shell to =bash=, since pointing Emacs to a non-POSIX s #+call: confpkg("Pkg: winum") -Emacs comes with a few standard commands for selecting different windows. These are mostly directional, allowing you to move your selection up, right, left or down from the current window. This is rather inconvenient when working with large amounts of windows, so the =winum= package allows you to assign a number to each window to make navigation easier. +Emacs comes with a few standard commands for selecting different windows. These are mostly directional, allowing you to move your selection up, right, left or down from the current window. This is a bit inconvenient when there are a lot of windows, so the =winum= package allows you to assign a number to each window to make navigation easier. + +There's just one wrinkle: Doom Emacs's popup management system. Popups are treated as separate from "real" windows, usually displayed on the edge of the frame and without a modeline. =winum= has no knowledge of popup windows and assigns them numbers exactly the same as any other window. This can get really confusing, since windows get renumbered every time a new popup appears. -There's just one problem with =winum= for my purposes: Doom Emacs's popup management system. In Doom Emacs, popups are treated as separate from "real" windows, usually displayed on the edge of the frame and without a modeline. =winum= has no knowledge of popup windows, and assigns them numbers exactly the same as any other window, which is very confusing when popups are otherwise treated as separate. To solve this issue, I've written my own fork of =winum=: @@ -2390,7 +2388,7 @@ To solve this issue, I've written my own fork of =winum=: (package! winum :recipe (:local-repo "pkgs/winum")) #+end_src -This fork generalizes the window numbering system to support indexing windows with any Lisp object, instead of just integers. We can then index regular windows with integers ~N~, and popup windows with cons cells ~(popup . N)~, allowing us to number them separately. +This fork generalizes the window numbering system to support indexing windows with any Lisp object, instead of just integers. We can then index regular windows with integers ~N~ and popup windows with cons cells ~(popup . N)~, allowing us to number them separately. *** Bindings @@ -2552,7 +2550,7 @@ Typing =C-x *= every time I want to use Calc (very often) is annoying. To allevi "`" #'calc-embedded-edit)) #+end_src -For the grab-region command, I think it makes sense to have it check whether your selection is a rectangle (=C-v=): +Calc can pull data from the selected region, and has two commands to do so: ~calc-grab-region~, for one-dimensional data, and ~calc-grab-rectangle~, for two-dimensional data. Seeing as Evil has a whole separate selection type for rectangular data (=C-v=), I think it makes sense to have the grab region key (=SPC C g=) run either command based on the selection type. #+begin_src emacs-lisp (defun ~/calc-grab-region (top bot &optional arg) @@ -2579,6 +2577,8 @@ Calc doesn't use faces to show selections by default, which I think is rather st *** Other Defaults +Some of Calc's default modes are a little baffling. (I don't know why any modern calculator would default to degrees over radians!) These can be customized as simple variables, though, so it's easy to change them. + #+begin_src emacs-lisp (after! calc (setq calc-window-height 13 ; Make window taller @@ -3093,10 +3093,6 @@ When marking text for =*emphasis*=, Org mode normally only allows emphasized sec '("-[:space:]('\"{" "-[:space:].,:!?;'\"_^)}\\[" "[:space:]" "." 20)) #+end_src -*** Popups - -Org uses many popup windows for various things, and we can use Doom to make them look a little nicer. - ** Enhancements While Org-mode provides a very comprehensive set of tools and systems, there are a few small things that are missing or that would make the overall UX smoother. Luckily, Org-mode being implemented as an Emacs package gives us more than enough control over its function to crowbar in a few new features! @@ -4225,7 +4221,7 @@ I prefer 2-space indentation in all circumstances. Unfortunately, Emacs's indent #+call: confpkg("Mode: Java") -The =lsp-java= package provides LSP support using the standard Java language server, the Eclipse-based ~jdtls~. Unfortunately, this package isn't designed for Nix, so it fails to find the server script in our Nix store. We need to do a bit of legwork to patch in this support, as well as some related considerations, such as per-project config directories. +The =lsp-java= package provides LSP support using the standard Java language server, the Eclipse server ~jdtls~. Unfortunately, this package isn't designed for Nix, so it fails to find the server script in our Nix store. We need to do a bit of legwork to patch in this support, as well as some related considerations, such as per-project config directories. #+begin_src emacs-lisp (defun +lsp-java-server-store-path () @@ -4256,7 +4252,7 @@ The =lsp-java= package provides LSP support using the standard Java language ser #+call: confpkg("Mode: LSP") -The emacs package =lsp-mode= is the package of choice for general LSP integration in Emacs. The Doom Emacs module =:tools lsp= handles most of the basic configuration for it, but there's one minor annoyance it doesn't cover: when a server isn't found for a particular language, =lsp-mode= tries to install the server itself to a local directory, which is a completely useless space-filler for my purposes since that I use NixOS. +The emacs package =lsp-mode= is the package of choice for general LSP integration in Emacs. The Doom Emacs module =:tools lsp= handles most of the configuration for it, but there's one annoyance it doesn't cover: when a server isn't found for a particular language, =lsp-mode= tries to install it itself, which is a complete waste of time for my purposes since I use NixOS. There is luckily a configuration variable to disable this suggestion: From b110f19584e4a290c022d9fe5bbd43835a049eee Mon Sep 17 00:00:00 2001 From: Kiana Sheibani Date: Thu, 20 Feb 2025 02:06:49 -0500 Subject: [PATCH 10/10] docs: add comments --- config.org | 2 ++ 1 file changed, 2 insertions(+) diff --git a/config.org b/config.org index fa10159..be01a14 100644 --- a/config.org +++ b/config.org @@ -3325,6 +3325,8 @@ The simple package =org-checklist= from =org-contrib= makes it so that checkboxe :commands (org-reset-checkbox-state-maybe org-make-checklist-export org-checklist) + ;; HACK: `org-checklist' adds this hook when it loads, but + ;; I want to add it on init so that this package is loaded lazily :init (add-hook 'org-after-todo-state-change-hook #'org-checklist) :config