X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/3a8b7013042adae3c27327a75662fd8e884d4896..7bc7fd6058a28cdf7da672dc625c6d3f2e50aa1b:/lisp/doc-view.el diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 0e63d37adc..06cf8dcef3 100644 --- a/lisp/doc-view.el +++ b/lisp/doc-view.el @@ -1,6 +1,6 @@ ;;; doc-view.el --- View PDF/PostScript/DVI files in Emacs -*- lexical-binding: t -*- -;; Copyright (C) 2007-2015 Free Software Foundation, Inc. +;; Copyright (C) 2007-2016 Free Software Foundation, Inc. ;; ;; Author: Tassilo Horn ;; Maintainer: Tassilo Horn @@ -415,7 +415,6 @@ Typically \"page-%s.png\".") (define-key map "H" 'doc-view-fit-height-to-window) (define-key map "P" 'doc-view-fit-page-to-window) ;; Killing the buffer (and the process) - (define-key map (kbd "k") 'doc-view-kill-proc-and-buffer) (define-key map (kbd "K") 'doc-view-kill-proc) ;; Slicing the image (define-key map (kbd "s s") 'doc-view-set-slice) @@ -441,10 +440,23 @@ Typically \"page-%s.png\".") (defun doc-view-revert-buffer (&optional ignore-auto noconfirm) "Like `revert-buffer', but preserves the buffer's current modes." - ;; FIXME: this should probably be moved to files.el and used for - ;; most/all "g" bindings to revert-buffer. (interactive (list (not current-prefix-arg))) - (revert-buffer ignore-auto noconfirm 'preserve-modes)) + (cl-labels ((revert () + (let (revert-buffer-function) + (revert-buffer ignore-auto noconfirm 'preserve-modes)))) + (if (and (eq 'pdf doc-view-doc-type) + (executable-find "pdfinfo")) + ;; We don't want to revert if the PDF file is corrupted which + ;; might happen when it it currently recompiled from a tex + ;; file. (TODO: We'd like to have something like that also + ;; for other types, at least PS, but I don't know a good way + ;; to test if a PS file is complete.) + (if (= 0 (call-process (executable-find "pdfinfo") nil nil nil + doc-view--buffer-file-name)) + (revert) + (when (called-interactively-p 'interactive) + (message "Can't revert right now because the file is corrupted."))) + (revert)))) (easy-menu-define doc-view-menu doc-view-mode-map @@ -645,12 +657,8 @@ at the top edge of the page moves to the previous page." (setq doc-view--current-timer nil)) (setq mode-line-process nil)) -(defun doc-view-kill-proc-and-buffer () - "Kill the current converter process and buffer." - (interactive) - (doc-view-kill-proc) - (when (eq major-mode 'doc-view-mode) - (kill-buffer (current-buffer)))) +(define-obsolete-function-alias 'doc-view-kill-proc-and-buffer + #'image-kill-buffer "25.1") (defun doc-view-make-safe-dir (dir) (condition-case nil @@ -1653,7 +1661,7 @@ If BACKWARD is non-nil, jump to the previous match." ;; Microsoft Office formats (also handled by the odf ;; conversion chain). ("doc" odf) ("docx" odf) ("xls" odf) ("xlsx" odf) - ("ppt" odf) ("pps" odf) ("pptx" odf)) + ("ppt" odf) ("pps" odf) ("pptx" odf) ("rtf" odf)) t)))) (content-types (save-excursion @@ -1685,6 +1693,9 @@ If BACKWARD is non-nil, jump to the previous match." ;; desktop.el integration (defun doc-view-desktop-save-buffer (_desktop-dirname) + ;; FIXME: This is wrong, since this info is per-window but we only do it once + ;; here for the buffer. IOW it should be saved via something like + ;; `window-persistent-parameters'. `((page . ,(doc-view-current-page)) (slice . ,(doc-view-current-slice)))) @@ -1695,10 +1706,16 @@ If BACKWARD is non-nil, jump to the previous match." (let ((page (cdr (assq 'page misc))) (slice (cdr (assq 'slice misc)))) (desktop-restore-file-buffer file name misc) + ;; FIXME: We need to run this code after displaying the buffer. (with-selected-window (or (get-buffer-window (current-buffer) 0) (selected-window)) + ;; FIXME: This should be done for all windows restored that show + ;; this buffer. Basically, the page/slice should be saved as + ;; window-parameters in the window-state(s) and then restoring this + ;; window-state should call us back (to interpret/use those parameters). (doc-view-goto-page page) - (when slice (apply 'doc-view-set-slice slice))))) + (when slice (apply 'doc-view-set-slice slice)) + (current-buffer)))) (add-to-list 'desktop-buffer-mode-handlers '(doc-view-mode . doc-view-restore-desktop-buffer)) @@ -1763,6 +1780,8 @@ toggle between displaying the document or editing it as text. (when (not (string= doc-view--buffer-file-name buffer-file-name)) (write-region nil nil doc-view--buffer-file-name)) + (setq-local revert-buffer-function #'doc-view-revert-buffer) + (add-hook 'change-major-mode-hook (lambda () (doc-view-kill-proc) @@ -1770,9 +1789,7 @@ toggle between displaying the document or editing it as text. nil t) (add-hook 'clone-indirect-buffer-hook 'doc-view-clone-buffer-hook nil t) (add-hook 'kill-buffer-hook 'doc-view-kill-proc nil t) - (when (and (boundp 'desktop-save-mode) - desktop-save-mode) - (setq-local desktop-save-buffer 'doc-view-desktop-save-buffer)) + (setq-local desktop-save-buffer 'doc-view-desktop-save-buffer) (remove-overlays (point-min) (point-max) 'doc-view t) ;Just in case. ;; Keep track of display info ([vh]scroll, page number, overlay,