branch: externals/consult commit d44982e386eacb8c53e73bb24ef0601bce6fc0a0 Author: Daniel Mendler <m...@daniel-mendler.de> Commit: Daniel Mendler <m...@daniel-mendler.de>
consult--temporary-files: Delay disassociation of file from buffer --- consult.el | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/consult.el b/consult.el index 41eaad5ab5..73c9c914f8 100644 --- a/consult.el +++ b/consult.el @@ -1208,19 +1208,27 @@ ORIG is the original function, HOOKS the arguments." (unless (or (rassq buf temporary-buffers) (memq buf orig-buffers)) (add-hook 'window-selection-change-functions hook) (push (cons name buf) temporary-buffers) + ;; Disassociate buffer from file by setting + ;; `buffer-file-name' to nil and rename the buffer. + ;; This lets us open an already previewed buffer with + ;; the Embark default action C-. RET. (with-current-buffer buf - ;; Disassociate buffer from file by setting - ;; `buffer-file-name' to nil and rename the buffer. - ;; This lets us open an already previewed buffer with - ;; the Embark default action C-. RET. We cannot use - ;; (set-visited-file-name nil) since then the mode - ;; hooks will not run. (rename-buffer (format "Preview:%s" (file-name-nondirectory (directory-file-name name))) - 'unique) - (setq buffer-file-name nil - buffer-read-only t)) + 'unique)) + ;; The buffer disassociation is delayed to avoid breaking + ;; modes like pdf-view-mode or doc-view-mode which rely on + ;; buffer-file-name. Executing (set-visited-file-name nil) + ;; early also prevents the major mode initialization. + (let ((hook (make-symbol "consult--temporary-files-disassociate"))) + (fset hook (lambda () + (when (buffer-live-p buf) + (with-current-buffer buf + (remove-hook 'pre-command-hook hook) + (set-visited-file-name nil) + (setq buffer-read-only t))))) + (add-hook 'pre-command-hook hook)) ;; Only keep a few buffers alive (while (> (length temporary-buffers) consult-preview-max-count) (kill-buffer (cdar (last temporary-buffers)))