From af0dcdcd946f22699f27760e450c44576f44501d Mon Sep 17 00:00:00 2001 From: Prashant Vithani Date: Fri, 12 Jul 2024 16:02:47 +0530 Subject: [PATCH 01/20] bump: :checkers syntax flycheck/flycheck@02148c6ce7edb0fd0986460db327cc9463939747 -> flycheck/flycheck@e8d1472aeab6ac4e19c8339e6be93e91e878f819 --- modules/checkers/syntax/packages.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/checkers/syntax/packages.el b/modules/checkers/syntax/packages.el index a22c59a84..26936b788 100644 --- a/modules/checkers/syntax/packages.el +++ b/modules/checkers/syntax/packages.el @@ -2,7 +2,7 @@ ;;; checkers/syntax/packages.el (unless (modulep! +flymake) - (package! flycheck :pin "02148c6ce7edb0fd0986460db327cc9463939747") + (package! flycheck :pin "e8d1472aeab6ac4e19c8339e6be93e91e878f819") (package! flycheck-popup-tip :pin "ef86aad907f27ca076859d8d9416f4f7727619c6") (when (modulep! +childframe) (package! flycheck-posframe :pin "19896b922c76a0f460bf3fe8d8ebc2f9ac9028d8"))) From b9f1d5d2616751defd838266f6c8506faf642097 Mon Sep 17 00:00:00 2001 From: Prashant Vithani Date: Fri, 12 Jul 2024 16:07:02 +0530 Subject: [PATCH 02/20] tweak(syntax): use close-circle-outline icon for errors The same is used by doom-modeline to show flycheck errors. Ref: https://github.com/seagle0128/doom-modeline/blob/1505c13564b83e44d3187611e326a48b742cad3a/doom-modeline-segments.el#L818 --- modules/checkers/syntax/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/checkers/syntax/config.el b/modules/checkers/syntax/config.el index 370c76c6d..cf6f0a2fc 100644 --- a/modules/checkers/syntax/config.el +++ b/modules/checkers/syntax/config.el @@ -74,7 +74,7 @@ (if (modulep! +icons) (setq flycheck-posframe-warning-prefix "⚠ " flycheck-posframe-info-prefix "ⓘ " - flycheck-posframe-error-prefix "⚠ ") + flycheck-posframe-error-prefix "⮾ ") (setq flycheck-posframe-warning-prefix "[?] " flycheck-posframe-info-prefix "[i] " flycheck-posframe-error-prefix "[!] ")) From 8ab42fa774bac1130bc159c89d714e04a4fa8ac6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jul 2024 18:15:26 -0400 Subject: [PATCH 03/20] nit: revise site-lisp comments The motivations for delaying the site-lisp files are different between interactive and non-interactive sessions. I've revised these comments to reflect that. --- lisp/doom-cli.el | 11 ++++++----- lisp/doom.el | 13 +++++++------ 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/lisp/doom-cli.el b/lisp/doom-cli.el index cf32f6505..666551311 100644 --- a/lisp/doom-cli.el +++ b/lisp/doom-cli.el @@ -23,11 +23,12 @@ doom-cache-dir doom-state-dir)) - ;; HACK: bin/doom invokes Emacs with --no-site-lisp solely to allow us to load - ;; site-start manually, here, to suppress any output it produces, and they - ;; almost always produce some. This causes premature redraws of the Emacs - ;; frame during startup (to display those messages in the minibuffer), which - ;; -- as I mention in the comments of doom.el -- really hurts startup time. + ;; HACK: bin/doom invokes Emacs with --no-site-lisp so that site files can be + ;; loaded manually, here, where I can suppress any output it produces, and + ;; they almost always produce some. This output pollutes the output of doom + ;; scripts with potentially confusing -- but always unimportant -- + ;; information to the user, like deprecation notices, file-loaded messages, + ;; and linter warnings. With this, that output is suppressed. (quiet! (require 'cl nil t) (unless site-run-file diff --git a/lisp/doom.el b/lisp/doom.el index 9e8626122..24302d193 100644 --- a/lisp/doom.el +++ b/lisp/doom.el @@ -487,12 +487,13 @@ users).") ;; later (see `startup--load-user-init-file@undo-hacks'). (advice-add #'tool-bar-setup :override #'ignore) - ;; PERF,UX: site-lisp files are often obnoxiously noisy (emitting load - ;; messages or other output to *Messages* or stdout). These queue - ;; unnecessary redraws at startup which impact startup time depending on - ;; window system. It also pollutes the logs. By suppressing it now, I can - ;; load it myself, later, in a more controlled way (see - ;; `startup--load-user-init-file@undo-hacks'). + ;; PERF,UX: site-lisp files are often obnoxiously noisy (emitting output + ;; that isn't useful to end-users, like load messages, deprecation + ;; notices, and linter warnings. Displaying these in the minibuffer causes + ;; unnecessary redraws at startup which can impact startup time + ;; drastically and cause flashes of white. It also pollutes the logs. By + ;; suppressing it here, I load it myself, later, in a more controlled way + ;; (see `startup--load-user-init-file@undo-hacks'). (put 'site-run-file 'initial-value site-run-file) (setq site-run-file nil) From ce84690dc53f8fe98d6d44b4e7dcf649f08a578c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jul 2024 19:05:31 -0400 Subject: [PATCH 04/20] feat(evil): vim completion keybinds on C-x Vim has a set of completion commands bound to the C-x prefix. We had this for company, but with this commit, we now have them for the corfu module. --- modules/completion/corfu/autoload.el | 10 ++++++++ modules/editor/evil/config.el | 34 ++++++++++++++++++---------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/modules/completion/corfu/autoload.el b/modules/completion/corfu/autoload.el index 43005c6c1..0501fc196 100644 --- a/modules/completion/corfu/autoload.el +++ b/modules/completion/corfu/autoload.el @@ -37,3 +37,13 @@ (save-excursion (backward-char 1) (insert-char ?\\))) (t (call-interactively #'corfu-insert-separator)))) + +;;;###autoload +(defun +corfu/dabbrev-this-buffer () + "Like `cape-dabbrev', but only scans current buffer." + (interactive) + (require 'cape) + (let ((cape-dabbrev-check-other-buffers nil)) + (cape-dabbrev t))) + +;;; end of autoload.el diff --git a/modules/editor/evil/config.el b/modules/editor/evil/config.el index 6c8b75f8d..7aa969a9a 100644 --- a/modules/editor/evil/config.el +++ b/modules/editor/evil/config.el @@ -576,15 +576,25 @@ directives. By default, this only recognizes C directives.") :v "gl" #'evil-lion-left :v "gL" #'evil-lion-right - ;; Omni-completion - (:when (modulep! :completion company) - (:prefix "C-x" - :i "C-l" #'+company/whole-lines - :i "C-k" #'+company/dict-or-keywords - :i "C-f" #'company-files - :i "C-]" #'company-etags - :i "s" #'company-ispell - :i "C-s" #'company-yasnippet - :i "C-o" #'company-capf - :i "C-n" #'+company/dabbrev - :i "C-p" #'+company/dabbrev-code-previous))) + ;; Emulation of Vim's omni-completion keybinds + (:prefix "C-x" + (:when (modulep! :completion company) + :i "C-l" #'+company/whole-lines + :i "C-k" #'+company/dict-or-keywords + :i "C-f" #'company-files + :i "C-]" #'company-etags + :i "s" #'company-ispell + :i "C-s" #'company-yasnippet + :i "C-o" #'company-capf + :i "C-n" #'+company/dabbrev + :i "C-p" #'+company/dabbrev-code-previous) + (:when (modulep! :completion corfu) + :i "C-l" #'cape-line + :i "C-k" #'cape-keyword + :i "C-f" #'cape-file + :i "C-]" #'complete-tag + :i "s" #'cape-dict + :i "C-s" #'yasnippet-capf + :i "C-o" #'completion-at-point + :i "C-n" #'cape-dabbrev + :i "C-p" #'+corfu/dabbrev-this-buffer))) From b3ef2024513d52d3cba228e509686f42131593e4 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jul 2024 19:08:10 -0400 Subject: [PATCH 05/20] refactor(corfu): conform to naming conventions --- modules/completion/corfu/autoload.el | 4 ++-- modules/completion/corfu/config.el | 4 ++-- modules/config/default/config.el | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/completion/corfu/autoload.el b/modules/completion/corfu/autoload.el index 0501fc196..d3c63d5d2 100644 --- a/modules/completion/corfu/autoload.el +++ b/modules/completion/corfu/autoload.el @@ -1,7 +1,7 @@ ;;; completion/corfu/autoload.el -*- lexical-binding: t; -*- ;;;###autoload -(defun +corfu-move-to-minibuffer () +(defun +corfu/move-to-minibuffer () "Move the current list of candidates to your choice of minibuffer completion UI." (interactive) (pcase completion-in-region--data @@ -27,7 +27,7 @@ (t (error "No minibuffer completion UI available for moving to!"))))))) ;;;###autoload -(defun +corfu-smart-sep-toggle-escape () +(defun +corfu/smart-sep-toggle-escape () "Insert `corfu-separator' or toggle escape if it's already there." (interactive) (cond ((and (char-equal (char-before) corfu-separator) diff --git a/modules/completion/corfu/config.el b/modules/completion/corfu/config.el index 2d4475611..2b4c352e3 100644 --- a/modules/completion/corfu/config.el +++ b/modules/completion/corfu/config.el @@ -74,8 +74,8 @@ TAB/S-TAB.") tab-always-indent 'complete) (add-to-list 'completion-category-overrides `(lsp-capf (styles ,@completion-styles))) (add-to-list 'corfu-auto-commands #'lispy-colon) - (add-to-list 'corfu-continue-commands #'+corfu-move-to-minibuffer) - (add-to-list 'corfu-continue-commands #'+corfu-smart-sep-toggle-escape) + (add-to-list 'corfu-continue-commands #'+corfu/move-to-minibuffer) + (add-to-list 'corfu-continue-commands #'+corfu/smart-sep-toggle-escape) (add-hook 'evil-insert-state-exit-hook #'corfu-quit) ;; HACK: If you want to update the visual hints after completing minibuffer diff --git a/modules/config/default/config.el b/modules/config/default/config.el index 667b6abb0..19d566797 100644 --- a/modules/config/default/config.el +++ b/modules/config/default/config.el @@ -461,8 +461,8 @@ Continues comments if executed from a commented line. Consults (map! :when (modulep! :completion corfu) :after corfu (:map corfu-map - [remap corfu-insert-separator] #'+corfu-smart-sep-toggle-escape - "C-S-s" #'+corfu-move-to-minibuffer + [remap corfu-insert-separator] #'+corfu/smart-sep-toggle-escape + "C-S-s" #'+corfu/move-to-minibuffer "C-p" #'corfu-previous "C-n" #'corfu-next)) (let ((cmds-del From 3b689247239de260cd948911efb85f893239f815 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jul 2024 20:21:46 -0400 Subject: [PATCH 06/20] fix(gdscript): async :documentation lookup handler Otherwise `+lookup/documentation` will fall through to the next handler whether or not `gdscript-docs-browse-symbol-at-point` is successful. Especially important if `gdscript-docs-use-eww` is nil. --- modules/lang/gdscript/config.el | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/lang/gdscript/config.el b/modules/lang/gdscript/config.el index 954bc25d6..f1c1672d5 100644 --- a/modules/lang/gdscript/config.el +++ b/modules/lang/gdscript/config.el @@ -11,8 +11,7 @@ :defer t :config (set-lookup-handlers! 'gdscript-mode - :documentation #'gdscript-docs-browse-symbol-at-point) - + :documentation '(gdscript-docs-browse-symbol-at-point :async t)) (set-formatter! 'gdformat '("gdformat" "-") :modes '(gdscript-mode)) (when (modulep! +lsp) From 3cc2d83ee80fd7104ee798134a2251727a5c0898 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jul 2024 20:24:08 -0400 Subject: [PATCH 07/20] tweak(gdscript): gdscript-docs-use-eww = nil eww is clumsy and slow; taking 4-6 seconds to load and render the page on a good day, so just use the browser instead. --- modules/lang/gdscript/config.el | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/lang/gdscript/config.el b/modules/lang/gdscript/config.el index f1c1672d5..69c5c2f94 100644 --- a/modules/lang/gdscript/config.el +++ b/modules/lang/gdscript/config.el @@ -14,6 +14,11 @@ :documentation '(gdscript-docs-browse-symbol-at-point :async t)) (set-formatter! 'gdformat '("gdformat" "-") :modes '(gdscript-mode)) + ;; eww is clumsy and slow. Best that `gdscript-docs-browse-symbol-at-point' + ;; simply use the browser. + ;; REVIEW: Maybe it's permissible if `gdscript-docs-local-path' is set? + (setq gdscript-docs-use-eww nil) + (when (modulep! +lsp) (add-hook 'gdscript-mode-local-vars-hook #'lsp! 'append)) From 3d99fbf5256456ea72ee8e06c1a2a7db3aa36a45 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jul 2024 20:25:01 -0400 Subject: [PATCH 08/20] tweak(gdscript): open godot log buffers in popup Includes an advice to prevent the log buffer from being focused. This way, the user can return to their work faster when in their play-debug loop, as well as kill the game/Godot by killing the log buffer remotely (with its process) with C-g/ESC. --- modules/lang/gdscript/config.el | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/lang/gdscript/config.el b/modules/lang/gdscript/config.el index 69c5c2f94..7d93f201a 100644 --- a/modules/lang/gdscript/config.el +++ b/modules/lang/gdscript/config.el @@ -13,6 +13,12 @@ (set-lookup-handlers! 'gdscript-mode :documentation '(gdscript-docs-browse-symbol-at-point :async t)) (set-formatter! 'gdformat '("gdformat" "-") :modes '(gdscript-mode)) + (set-popup-rule! "^\\*godot " :ttl 0 :quit t) + + (defadvice! +gdscript--dont-focus-output-buffer-a (fn &rest args) + "Don't move cursor into gdscript compilation window." + :around #'gdscript-comint--run + (save-selected-window (apply fn args))) ;; eww is clumsy and slow. Best that `gdscript-docs-browse-symbol-at-point' ;; simply use the browser. From 49d833fa6466326c6862a8cf134acb9ff3c54741 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jul 2024 20:27:25 -0400 Subject: [PATCH 09/20] fix(gdscript): accommodate version-suffixed godot binaries On some distros (like nixpkgs), the binary is suffixed with a version number. --- modules/lang/gdscript/config.el | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/modules/lang/gdscript/config.el b/modules/lang/gdscript/config.el index 7d93f201a..878a76779 100644 --- a/modules/lang/gdscript/config.el +++ b/modules/lang/gdscript/config.el @@ -25,6 +25,14 @@ ;; REVIEW: Maybe it's permissible if `gdscript-docs-local-path' is set? (setq gdscript-docs-use-eww nil) + ;; Some systems append the version number to the executable, so ensure that + ;; the path is correct. Note that I avoid setting it to an absolute path to + ;; preserve TRAMP support. + (setq gdscript-godot-executable + (cond ((executable-find gdscript-godot-executable) gdscript-godot-executable) + ((executable-find "godot") "godot") + ((executable-find "godot4") "godot4"))) + (when (modulep! +lsp) (add-hook 'gdscript-mode-local-vars-hook #'lsp! 'append)) From 15ea9b6452ea4206d4c0252bfc68237d5b81688c Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 12 Jul 2024 20:28:02 -0400 Subject: [PATCH 10/20] refactor(gdscript): remove format keybinds Rely on :editor format's interface, instead, which is less janky. --- modules/lang/gdscript/config.el | 27 ++++++++++----------------- 1 file changed, 10 insertions(+), 17 deletions(-) diff --git a/modules/lang/gdscript/config.el b/modules/lang/gdscript/config.el index 878a76779..612b08e12 100644 --- a/modules/lang/gdscript/config.el +++ b/modules/lang/gdscript/config.el @@ -38,24 +38,17 @@ (map! :localleader :map gdscript-mode-map - (:prefix ("r" . "run") - :desc "Open project in Godot" "e" #'gdscript-godot-open-project-in-editor - :desc "Run project" "p" #'gdscript-godot-run-project - :desc "Run debug" "d" #'gdscript-godot-run-project-debug - :desc "Run current scene" "s" #'gdscript-godot-run-current-scene) - + :desc "Open project in Godot" "e" #'gdscript-godot-open-project-in-editor + :desc "Run project" "p" #'gdscript-godot-run-project + :desc "Run debug" "d" #'gdscript-godot-run-project-debug + :desc "Run current scene" "s" #'gdscript-godot-run-current-scene) (:prefix ("d" . "debug") - :desc "Toggle breakpoint" "d" #'gdscript-debug-toggle-breakpoint + :desc "Toggle breakpoint" "d" #'gdscript-debug-toggle-breakpoint :desc "Display breakpoint buffer" "b" #'gdscript-debug-display-breakpoint-buffer - :desc "Continue execution" "c" #'gdscript-debug-continue - :desc "Next" "n" #'gdscript-debug-next - :desc "Step" "s" #'gdscript-debug-step) - + :desc "Continue execution" "c" #'gdscript-debug-continue + :desc "Next" "n" #'gdscript-debug-next + :desc "Step" "s" #'gdscript-debug-step) (:prefix ("h" . "help") - :desc "Browse online API" "b" #'gdscript-docs-browse-api - :desc "Browse API at point" "f" #'gdscript-docs-browse-symbol-at-point) - - (:prefix ("f" . "format") - :desc "Format buffer" "b" #'gdscript-format-buffer - :desc "Format region" "r" #'gdscript-format-region))) + :desc "Browse online API" "b" #'gdscript-docs-browse-api + :desc "Browse API at point" "f" #'gdscript-docs-browse-symbol-at-point))) From 378d0b8db6c76252b364eb29d1d88cf069a37200 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jul 2024 00:45:42 -0400 Subject: [PATCH 11/20] fix(cli): doom env: omit XDG_BACKEND & DOOMLOCALDIR --- lisp/cli/env.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lisp/cli/env.el b/lisp/cli/env.el index e6463d893..808878985 100644 --- a/lisp/cli/env.el +++ b/lisp/cli/env.el @@ -26,14 +26,14 @@ "^WSL_INTEROP$" ;; XDG variables that are best not persisted. "^XDG_CURRENT_DESKTOP$" "^XDG_RUNTIME_DIR$" - "^XDG_\\(VTNR\\|SEAT\\|SESSION_\\(TYPE\\|CLASS\\)\\)" + "^XDG_\\(VTNR$\\|SEAT$\\|BACKEND$\\|SESSION_\\)" ;; Socket envvars, like I3SOCK, GREETD_SOCK, SEATD_SOCK, SWAYSOCK, etc. "SOCK$" ;; ssh and gpg variables that could quickly become stale if persisted. "^SSH_\\(AUTH_SOCK\\|AGENT_PID\\)$" "^\\(SSH\\|GPG\\)_TTY$" "^GPG_AGENT_INFO$" ;; Internal Doom envvars - "^DEBUG$" "^INSECURE$" "^\\(EMACS\\|DOOM\\)DIR$" + "^DEBUG$" "^INSECURE$" "^\\(EMACS\\|DOOM\\(LOCAL\\)?\\)DIR$" "^DOOM\\(PATH\\|PROFILE\\)$" "^__") "Environment variables to omit from envvar files. From 7543b04e15661f0c9cc58dcdff68efce1a434b73 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jul 2024 01:48:11 -0400 Subject: [PATCH 12/20] feat(format): add +format/org-block-in-region Also updates `+org/reformat-at-point` to call `+format/org-block-in-region` if selection is active. Fix: #7936 --- lisp/lib/text.el | 13 +++++ modules/editor/format/autoload/format.el | 27 +--------- modules/editor/format/autoload/org.el | 64 ++++++++++++++++++++++++ modules/lang/org/autoload/org.el | 14 +++++- 4 files changed, 91 insertions(+), 27 deletions(-) create mode 100644 modules/editor/format/autoload/org.el diff --git a/lisp/lib/text.el b/lisp/lib/text.el index dc00d2e45..e44e127c4 100644 --- a/lisp/lib/text.el +++ b/lisp/lib/text.el @@ -135,6 +135,19 @@ Uses `evil-visual-end' if available." (marker-position evil-visual-end)) (region-end))) +;;;###autoload +(defun doom-region (&optional as-list) + "Return the bounds of the current seelction. + +If AS-LIST is non-nil, returns (BEG END). Otherwise returns a cons cell (BEG . +END)." + (let* ((active (doom-region-active-p)) + (beg (if active (doom-region-beginning))) + (end (if active (doom-region-end)))) + (if as-list + (list beg end) + (cons beg end)))) + ;;;###autoload (defun doom-thing-at-point-or-region (&optional thing prompt) "Grab the current selection, THING at point, or xref identifier at point. diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index fe2492d2e..42642a3c3 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -83,29 +83,4 @@ may not always work. Keep your undo keybind handy!" #'+format/region #'+format/buffer))) -;;;###autoload -(defun +format/org-block (&optional point) - "Reformat the org src block at POINT with a mode approriate formatter." - (interactive (list (point))) - (unless (derived-mode-p 'org-mode) - (user-error "Not an org-mode buffer!")) - (let ((element (org-element-at-point point))) - (unless (org-in-src-block-p nil element) - (user-error "Not in an org src block")) - (cl-destructuring-bind (beg end _) (org-src--contents-area element) - (let* ((lang (org-element-property :language element)) - (mode (org-src-get-lang-mode lang))) - (save-excursion - (if (provided-mode-derived-p mode 'org-mode) - (user-error "Cannot reformat an org-mode or org-derived src block") - (let* ((major-mode mode) - (after-change-functions - ;; HACK: Silence excessive and unhelpful warnings about - ;; 'org-element-at-point being used in non-org-mode - ;; buffers'. - (remq 'org-indent-refresh-maybe after-change-functions)) - (apheleia-formatter - (or (apheleia--get-formatters 'interactive) - (apheleia--get-formatters 'prompt) - (user-error "No formatter configured for language: %s" lang)))) - (+format-region beg end)))))))) +;;; format.el ends here diff --git a/modules/editor/format/autoload/org.el b/modules/editor/format/autoload/org.el new file mode 100644 index 000000000..11b7043a3 --- /dev/null +++ b/modules/editor/format/autoload/org.el @@ -0,0 +1,64 @@ +;;; editor/format/autoload/org.el -*- lexical-binding: t; -*- + +;;;###autoload +(defun +format/org-block (&optional point) + "Reformat the org src block at POINT with a mode appropriate formatter." + (interactive (list (point))) + (unless (derived-mode-p 'org-mode) + (user-error "Not an org-mode buffer!")) + (let ((element (org-element-at-point point))) + (unless (org-in-src-block-p nil element) + (user-error "Not in an org src block")) + (cl-destructuring-bind (beg end _) (org-src--contents-area element) + (let* ((lang (or (org-element-property :language element) + (user-error "Cannot reformat src block without a valid language"))) + (mode (org-src-get-lang-mode lang))) + (save-excursion + (if (provided-mode-derived-p mode 'org-mode) + (user-error "Cannot reformat an org-mode or org-derived src block") + (let* ((major-mode mode) + (after-change-functions + ;; HACK: Silence excessive and unhelpful warnings about + ;; 'org-element-at-point being used in non-org-mode + ;; buffers'. + (remq 'org-indent-refresh-maybe after-change-functions)) + (apheleia-formatter + (or (apheleia--get-formatters) + (user-error "No formatter configured for language: %s" lang)))) + (+format-region beg end)))))))) + +;;;###autoload +(defun +format/org-block-in-region (beg end) + "Calls `+format/org-block' in each src block between BEG and END (inclusive)." + (interactive (doom-region t)) + (unless (derived-mode-p 'org-mode) + (user-error "Not an org-mode buffer!")) + (unless (and beg end) + (user-error "No active selection")) + (let ((n 0)) + (org-block-map + (lambda () + (let ((element (org-element-at-point))) + (when (and (org-in-src-block-p nil element) + (org-element-property :language element)) + (with-demoted-errors "+format/org-block: %s" + (call-interactively #'+format/org-block)) + (cl-incf n)))) + (save-excursion + (goto-char beg) + (when (org-in-src-block-p) + (org-previous-block 1)) + (point)) + end) + (message "Formatted %d src block(s)" n))) + +;;;###autoload +(defun +format/org-block-at-point-or-in-region () + "See `+format/org-block' and `+format/org-block-in-region'." + (interactive) + (call-interactively + (if (doom-region-active-p) + #'+format/org-block-in-region + #'+format/org-block))) + +;;; org.ell ends here diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index 499b1dddb..d6e80959d 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -344,7 +344,19 @@ If in an org table, realign the cells with `org-table-align'. Otherwise, falls back to `org-fill-paragraph' to reflow paragraphs." (interactive) (let ((element (org-element-at-point))) - (cond ((org-in-src-block-p nil element) + (cond ((doom-region-active-p) + ;; TODO Perform additional formatting? + ;; (save-restriction + ;; (narrow-to-region beg end) + ;; (org-table-recalculate t) + ;; (org-table-map-tables #'org-table-align) + ;; (org-align-tags t) + ;; (org-update-statistics-cookies t) + ;; ...) + (if (modulep! :editor format) + (call-interactively #'+format/org-block-in-region) + (message ":editor format is disabled, skipping reformatting of org-blocks"))) + ((org-in-src-block-p nil element) (unless (modulep! :editor format) (user-error ":editor format module is disabled, ignoring reformat...")) (call-interactively #'+format/org-block)) From 1eaa1aef2ccbb2efbf71bc10b0526a63b8d6121f Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jul 2024 02:00:24 -0400 Subject: [PATCH 13/20] refactor(format): rename to +format/org-blocks-in-region To better reflect that it operates on multiple blocks. Ref: #7936 --- modules/editor/format/autoload/org.el | 8 ++++---- modules/lang/org/autoload/org.el | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/editor/format/autoload/org.el b/modules/editor/format/autoload/org.el index 11b7043a3..2bcae811f 100644 --- a/modules/editor/format/autoload/org.el +++ b/modules/editor/format/autoload/org.el @@ -28,7 +28,7 @@ (+format-region beg end)))))))) ;;;###autoload -(defun +format/org-block-in-region (beg end) +(defun +format/org-blocks-in-region (beg end) "Calls `+format/org-block' in each src block between BEG and END (inclusive)." (interactive (doom-region t)) (unless (derived-mode-p 'org-mode) @@ -53,12 +53,12 @@ (message "Formatted %d src block(s)" n))) ;;;###autoload -(defun +format/org-block-at-point-or-in-region () - "See `+format/org-block' and `+format/org-block-in-region'." +(defun +format/org-blocks-at-point-or-in-region () + "See `+format/org-block' and `+format/org-blocks-in-region'." (interactive) (call-interactively (if (doom-region-active-p) - #'+format/org-block-in-region + #'+format/org-blocks-in-region #'+format/org-block))) ;;; org.ell ends here diff --git a/modules/lang/org/autoload/org.el b/modules/lang/org/autoload/org.el index d6e80959d..2baf97e79 100644 --- a/modules/lang/org/autoload/org.el +++ b/modules/lang/org/autoload/org.el @@ -354,7 +354,7 @@ Otherwise, falls back to `org-fill-paragraph' to reflow paragraphs." ;; (org-update-statistics-cookies t) ;; ...) (if (modulep! :editor format) - (call-interactively #'+format/org-block-in-region) + (call-interactively #'+format/org-blocks-in-region) (message ":editor format is disabled, skipping reformatting of org-blocks"))) ((org-in-src-block-p nil element) (unless (modulep! :editor format) From 5485b912deba85c1311942363bfca6bc30fd6b18 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jul 2024 16:50:06 -0400 Subject: [PATCH 14/20] bump: :ui vc-gutter dgutov/diff-hl@11f3113e7905 -> dgutov/diff-hl@f66345ed1f17 - Our diff-hl-update-async hack is no longer needed. The issue was addressed upstream. Amend: 778fc9ad3f7a Ref: dgutov/diff-hl#213 Ref: dgutov/diff-hl@e264d13a3d55 --- modules/ui/vc-gutter/config.el | 10 ---------- modules/ui/vc-gutter/packages.el | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/modules/ui/vc-gutter/config.el b/modules/ui/vc-gutter/config.el index ab5398d73..f88ff4567 100644 --- a/modules/ui/vc-gutter/config.el +++ b/modules/ui/vc-gutter/config.el @@ -104,16 +104,6 @@ (add-hook 'magit-pre-refresh-hook #'diff-hl-magit-pre-refresh) (add-hook 'magit-post-refresh-hook #'diff-hl-magit-post-refresh)) - ;; FIX: Fixes dgutov/diff-hl#213, where `diff-hl-update-async' stops - ;; with-editor (and by extension, Magit COMMIT_EDITMSG buffers) buffers from - ;; getting properly cleaned up. - (defadvice! +vc-gutter--inhibit-async-update-in-with-editor-a (fn &rest args) - :around #'diff-hl-update - (let ((diff-hl-update-async - (unless (bound-and-true-p with-editor-mode) - diff-hl-update-async))) - (apply fn args))) - ;; FIX: The revert popup consumes 50% of the frame, whether or not you're ;; reverting 2 lines or 20. This resizes the popup to match its contents. (defadvice! +vc-gutter--shrink-popup-a (fn &rest args) diff --git a/modules/ui/vc-gutter/packages.el b/modules/ui/vc-gutter/packages.el index 73fc15e98..227bb1a91 100644 --- a/modules/ui/vc-gutter/packages.el +++ b/modules/ui/vc-gutter/packages.el @@ -1,4 +1,4 @@ ;; -*- no-byte-compile: t; -*- ;;; ui/vc-gutter/packages.el -(package! diff-hl :pin "11f3113e790526d5ee00f61f8e7cd0d01e323b2e") +(package! diff-hl :pin "f66345ed1f174e844ce43d8225613b7b0fc3e253") From c616831a8ff928d5f611b497251edd4e9e5ecedd Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jul 2024 18:16:52 -0400 Subject: [PATCH 15/20] fix(org): TAB in org-mode (for corfu users) For evil users, TAB used to invoke `org-cycle` in insert mode, until recent changes with the corfu module undid them, making them invoke only completion. --- modules/lang/org/config.el | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 9b25796ee..7f21b32e7 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -846,7 +846,7 @@ between the two." ;; Recently, a [tab] keybind in `outline-mode-cycle-map' has begun ;; overriding org's [tab] keybind in GUI Emacs. This is needed to undo ;; that, and should probably be PRed to org. - [tab] #'org-cycle + :ie [tab] #'org-cycle "C-c C-S-l" #'+org/remove-link "C-c C-i" #'org-toggle-inline-images From ba3f30ef67f948438c4b8ec65d502108702be333 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 14 Jul 2024 18:19:03 -0400 Subject: [PATCH 16/20] nit(org): punctuate docstrings Plus minor grammar fix. --- modules/lang/org/config.el | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lang/org/config.el b/modules/lang/org/config.el index 7f21b32e7..e677e610d 100644 --- a/modules/lang/org/config.el +++ b/modules/lang/org/config.el @@ -56,13 +56,13 @@ Is relative to `org-directory', unless it is absolute. Is used in Doom's default "Default, centralized target for org-capture templates.") (defvar +org-habit-graph-padding 2 - "The padding added to the end of the consistency graph") + "The padding added to the end of the consistency graph.") (defvar +org-habit-min-width 30 - "Hides the consistency graph if the `org-habit-graph-column' is less than this value") + "Hide the consistency graph if `org-habit-graph-column' is less than this.") (defvar +org-habit-graph-window-ratio 0.3 - "The ratio of the consistency graphs relative to the window width") + "The ratio of the consistency graphs relative to the window width.") (defvar +org-startup-with-animated-gifs nil "If non-nil, and the cursor is over a gif inline-image preview, animate it!") From fb0402e89cd671955dd37ca9011ea2fdce3a5688 Mon Sep 17 00:00:00 2001 From: Chris Rose Date: Mon, 15 Jul 2024 07:21:01 -0700 Subject: [PATCH 17/20] bump: :tools magit magit/forge@0102834bb7c8 -> magit/forge@67314e2f83db magit/magit@9d1f8db507e0 -> magit/magit@b9948f957192 - update magit's compat library, alongside forge's use of same. --- modules/tools/magit/packages.el | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/tools/magit/packages.el b/modules/tools/magit/packages.el index cfe52c8b2..7f62c2d7b 100644 --- a/modules/tools/magit/packages.el +++ b/modules/tools/magit/packages.el @@ -1,9 +1,9 @@ ;; -*- no-byte-compile: t; -*- ;;; tools/magit/packages.el -(when (package! magit :pin "9d1f8db507e080e032943a3ed1445bd8d9aaa9fc") +(when (package! magit :pin "b9948f9571928bb7f39f4b3a112bd76e52a072ce") (when (modulep! +forge) - (package! forge :pin "0102834bb7c872c8a3f77cabf5221e8199346c43") + (package! forge :pin "67314e2f83db358d3734183008586d8bd7cb2395") (package! code-review :recipe (:host github :repo "doomelpa/code-review" From bd728fd2a8490f99c2497cb77a61e9d0ff829c9d Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Jul 2024 11:06:39 -0400 Subject: [PATCH 18/20] fix(lib): doom-project-find-file: fall back to find-file if DIR is empty Fix: #7949 --- lisp/lib/projects.el | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lisp/lib/projects.el b/lisp/lib/projects.el index 16c592e65..3a38750d9 100644 --- a/lisp/lib/projects.el +++ b/lisp/lib/projects.el @@ -155,9 +155,14 @@ If DIR is not a project, it will be indexed (but not cached)." ((and (bound-and-true-p helm-mode) (fboundp 'helm-find-files)) (call-interactively #'helm-find-files)) - ((when-let ((project-current-directory-override t) - (pr (project-current t dir))) - (project-find-file-in nil nil pr))) + ((when-let* ((project-current-directory-override t) + (pr (project-current t dir))) + (condition-case _ + (project-find-file-in nil nil pr) + ;; FIX: project.el throws errors if DIR is an empty directory, + ;; which is poor UX. + (wrong-type-argument + (call-interactively #'find-file))))) ((call-interactively #'find-file))))) ;;;###autoload From 3f66400d62cd5c3ceecf5ef6fbb7275e374afeb2 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Jul 2024 11:23:11 -0400 Subject: [PATCH 19/20] fix(treemacs): open last treemacs session if in $HOME or non-project `treemacs-add-and-display-current-project-exclusively' seems to confuse some people and please others when it is used in $HOME. To reduce confusion, SPC o p will now resume from the last session if default-directory isn't a valid project OR if it's $HOME. It will also emit a warning informing them of that. Fix: #7948 Amend: f9dfb7e92ad1 --- modules/ui/treemacs/autoload.el | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/ui/treemacs/autoload.el b/modules/ui/treemacs/autoload.el index 06b397b0f..2713f1409 100644 --- a/modules/ui/treemacs/autoload.el +++ b/modules/ui/treemacs/autoload.el @@ -12,6 +12,8 @@ Use `treemacs' command for old functionality." (require 'treemacs) (pcase (treemacs-current-visibility) (`visible (delete-window (treemacs-get-local-window))) - (_ (if (treemacs--find-current-user-project) - (treemacs-add-and-display-current-project-exclusively) - (treemacs))))) + (_ (let ((project (treemacs--find-current-user-project))) + (if (and project (not (file-equal-p project "~"))) + (treemacs-add-and-display-current-project-exclusively) + (message "No valid project in current buffer; opening last treemacs session") + (treemacs)))))) From 13ed89f2354026b9c176f5c6861704aeda07723b Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Tue, 16 Jul 2024 11:34:14 -0400 Subject: [PATCH 20/20] fix(format): disengage selection after +format-region Fix: #7951 --- modules/editor/format/autoload/format.el | 79 ++++++++++++------------ 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index 42642a3c3..44498cfa2 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -18,44 +18,47 @@ (cur-buffer (current-buffer)) (formatted-buffer (get-buffer-create " *apheleia-formatted*")) (indent 0)) - (with-current-buffer formatted-buffer - (erase-buffer) - (unless (featurep :system 'windows) - (setq-local coding-system-for-read 'utf-8) - (setq-local coding-system-for-write 'utf-8)) - ;; Ensure this temp buffer seems as much like the origin buffer as - ;; possible, in case the formatter is an elisp function, like `gofmt'. - (cl-loop for (var . val) - in (cl-remove-if-not #'listp (buffer-local-variables cur-buffer)) - ;; `enable-multibyte-characters' can change how Emacs reads the - ;; buffer's contents (or writes them to the formatters), which - ;; can cause errors. - unless (eq var 'enable-multibyte-characters) - do (set (make-local-variable var) val)) - ;; - (insert-buffer-substring-no-properties cur-buffer start end) - ;; Since we're piping a region of text to the formatter, remove any - ;; leading indentation to make it look like a file. - (setq indent (+format--current-indentation)) - (when (> indent 0) - (indent-rigidly (point-min) (point-max) (- indent))) - ;; - (apheleia-format-buffer - command - (lambda () - (with-current-buffer formatted-buffer - (when (> indent 0) - ;; restore indentation without affecting new indentation - (indent-rigidly (point-min) (point-max) - (max 0 (- indent (+format--current-indentation))))) - (set-buffer-modified-p nil)) - (with-current-buffer cur-buffer - (delete-region start end) - (goto-char start) - (save-excursion - (insert-buffer-substring-no-properties formatted-buffer) - (when callback (funcall callback))) - (kill-buffer formatted-buffer))))))) + (unwind-protect + (with-current-buffer formatted-buffer + (erase-buffer) + (unless (featurep :system 'windows) + (setq-local coding-system-for-read 'utf-8) + (setq-local coding-system-for-write 'utf-8)) + ;; Ensure this temp buffer seems as much like the origin buffer as + ;; possible, in case the formatter is an elisp function, like `gofmt'. + (cl-loop for (var . val) + in (cl-remove-if-not #'listp (buffer-local-variables cur-buffer)) + ;; `enable-multibyte-characters' can change how Emacs reads the + ;; buffer's contents (or writes them to the formatters), which + ;; can cause errors. + unless (eq var 'enable-multibyte-characters) + do (set (make-local-variable var) val)) + ;; + (insert-buffer-substring-no-properties cur-buffer start end) + ;; Since we're piping a region of text to the formatter, remove any + ;; leading indentation to make it look like a file. + (setq indent (+format--current-indentation)) + (when (> indent 0) + (indent-rigidly (point-min) (point-max) (- indent))) + ;; + (apheleia-format-buffer + command + (lambda () + (with-current-buffer formatted-buffer + (when (> indent 0) + ;; restore indentation without affecting new indentation + (indent-rigidly (point-min) (point-max) + (max 0 (- indent (+format--current-indentation))))) + (set-buffer-modified-p nil)) + (with-current-buffer cur-buffer + (delete-region start end) + (goto-char start) + (save-excursion + (insert-buffer-substring-no-properties formatted-buffer) + (when callback (funcall callback))) + (kill-buffer formatted-buffer))))) + (when (doom-region-active-p) + (setq deactivate-mark t))))) ;;