From: Manuel Giraud Date: Tue, 23 Jul 2024 14:32:30 +0000 (+0200) Subject: bug#72241: 31.0.50; [PATCH] Use a dedicated buffer for `doc-view-open-text' X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=fb9cad8c45a94ac26f63ec6e960a66d7eaa12383;p=emacs.git bug#72241: 31.0.50; [PATCH] Use a dedicated buffer for `doc-view-open-text' Here is an updated version of this patch. WDYT? From 6e32534012cafeda1d7e67aab23a8206bc887c9f 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 "text contents" buffer and switch to it. (doc-view-toggle-display): Switch back to the document buffer and kill the "text contents" one. * etc/NEWS: Mention the change. (cherry picked from commit 210b98bc9937a86920716ebdf0b0e00a0c79c8fe) --- diff --git a/etc/NEWS b/etc/NEWS index fefb9a7196a..b29a09ec8b8 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -143,6 +143,13 @@ This affects calls to 'warn', 'lwarn', 'display-warning', and In most cases, having it enabled leads to a large amount of false positives. +** DocView + +--- +*** Dedicated buffer for plain text contents. +When switching to the plain text contents with 'doc-view-open-text', +DocView now creates a dedicated buffer to display it. 'C-c C-c' gets you +back to real DocView buffer if it still exists. * New Modes and Packages in Emacs 31.1 diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 718428c4b7d..fbe25d956fe 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -1768,34 +1768,25 @@ For now these keys are useful: (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 @@ For now these keys are useful: (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)