Livedoorブログからの移動

evince(いわゆるドキュメントビューア)を使っていると, キーバインドがemacs風でないことに苛立つ.

vimユーザーなら, zathuraを使えば多分いいんだろうけど, emacsバインドというと存在しないと言っていいレベル. 残念ながら, Sublime TextにもPDF Viewerは存在せず(多分), Firefoxのはなんか微妙に重くて腹が立つ.

最終的に, emacsをPDF Viewerに仕立て上げるのが一番はやいなって思った. でも, 色々大変だったのでそのへんをこの記事にまとめる. 最終的にはSublime TextのPDFプラグインを作るのも視野に入れているが, とりあえず欲しい機能をまとめないことにはお話にならない.

emacs24.4のインストール

pdf-toolsとよばれる, emacsでpdfをいい感じに扱うためのライブラリ群(?)があるのだが, これがどうやらemacs24.4じゃないと完全には動かないらしい. 厳密には, 求められた動作はするけど, 関数がないってエラーを吐き出すので, 手動でM-xから実行しているうちはいいけど, 自動化すると固まってしまう.

しかし, ubuntu14.04のaptで入るemacsは23なので, 手動でemacs24.4をインストールする必要がある. 方法については下記サイトの通りにやれば良い(purgeは個人的にはいらないと思う).

pdf-toolsの使用

インストール

まず, pdf-toolsをインストールしないとはじまらない. M-x list-packagesでパッケージ一覧へ行って, pdf-toolsを見つけてインストールすれば良い. このあたりはいつもの流れ.

基本設定

とりあえず, pdfを常にpdf-view-modeで開くようにする.

(require 'pdf-tools)
(require 'pdf-annot) 
(require 'pdf-history) 
(require 'pdf-info) 
(require 'pdf-isearch) 
(require 'pdf-links) 
(require 'pdf-misc) 
(require 'pdf-occur) 
(require 'pdf-outline) 
(require 'pdf-sync) 
(require 'tablist-filter)
(require 'tablist)
(add-to-list 'auto-mode-alist (cons "\\.pdf$" 'pdf-view-mode))

後, 噂によると, linum-modeが悪さをしてpdf-toolsを遅くするらしいので, ここを元に,

(require 'linum)
(global-linum-mode)
(defcustom linum-disabled-modes-list '(doc-view-mode pdf-view-mode)
  "* List of modes disabled when global linum mode is on"
  :type '(repeat (sexp :tag "Major mode"))
  :tag " Major modes where linum is disabled: "
  :group 'linum
  )
(defcustom linum-disable-starred-buffers 't
  "* Disable buffers that have stars in them like *Gnu Emacs*"
  :type 'boolean
  :group 'linum)
(defun linum-on ()
  "* When linum is running globally, disable line number in modes defined in `linum-disabled-modes-list'. Changed by linum-off. Also turns off numbering in starred modes like *scratch*"
  (unless (or (minibufferp) (member major-mode linum-disabled-modes-list)
          (and linum-disable-starred-buffers (string-match "*" (buffer-name)))
          )
    (linum-mode 1)))
(provide 'setup-linum)

と書いて, linum-modeを無効化する. ちなみに, 優先順位はpdf-toolsと同じで構わない(先にやらないといけないとかはない).

このままだと使い勝手が悪いので, 最低限, isearch, link, size-indicationくらいのminor-modeはいれておきたい.

(add-hook 'pdf-view-mode-hook
  (lambda ()
    (pdf-misc-size-indication-minor-mode)
    (pdf-links-minor-mode)
    (pdf-isearch-minor-mode)
  )
)

ここまでやると, 普通のpdfビューアくらいの能力は持つ. pdf-occurで単語の出現箇所一覧も見れるし, C-sでのインクリメンタルサーチもできる. ただし, pdf-misc-size-indication-minor-modeは使い方によっては拡大しすぎに見えるかもしれない. その場合は適当にpdf-view-???のコマンドを漁って自分に適するものを探せば良いと思う.

余白の削除

pdfはよく印刷を前提とした文書だったりする(e.g. 論文)ため, 印刷用の余白が取られている. けれども, PC上で見るとき, その余白はただディスプレイを占拠するだけのものとなる.

そこで, pdf-view-auto-slice-minor-modeを追加し, 余白を自動的に削除するようにする. ただし, 何故か最初のページだけはこの余白削除が効かないとかいう問題があるので注意. 解決策は今のところ不明だが, nで次ページ行ってpで戻れば削除されているのでそう問題にはならないと思う.

注釈

pdfを読んでいる時にメモを書きたいときは当然ある. 例えば, 和訳をつけておいたりとか, あとでちゃんと読もうとか思ったりとか. あるいはcode review的な用途で用いられるときもある.

そのような用途のため, pdfは注釈(annotation)という枠組みを用意しており, pdf-toolsはこれを扱うことができる.

まず, minor-modeを追加する.

pdf-annot-minor-mode

そして, pdfを開き, M-x pdf-annot-add-text-annotationとし, 注釈を付けたい場所をクリックする. そうしたら赤い注釈っぽいのがついたと思う. それをクリックすると, バッファが開かれるので, そこに注釈を書いて, C-c C-cとすると, 注釈を付けられる. 最後にC-x C-sで保存すれば良い. たまに保存を忘れるので注意.

また, annotationのリストは, M-x pdf-annot-list-annotationsで見ることができる.

以後の問題点

処理速度について

処理速度が一般のpdf viewerに比べてもっさりしている理由は, おそらく

  1. 一度pngに変換するという手間(=emacsがそもそもtext editorであることの限界)
  2. どっかでblockingな処理が挟まっている.

の2つに起因すると思われる. 2については, 明らかにPDFのページ数と処理速度に相関が見て取れたため理由の1つと判断した. 1はどうしようもないが, 2を非同期処理に変更するなどすればうまいこと処理速度があげられると思う.

バッファの処理について

現状だと一時的なバッファ(pdf-occurで生成されたバッファ等)の扱いが極めて微妙. これについてはSublime Textとかもそうなのでテキストエディタとはそこから拡張していくべきもの, ってことなのかもしれないけれども.

これらをpopwinなどを用いて構造化してやるとよさ気な感じがする.

multipageへの対応

pdf-mulitpage-minor-mode的なものがあった気がするんだけど, 今は消えてしまっている. githubを見てもTODOにかかれている内容なので, そのうち実装されるといいな.

あるいは, 2分割とか画面分割サイズを固定にして, n, pみたいなページ切り替えのコマンドを書き換えることでad-hocに対処が可能かもしれない.