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 <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.
This commit is contained in:
Manuel Giraud 2024-07-23 16:32:30 +02:00 committed by Tassilo Horn
parent 2f5af5cab3
commit 210b98bc99
2 changed files with 31 additions and 36 deletions

View file

@ -149,6 +149,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

View 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)