split-root.elでEmacsで横長のウィンドウを作成する

split-root.elは図(本家より転載)のように確実に画面下部に横長のウィンドウを作成します。

http://nschum.de/src/emacs/split-root/compilation.png

普段は通常のEmacsのウィンドウ分割に満足していても、特定のケースでは画面下部に出したいこともあります。 この場合は、 split-root.el を使った display-buffer-function を作成します。 display-buffer関数は、 display-buffer-function に指定してある関数を呼びます。

split-root.elは split-root にありますが、auto-install.elで直接インストールできます。


M-x install-elisp http://nschum.de/src/emacs/split-root/split-root.el

(require 'split-root)
(defvar split-root-window-height nil)
(defun display-buffer-function--split-root (buf &optional ignore)
  (let ((window (split-root-window split-root-window-height)))
    (set-window-buffer window buf)
    window))

有効にするためには display-buffer-function--split-root を display-buffer-function に一時的に設定しておきます。 split-root-window-heightも指定しておくと、ウィンドウの高さを指定できます。

例:twittering-modeで投稿する

twittering-modeでtwitterに投稿するには、 twittering-update-status-interactive を使います。 内部で twittering-update-status-from-pop-up-buffer → pop-to-buffer が呼ばれ、その関数は display-buffer を呼びます。 この関数は複数箇所で呼ばれているので、アドバイスを定義します。

(defadvice twittering-update-status-from-pop-up-buffer (around split-root activate)
  ""
  (let ((display-buffer-function 'display-buffer-function--split-root)
        (split-root-window-height 26))
    ad-do-it))

例:org-capture

org-mode で素早くメモを取る org-capture でもこの設定を使っています。 内部で switch-to-buffer-other-window → pop-to-buffer と呼んでいるので、やはり display-buffer-function を設定することでウィンドウ分割をコントロールできます。

(defun org-capture--split-root ()
  (interactive)
  (let ((display-buffer-function 'display-buffer-function--split-root) 
    (org-capture)))

そして、新しく定義した org-capture--split-root を org-captureの代わりにキーに割り当てます。

例:anything.el

もちろん、anything.elでも使えます。 anything-display-function に設定します。

[emacs][anything] anything-display-function でストレスフリー - プログラム番長のヲボエガキ 参照。

常にsplit-rootを使う場合

(setq anything-display-function 'display-buffer-function--split-root)
anything呼び出し時に指定する場合

キーワード引数は、任意の変数名(anything-を取り除いた名前)を使うことができます。

(anything :source 'anything-c-source-buffers
          :display-function 'display-buffer-function--split-root)

anythingを呼び出す関数に指定する場合

anything-project-grepがanythingを呼んでいるので、letで囲みます。

(defun anything-project-grep--split-root ()
  (interactive)
  (let ((anything-display-function 'display-buffer-function--split-root))
    (anything-project-grep)))