From 9a38ee24286645462cfbcb09bf64035da571e0ff Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sun, 10 Aug 2025 16:40:06 +0200 Subject: [PATCH] fix(format): prefix arg inhibiting format-on-save (part 2) Experimenting with a new approach to this issue, in an effort to avoid advice on such low level commands ({basic-,}save-buffer). I don't like that we're still stacking new behavior on top of their pre-existing prefix arg behavior (manipulating backup-on-save functionality), but maybe it's not useful enough to worry about? Fix: #8420 Amend: f0c8290ae2bf --- modules/config/default/+evil-bindings.el | 4 ++-- modules/editor/format/autoload/format.el | 19 +++++++++++++++++++ modules/editor/format/config.el | 9 ++++----- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/modules/config/default/+evil-bindings.el b/modules/config/default/+evil-bindings.el index 8198a5135..0b0d33fff 100644 --- a/modules/config/default/+evil-bindings.el +++ b/modules/config/default/+evil-bindings.el @@ -417,7 +417,7 @@ :desc "Previous buffer" "p" #'previous-buffer :desc "Revert buffer" "r" #'revert-buffer :desc "Rename buffer" "R" #'rename-buffer - :desc "Save buffer" "s" #'basic-save-buffer + :desc "Save buffer" "s" #'save-buffer :desc "Save all buffers" "S" #'evil-write-all :desc "Save buffer as root" "u" #'doom/sudo-save-buffer :desc "Pop up scratch buffer" "x" #'doom/open-scratch-buffer @@ -514,7 +514,7 @@ :desc "Browse private config" "P" #'doom/open-private-config :desc "Recent files" "r" #'recentf-open-files :desc "Rename/move file" "R" #'doom/move-this-file - :desc "Save file" "s" #'save-buffer + :desc "Save file" "s" #'basic-save-buffer :desc "Save file as..." "S" #'write-file :desc "Sudo find file" "u" #'doom/sudo-find-file :desc "Sudo this file" "U" #'doom/sudo-this-file diff --git a/modules/editor/format/autoload/format.el b/modules/editor/format/autoload/format.el index aeed07770..f3a070d53 100644 --- a/modules/editor/format/autoload/format.el +++ b/modules/editor/format/autoload/format.el @@ -1,5 +1,10 @@ ;;; editor/format/autoload.el -*- lexical-binding: t; -*- +;; HACK: `apheleia-mode' doesn't define a keymap. By defining one before the +;; minor mode is loaded, `define-minor-mode' will automatically register it as +;; apheleia-mode's keymap. +;;;###autoload (defvar apheleia-mode-map (make-sparse-keymap)) + (defun +format--current-indentation () (save-excursion (goto-char (point-min)) @@ -95,4 +100,18 @@ may not always work. Keep your undo keybind handy!" #'+format/region #'+format/buffer))) +;;;###autoload +(defun +format/save-buffer-no-reformat () + "`save-buffer', but don't trigger `apheleia's save-on-format behavior." + (interactive) + (let (apheleia-mode) + (basic-save-buffer))) + +;;;###autoload +(defun +format/save-buffer (arg) + "`save-buffer', but the prefix ARG also inhibits format-on-save behavior." + (interactive "P") + (let ((apheleia-mode (and apheleia-mode (memq arg '(nil 1))))) + (call-interactively #'save-buffer))) + ;;; format.el ends here diff --git a/modules/editor/format/config.el b/modules/editor/format/config.el index 4caa8f567..79ba4d55b 100644 --- a/modules/editor/format/config.el +++ b/modules/editor/format/config.el @@ -45,11 +45,10 @@ This is controlled by `+format-on-save-disabled-modes'." (set-debug-variable! 'apheleia-log-only-errors nil) (set-debug-variable! 'apheleia-log-debug-info t 2) - (defadvice! +format--inhibit-reformat-on-prefix-arg-a (orig-fn &optional arg) - "Make it so \\[save-buffer] with prefix arg inhibits reformatting." - :around #'basic-save-buffer - (let ((apheleia-inhibit (or apheleia-inhibit current-prefix-arg))) - (funcall orig-fn))) + ;; UX: Use prefix-arg on `save-buffer' or `basic-save-buffer' to inhibit + ;; format-on-save behavior. + (define-key apheleia-mode-map [remap basic-save-buffer] #'+format/save-buffer-no-reformat) + (define-key apheleia-mode-map [remap save-buffer] #'+format/save-buffer) ;; HACK: Apheleia suppresses notifications that the current buffer has ;; changed, so plugins that listen for them need to be manually informed: