[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: View PDF, PS within emacs
>>>>> In [emacs-w3m : No.10034] Katsumi Yamaoka wrote:
> I tried a quick hack. It works, however it has to be much improved.
I've improved the `doc-view-mode' support for emacs-w3m. A patch
for the CVS trunk is below. It works asynchronously and requires
no temp file. In this version, the new `w3m-use-doc-view-mode'
variable controls whether to use the `doc-view-mode'.
,----
| w3m-use-doc-view-mode is a variable defined in `w3m.elc'.
| Its value is
| ("application/dvi" "application/postscript" "application/pdf")
|
| Documentation:
| List of content types for which to use `doc-view-mode' to view contents.
| This overrides `w3m-content-type-alist'.
`----
For remote files, the content type of a file is compared with
the value of this variable after retrieving the contents. And
the file is displayed using `doc-view-mode' if its content type
matches one of the value.
But it can be altered to the way letting `w3m-content-type-alist'
control whether to use the `doc-view-mode'. Which do you think
to be good?
On the other hand, for local files (e.g. file:///dir/file.pdf)
`auto-mode-alist' controls how to display them, because they
will be open by a `find-file-*' function which is the default
value of `w3m-local-find-file-function'.
(I noticed there is no way to view file:///dir/file.pdf using
the external viewer such as acroread. Oops!)
--- w3m.el~ 2008-02-20 08:08:23 +0000
+++ w3m.el 2008-02-29 10:05:28 +0000
@@ -161,6 +161,8 @@
;; Avoid byte-compile warnings.
(eval-when-compile
+ (autoload 'doc-view-mode "doc-view" nil t)
+ (autoload 'doc-view-mode-p "doc-view")
(autoload 'rfc2368-parse-mailto-url "rfc2368")
(autoload 'widget-convert-button "wid-edit")
(autoload 'widget-forward "wid-edit" nil t)
@@ -395,6 +397,18 @@
:group 'w3m
:type 'boolean)
+(defcustom w3m-use-doc-view-mode
+ (condition-case nil
+ (delq nil (mapcar (lambda (type)
+ (if (doc-view-mode-p type)
+ (format "application/%s" type)))
+ '(dvi postscript pdf)))
+ (error nil))
+ "List of content types for which to use `doc-view-mode' to view contents.
+This overrides `w3m-content-type-alist'."
+ :group 'w3m
+ :type '(repeat (string :tag "Type" :value "application/")))
+
(defcustom w3m-imitate-widget-button '(eq major-mode 'gnus-article-mode)
"*If non-nil, imitate the widget buttons on link (anchor) buttons.
It is useful for moving about in a Gnus article buffer using TAB key.
@@ -5710,6 +5724,8 @@
(w3m-create-text-page url type charset page-buffer))
((string-match "\\`image/" type)
(w3m-create-image-page url type charset page-buffer))
+ ((member type w3m-use-doc-view-mode)
+ (w3m-doc-view url))
(t
(with-current-buffer page-buffer
(w3m-external-view url)
@@ -6877,7 +6893,9 @@
(w3m-quit force)
(setq cur (current-buffer))
(if (w3m-use-tab-p)
- (w3m-next-buffer -1)
+ (save-window-excursion
+ (select-window (or (get-buffer-window cur t) (selected-window)))
+ (w3m-next-buffer -1))
;; List buffers being shown in the other windows of the current frame.
(save-current-buffer
(walk-windows (lambda (window)
@@ -8062,6 +8080,39 @@
(copy-file ftp filename)
(message "Wrote %s" filename)))))
+(defun w3m-doc-view (url)
+ "View PDF/PostScript/DVI files using `doc-view-mode'.
+`w3m-pop-up-windows' and `w3m-pop-up-frames' control how the document
+window turns up."
+ (let* ((basename (file-name-nondirectory (w3m-url-strip-query url)))
+ (regexp (concat "\\`" (regexp-quote basename) "\\(?:<[0-9]+>\\)?\\'"))
+ (buffers (buffer-list))
+ buffer data case-fold-search)
+ (save-current-buffer
+ (while buffers
+ (setq buffer (pop buffers))
+ (if (and (string-match regexp (buffer-name buffer))
+ (progn
+ (set-buffer buffer)
+ (eq major-mode 'doc-view-mode))
+ (equal buffer-file-name url))
+ (setq buffers nil)
+ (setq buffer nil))))
+ (unless (prog1
+ buffer
+ (unless buffer
+ (setq buffer (generate-new-buffer basename)
+ data (buffer-string)))
+ (let ((pop-up-windows w3m-pop-up-windows)
+ (pop-up-frames w3m-pop-up-frames))
+ (pop-to-buffer buffer)))
+ (set-buffer-multibyte nil)
+ (insert data)
+ (set-buffer-modified-p nil)
+ (setq buffer-file-name url)
+ (doc-view-mode)
+ 'internal-view)))
+
(eval-and-compile
(unless (fboundp 'w3m-add-local-hook)
;; Silence the byte compiler; `w3m-add-local-hook' will be defined