Emacs で Document View を使用して PDF を読み込もうとしていますが、多くの PDF リーダーにある「幅に合わせる」コマンドと同じように動作させる方法がわかりません。これを行う内部的な方法はありますか?
4 に答える
doc-view-autofit-mode
次のスニペットは、以下で を使用してアクティブ化した新しいマイナーモードを定義していますdoc-view-mode-hook
。ウィンドウのサイズを変更するときにズームのサイズを変更するところまで、Ubuntu 14.04のEmacs 24.3で動作します!
(通常、おかげでサイズ変更の短い遅延がありますがdoc-view-autofit-timer-start
、私はこれに満足しています。)
私は解決策を信用しません。このコードは、emacs-devel メーリング リストで見つけました。
(require 'cl)
;;;; Automatic fitting minor mode
(defcustom doc-view-autofit-timer-start 1.0
"Initial value (seconds) for the timer that delays the fitting when
`doc-view-autofit-fit' is called (Which is when a window
configuration change occurs and a document needs to be fitted)."
:type 'number
:group 'doc-view)
(defcustom doc-view-autofit-timer-inc 0.02
"Value to increase (seconds) the timer (see `doc-view-autofit-timer-start')
by, if there is another window configuration change occuring, before
it runs out."
:type 'number
:group 'doc-view)
(defcustom doc-view-autofit-default-fit 'width
"The fitting type initially used when mode is enabled.
Valid values are: width, height, page."
:type 'symbol
:group 'doc-view)
(defvar doc-view-autofit-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "C-c W") 'doc-view-autofit-width)
(define-key map (kbd "C-c H") 'doc-view-autofit-height)
(define-key map (kbd "C-c P") 'doc-view-autofit-page)
map)
"Keymap used by `doc-view-autofit-mode'.")
(defun doc-view-autofit-set (type)
"Set autofitting to TYPE for current buffer."
(when doc-view-autofit-mode
(setq doc-view-autofit-type type)
(doc-view-autofit-fit)))
(defun doc-view-autofit-width ()
"Set autofitting to width for current buffer."
(interactive) (doc-view-autofit-set 'width))
(defun doc-view-autofit-height ()
"Set autofitting to height for current buffer."
(interactive) (doc-view-autofit-set 'height))
(defun doc-view-autofit-page ()
"Set autofitting to page for current buffer."
(interactive) (doc-view-autofit-set 'page))
(defun doc-view-autofit-fit ()
"Fits the document in the selected window's buffer
delayed with a timer, so multiple calls in succession
don't cause as much overhead."
(lexical-let
((window (selected-window)))
(if (equal doc-view-autofit-timer nil)
(setq doc-view-autofit-timer
(run-with-timer
doc-view-autofit-timer-start nil
(lambda ()
(if (window-live-p window)
(save-selected-window
(select-window window)
(cancel-timer doc-view-autofit-timer)
(setq doc-view-autofit-timer nil)
(cond
((equal 'width doc-view-autofit-type)
(doc-view-fit-width-to-window))
((equal 'height doc-view-autofit-type)
(doc-view-fit-height-to-window))
((equal 'page doc-view-autofit-type)
(doc-view-fit-page-to-window))))))))
(timer-inc-time doc-view-autofit-timer doc-view-autofit-timer-inc))))
(define-minor-mode doc-view-autofit-mode
"Minor mode for automatic (timer based) fitting in DocView."
:lighter " AFit" :keymap doc-view-autofit-mode-map :group 'doc-view
(when doc-view-autofit-mode
(set (make-local-variable 'doc-view-autofit-type)
doc-view-autofit-default-fit)
(set (make-local-variable 'doc-view-autofit-timer) nil)
(add-hook 'window-configuration-change-hook
'doc-view-autofit-fit nil t)
(doc-view-autofit-fit))
(when (not doc-view-autofit-mode)
(remove-hook 'window-configuration-change-hook
'doc-view-autofit-fit t)
(when doc-view-autofit-timer
(cancel-timer doc-view-autofit-timer)
(setq doc-view-autofit-timer nil))
(setq doc-view-autofit-type nil)))
(add-hook 'doc-view-mode-hook 'doc-view-autofit-mode)
以下は、クリスによる回答のわずかな変更です。これは、次のような機能との互換性を提供します。find-file-other-window
たとえば、ファイルselected-window
を表示するものとは異なる場合です。*.pdf
(defvar last-displayed-doc-view-buffer nil)
(defun get-last-displayed-doc-view-buffer ()
(setq last-displayed-doc-view-buffer (current-buffer)))
(add-hook 'doc-view-mode-hook 'get-last-displayed-doc-view-buffer)
(defun doc-view-autofit-fit ()
"Fits the document in the selected window's buffer
delayed with a timer, so multiple calls in succession
don't cause as much overhead."
(if (null doc-view-autofit-timer)
(setq doc-view-autofit-timer
(run-with-timer doc-view-autofit-timer-start nil (lambda ()
(let* (
(selected-window
(cond
((eq major-mode 'doc-view-mode)
(selected-window))
(t
(get-buffer-window last-displayed-doc-view-buffer))))
(current-buffer
(cond
((eq major-mode 'doc-view-mode)
(current-buffer))
(t
(get-buffer last-displayed-doc-view-buffer))))
(selected-fit
(when (buffer-live-p (get-buffer current-buffer))
(with-current-buffer (get-buffer current-buffer)
doc-view-autofit-type))) )
(when (window-live-p selected-window)
(with-selected-window selected-window
(when doc-view-autofit-timer (cancel-timer doc-view-autofit-timer))
(setq doc-view-autofit-timer nil)
(cond
((eq 'width selected-fit)
(doc-view-fit-width-to-window))
((eq 'height selected-fit)
(doc-view-fit-height-to-window))
((eq 'page selected-fit)
(doc-view-fit-page-to-window)))))))))
(timer-inc-time doc-view-autofit-timer doc-view-autofit-timer-inc)))
そして、Chris の回答に対する以前のコメントで述べたように、次の変数には定義が必要です。
(defvar doc-view-autofit-timer nil)
(defvar doc-view-autofit-type nil)
上記の変更により、関数に必要な をdoc-view-mode-hook
取得するために に新しい関数が追加されるため、後者の関数が の末尾に追加されるようにする必要があります。したがって、変更は次のようになります。つまり、append引数に aを追加します。current-buffer
doc-view-autofit-fit
doc-view-mode-hook
t
(add-hook 'doc-view-mode-hook 'doc-view-autofit-mode t)
上記の変更に取って代わられていないクリスの回答からの他のすべては有効なままです。
すること:
- スクロール中に各ページを調べるテストを作成して、ビューが
autofit-type
.*.pdf
現在、長いファイルを扱うとページサイズにエラーが発生します。
わたしにはできる:
(add-hook 'doc-view-mode-hook 'doc-view-fit-width-to-window)
更新: (png などへの) 変換がまだ進行中 (最初にドキュメントを開く) の場合、正しく機能しません。この特殊なケースを処理する、より信頼性の高い別の方法があります (フックはまったく使用しませんが、アドバイスを使用します)。
(defadvice doc-view-display (after fit-width activate)
(doc-view-fit-width-to-window))
注意: (require 'cl) は古くなっています。emacs-24.3以降、そうあるべきです
(require ‘cl-lib)