X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/c3c51ec274f423cf8044cd5b9bc0bbc5bda1f6aa..1650d7102ae8ea943e4197b7d91198640f0e0ff6:/lisp/doc-view.el diff --git a/lisp/doc-view.el b/lisp/doc-view.el index 37cb2787cc..223565cedb 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-2014 Free Software Foundation, Inc. +;; Copyright (C) 2007-2016 Free Software Foundation, Inc. ;; ;; Author: Tassilo Horn ;; Maintainer: Tassilo Horn @@ -140,6 +140,7 @@ (require 'dired) (require 'image-mode) (require 'jka-compr) +(require 'subr-x) ;;;; Customization Options @@ -415,7 +416,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 +441,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 @@ -613,7 +626,7 @@ at the bottom edge of the page moves to the next page." (image-bob) (image-bol 1)) (set-window-hscroll (selected-window) hscroll))) - (image-next-line 1))) + (image-next-line arg))) (defun doc-view-previous-line-or-previous-page (&optional arg) "Scroll downward by ARG lines if possible, else goto previous page. @@ -645,12 +658,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 @@ -687,14 +696,19 @@ It's a subdirectory of `doc-view-cache-directory'." (setq doc-view--current-cache-dir (file-name-as-directory (expand-file-name - (concat (subst-char-in-string ?% ?_ ;; bug#13679 - (file-name-nondirectory doc-view--buffer-file-name)) - "-" - (let ((file doc-view--buffer-file-name)) - (with-temp-buffer - (set-buffer-multibyte nil) - (insert-file-contents-literally file) - (md5 (current-buffer))))) + (concat (thread-last + (file-name-nondirectory doc-view--buffer-file-name) + ;; bug#13679 + (subst-char-in-string ?% ?_) + ;; arc-mode concatenates archive name and file name + ;; with colon, which isn't allowed on MS-Windows. + (subst-char-in-string ?: ?_)) + "-" + (let ((file doc-view--buffer-file-name)) + (with-temp-buffer + (set-buffer-multibyte nil) + (insert-file-contents-literally file) + (md5 (current-buffer))))) doc-view-cache-directory))))) ;;;###autoload @@ -973,6 +987,11 @@ is named like ODF with the extension turned to pdf." (doc-view-start-process "odf->pdf" doc-view-odf->pdf-converter-program (list (concat "-env:UserInstallation=file://" + ;; The URL must be + ;; file:///C:/tmp/dir on Windows. + ;; https://wiki.documentfoundation.org/UserProfile. + (when (eq system-type 'windows-nt) + "/") tmp-user-install-dir) "--headless" "--convert-to" "pdf" "--outdir" (doc-view--current-cache-dir) odf) @@ -1653,7 +1672,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 +1704,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 +1717,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 +1791,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 +1800,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,