org-modeで記述した文章のプレビューをewwで行うようにする

はじめに

通常, org-modeで書いた文章(この記事もorg-modeで書かれています)をhtmlに変換しプレビューするとデフォルトのブラウザが開きます. これはorg-modeの設定により, WindowsではShellExecuteコマンドが, Mac OSXではopenコマンドが設定されているための動作ですが, プレビューする度にブラウザにフォーカスを奪われてしまうのが個人的な難点でした. そのため, htmlプレビューする時はEmacs24.4から内蔵されているewwを起動するようにして, Emacs内でプレビューを行えるようにしました.

org-file-appsにewwを起動するよう登録する

org-file-appsに拡張子毎に起動するコマンドが設定されているため, 拡張子がhtmlなものを対象にewwを起動するようにしました. ただ起動するだけでは今書いている文章のバッファがウィンドウから消えてしまうため, 2分割して表示するようにしています.

また, org-file-appsには既にhtmlに関するコマンドが設定されているため, 本来はそれを削除してからこの設定を加えるべきだとは思いますが, 同一のkeyが存在する場合はリストの前にある方が優先されるようなのでそのまま残してあります.

(when (emacs-version>= 24 4)
  (add-to-list 'org-file-apps '("\\.x?html?\\'" . ((lambda (url)
                                                     (if (string-match "\\`https?://.+\\.x?html?\\'" url)
                                                         default
                                                       (switch-to-buffer (window-buffer (select-window (let* ((windows (window-list)))
                                                                                                         (if (< (length windows) 2)
                                                                                                             (if (> (window-pixel-height) (window-pixel-width))
                                                                                                                 (split-window-below)
                                                                                                               (split-window-right))
                                                                                                           (let* ((org-buffer-name (concat (file-name-base url) ".org"))
                                                                                                                  (window (car (remove-if (lambda (w)
                                                                                                                                            (string= (buffer-name (window-buffer w)) org-buffer-name))
                                                                                                                                          windows))))
                                                                                                             (if (null window) ;; 同一バッファが複数並んでいる場合はnilになるので適当なwindowを返す
                                                                                                                 (car windows)
                                                                                                               window)))))))
                                                       (eww-open-file url)))
                                                   file))))

この設定を施した状態でorgファイルを開き, org-export-dispatch(C-c C-e)からhtml形式でexportして開く(h o)とewwが起動してプレビューできるようになります. また, 外部ブラウザでみたい時は, eww上で&を押下する事で外部ブラウザが開きます.

課題

  • 3分割以上された状態だとewwのバッファがあっても別のウィンドウにプレビューが表示されることがある

その他

emacs-version>= という関数は以下のようなもので, 今起動しているemacsのバージョンが, 引数で指定されたバージョン以上である時にtを返します.

(defun emacs-version>= (major minor)
  (and (numberp major)
       (numberp minor)
       (or (> emacs-major-version major)
           (and (= emacs-major-version major) (>= emacs-minor-version minor)))))