]> git.eshelyaron.com Git - emacs.git/commitdiff
bug#72241: 31.0.50; [PATCH] Use a dedicated buffer for `doc-view-open-text'
authorManuel Giraud <manuel@ledu-giraud.fr>
Tue, 23 Jul 2024 14:32:30 +0000 (16:32 +0200)
committerEshel Yaron <me@eshelyaron.com>
Thu, 25 Jul 2024 08:40:25 +0000 (10:40 +0200)
Here is an updated version of this patch.  WDYT?

From 6e32534012cafeda1d7e67aab23a8206bc887c9f Mon Sep 17 00:00:00 2001
From: Manuel Giraud <manuel@ledu-giraud.fr>
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)

etc/NEWS
lisp/doc-view.el

index fefb9a7196a0edea5905a6b177066570dc9b4284..b29a09ec8b884c82818d0dcb8a73059310b96e55 100644 (file)
--- 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.
 \f
 * New Modes and Packages in Emacs 31.1
 
index 718428c4b7d12c8d49fac2a472dd229c8a2eddb2..fbe25d956fe7661d394dac90a2871f8753a73c35 100644 (file)
@@ -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)