popwin.elがすこぶる快適

ヘルプバッファや補完バッファをポップアップで表示してくれるpopwin.elをリリースしました。popwin.elはEmacsにポップアップウィンドウという概念を導入することにより、バッファを表示する(display-buffer)際のEmacsのトチ狂った仕様を矯正します。この「トチ狂った仕様」とは例えば、

  • M-x describe-functionしたらウィンドウが勝手に分割された
  • あるいはウィンドウのバッファを勝手に切り替えられた
  • ヘルプバッファ(*Help*)とか補完バッファ(*Completions*)がどのウィンドウに出現するか予測できない
  • しかも作業後にそれらのバッファが表示されたままになったりする

のようなものを指します。Emacsを触ったことがある人なら上記のいずれかは不満に思ったことがあるはずです。ちなみに僕は全てを不満に思っています。

ヘルプバッファや補完バッファをポップアップで表示してくれるpopwin.elをリリースしました - Functional Emacser

まさに!!ってんで早速入れてみたんですがすこぶる快適です。

(if (require 'popwin nil t)
    (progn
      (setq display-buffer-function 'popwin:display-buffer)
      (setq popwin:popup-window-height 0.4)
      (setq anything-samewindow nil)
      (push '("*anything*" :height 20) popwin:special-display-config)
      (push '(dired-mode :position top) popwin:special-display-config)
      (push '("\\*[Vv][Cc]" :regexp t :position top) popwin:special-display-config)
      (push '("\\*git-" :regexp t :position top) popwin:special-display-config)
      ))

あと本家 git 付属の git.el を使ってるんですが、git-status で switch-to-buffer じゃなくて display-buffer するようにして、

--- git.el.orig 2011-03-02 19:05:12.000000000 +0900
+++ git.el      2011-03-02 19:09:50.000000000 +0900
@@ -1667,7 +1667,7 @@
   (if (file-directory-p (concat (file-name-as-directory dir) ".git"))
       (let ((buffer (or (and git-reuse-status-buffer (git-find-status-buffer dir))
                         (create-file-buffer (expand-file-name "*git-status*" dir)))))
-        (switch-to-buffer buffer)
+        (display-buffer buffer)
         (cd dir)
         (git-status-mode)
         (git-refresh-status)

popwin が効くようにして、git系とvc系のはフレームの高さの 40% のポップアップウィンドウをフレームの上部に表示するようにしてます。