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