Emacsをpdfリーダーとして使う

Emacs23からdoc-view.elが標準で採用されたのでpdfファイルをC-xC-fなりdiredなりから開くとpdfをpng画像に変換してEmacs内で表示してくれます。ってのはあまりにもいまさらです。

ただ、なんか使いづらかったので、なんとなくあまり使ってこなかったのですが、popwin.elと以前に書いた英辞郎 on the WebをEmacsから使うやつを組み合わせたらすこぶるいい感じだったので、英語の論文をdoc-viewで読みつつ、わからない単語をmy-alcで調べつつ、メモをorg-modeでとるみたいな、全部まとめてEmacsで完結するようになったので、doc-viewの使い勝手を自分なりに変えてみました。

(require 'popwin)
;; my-alc
(defun my-alc (word)
  (interactive "s翻訳: ")
  (let* ((url (concat "http://eow.alc.co.jp/" (replace-regexp-in-string " " "+" word) "/UTF-8/"))
	 (str (shell-command-to-string (concat "wget -q " url " -O -"))))
    (string-match "検索結果本体 ▼\\(\\w\\|\\W\\)*▲ 検索結果本体 ▲" str)
    (setq str (substring str (+ 22 (match-beginning 0)) (- (match-end 0) 23)))
    (setq str (replace-regexp-in-string "<\\(span\\|font\\)\\(\\w\\|\\W\\)*?>" "" str))
    (setq str (replace-regexp-in-string "</\\(span\\|font\\)>" "" str))
    (setq str (replace-regexp-in-string "</div></li>\\|<ol>\\|</ol>\\|</li><li>" "\n" str))
    (setq str (replace-regexp-in-string "<\\(\\w\\|\\W\\)*?>" "" str))
    (setq str (replace-regexp-in-string "
" "\n" str))
    (setq str (my-delete-blank-lines str))
    (prog1
	(save-current-buffer
	  (save-selected-window
	    (with-current-buffer (get-buffer-create "*alc*"))
	    (set-buffer "*alc*")
	    ;(pop-to-buffer (get-buffer "*alc*")
	    ;(display-buffer "*alc*")
	    (erase-buffer)
	    (insert str)
	    (goto-char (point-min))
	    (popwin:popup-buffer "*alc*"  :height 20  :noselect t)
	    )))
    ))


(defun my-delete-blank-lines (str)
  (with-temp-buffer 
    (insert str)
    (goto-char (point-min))
    (re-search-forward "\\(^\\W*$\\|\\n\\)*")
    (delete-region (point-min) (match-end 0))
    (goto-char (point-max))
    (re-search-backward "\\w")
    (delete-region (+ 1 (point)) (point-max))
    (buffer-string)))

;; doc-view-extension
(require 'doc-view-extension)
(defun my-doc-view-next-page ()
  (interactive)
  (doc-view-next-page)
  (scroll-right)
  (scroll-down))
(define-key doc-view-mode-map "j" 'doc-view-next-line-or-next-page)
(define-key doc-view-mode-map "k" 'doc-view-previous-line-or-previous-page)
(define-key doc-view-mode-map "h" (lambda () (interactive) (scroll-right 1)))
(define-key doc-view-mode-map "l" (lambda () (interactive) (scroll-left 1)))
(define-key doc-view-mode-map "n" 'my-doc-view-next-page)
(define-key doc-view-mode-map "p" 'doc-view-previous-page)
(define-key doc-view-mode-map "K" 'doc-view-kill-buffer)
(define-key doc-view-mode-map "t" 'my-alc)

みたいな感じです。

ページの下まで読んで
doc-view-next-pageで次のページにいくと次のページの一番下にいるのが意味わかんないので左上に来るようにしたのと、hjklで移動、あとtで翻訳です。

個人的にはpdfリーダーとしては大体これで満足ですが,C-sの検索に関してのみ若干意味がわかりません.

意味がわからないというか,一回検索するとその検索語でしか検索できなくなっちゃうので多分キャンセルするためのコマンドがあると思うのですがちょっとみた限りだと見つけられませんでした.

あとC-tでツールチップで現在何ページ目を見てるかをだせるのですが,モードラインに常に表示されてるし,僕はもともとC-tに別の機能を割り当てているのでdoc-view-mode-mapではnilにしています.

とりあえずこれとanything-books.elを使ってなんかいい感じです.

id:echo_orzさんの
http://d.hatena.ne.jp/echo_orz/20110127/1296107168
の記事で,ローカルにある.pdfファイルのシンボリックリンクを一箇所にまとめて...って作戦をみて,
「じゃあシンボリックリンクのファイル名をタイトル+著者名+ファイル名とかにすればanythingから検索するとき楽じゃん」
と思ってpdfinfoと組み合わせてちょっとだけ試してみたけど,基本的にあんまりpdfinfoで見られる形でタイトルとか登録されてないっぽい上に,現在忙しくてそんな事をしている場合ではないので,あとで時間のある時にやってみたいと思います.

なんかいつもだけど今回は特に日本語がひどいです.