From 03d83f95c9a6502bf6b85d0b14e47022cf29bd3d Mon Sep 17 00:00:00 2001 From: Manuel Giraud Date: Sun, 21 Jul 2024 18:52:52 +0200 Subject: [PATCH] Use a dedicated buffer for `doc-view-open-text' * lisp/doc-view.el (doc-view-open-text): Create a new "doc's contents" buffer an switch to it. (doc-view-toggle-display): Switch back to the document buffer and kill the "doc's contents" one. --- lisp/doc-view.el | 60 +++++++++++++++++++----------------------------- 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 801783bd766..6313ee83857 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -1768,34 +1768,25 @@ doc-view-open-text (let ((txt (expand-file-name "doc.txt" (doc-view--current-cache-dir))) (page (doc-view-current-page))) (if (file-readable-p txt) - (let ((inhibit-read-only t) - (buffer-undo-list t) - (dv-bfn doc-view--buffer-file-name)) - (erase-buffer) - ;; FIXME: Replacing the buffer's PDF content with its txt rendering - ;; is pretty risky. We should probably use *another* - ;; buffer instead, so there's much less risk of - ;; overwriting the PDF file with some text rendering. - (set-buffer-multibyte t) - (insert-file-contents txt) - (doc-view--text-view-mode) - (setq-local doc-view--buffer-file-name dv-bfn) - (set-buffer-modified-p nil) - (doc-view-minor-mode) - (goto-char (point-min)) - ;; Put point at the start of the page the user was - ;; reading. Pages are separated by Control-L characters. - (re-search-forward page-delimiter nil t (1- page)) - (add-hook 'write-file-functions - (lambda () - ;; FIXME: If the user changes major mode and then - ;; saves the buffer, the PDF file will be clobbered - ;; with its txt rendering! - (when (eq major-mode 'doc-view--text-view-mode) - (error "Cannot save text contents of document %s" - buffer-file-name))) - nil t)) - (doc-view-doc->txt txt 'doc-view-open-text))))) + (let ((dv-bfn doc-view--buffer-file-name) + (dv-text-buffer-name (format "%s/text" (buffer-name)))) + ;; Prepare the text buffer + (with-current-buffer (get-buffer-create dv-text-buffer-name) + (let ((inhibit-read-only t) + (buffer-undo-list t)) + (erase-buffer) + (set-buffer-multibyte t) + (insert-file-contents txt) + (doc-view--text-view-mode) + (setq-local doc-view--buffer-file-name dv-bfn) + (set-buffer-modified-p nil) + (doc-view-minor-mode) + (goto-char (point-min)) + ;; Put point at the start of the page the user was + ;; reading. Pages are separated by Control-L characters. + (re-search-forward page-delimiter nil t (1- page)))) + (switch-to-buffer (get-buffer dv-text-buffer-name))) + (doc-view-doc->txt txt 'doc-view-open-text))))) ;;;;; Toggle between editing and viewing @@ -1816,14 +1807,11 @@ doc-view-toggle-display (doc-view-fallback-mode) (doc-view-minor-mode 1)) ((eq major-mode 'doc-view--text-view-mode) - (let ((buffer-undo-list t)) - ;; We're currently viewing the document's text contents, so switch - ;; back to . - (setq buffer-read-only nil) - (insert-file-contents doc-view--buffer-file-name nil nil nil t) - (doc-view-fallback-mode) - (doc-view-minor-mode 1) - (set-buffer-modified-p nil))) + ;; We're currently viewing the document's text contents, switch to + ;; the buffer visiting the real document and kill myself. + (let ((dv-buffer (find-buffer-visiting doc-view--buffer-file-name))) + (kill-buffer) + (switch-to-buffer dv-buffer))) (t ;; Switch to doc-view-mode (when (and (buffer-modified-p) -- 2.45.2