2013年4月2日火曜日

popwin.el が本当に便利。今まで使わなかった事を後悔するレベル。

Emacsを使っていると、コマンド補完候補表示ウインドの *Completions* 等が別ウインドで表示されることがあります。これはこれで便利なのですが、問題はその開く場所と閉じるときの挙動です。

上下に2分割(C-x 2)していると下のウインドを切り替えてバッファを表示して、閉じる時にウインドごと閉じてしまい、また C-x 2 するはめになったりすることがよくあります。

このアクションを起こした際に起こるウインドとバッファの切り替えを制御してくれるのが、popwin.el です。地味な機能ですが、使ってみると手放せなくなります。本当に便利です。


いくつかのリンク

github m2ym / popwin-el

ヘルプバッファや補完バッファをポップアップで表示してくれるpopwin.elをリリースしました
popwin.elを入れて忘れていたストレスから開放された
Emacs: popwin.el が快適過ぎる


導入方法は簡単です。github からgit clone したファイルを load-path の通ったディレクトリに配置し、dot.emacs や init.el に以下を追記します。
(require 'popwin)
(setq display-buffer-function 'popwin:display-buffer)

(setq popwin:popup-window-position 'bottom)

導入はこれだけです。後は popwin コントロール化に置きたいバッファの名前を popwin:special-display-config に列挙していくだけです。

以下は設定例です。
;; Apropos
(push '("*slime-apropos*") popwin:special-display-config)
;; Macroexpand
(push '("*slime-macroexpansion*") popwin:special-display-config)
;; Help
(push '("*slime-description*") popwin:special-display-config)
;; Compilation
(push '("*slime-compilation*" :noselect t) popwin:special-display-config)
;; Cross-reference
(push '("*slime-xref*") popwin:special-display-config)
;; Fuzzy
;;(push '("*Fuzzy Completions*") popwin:special-display-config)
;; Debugger
(push '(sldb-mode :stick t) popwin:special-display-config)
;; REPL
(push '(slime-repl-mode) popwin:special-display-config)
;; Connections
(push '(slime-connection-list-mode) popwin:special-display-config)
;; Browse-Kill-RIng
(push '("*Kill Ring*") popwin:special-display-config)
;; anything
(push '("*anything*") popwin:special-display-config)
;; sdic
(push '("*sdic*") popwin:special-display-config)
;; Completions
(push '("*Completions*") popwin:special-display-config)


いくつかの el は自前でバッファ管理を行うものもあり、そういった el は popwin が働きません。代表的なものとして sdic があります。
ただし sdic の場合、以下の内容を追加することで、 popwin 配下におさめることができます。
;; sdic-display-buffer 書き換え 
(defadvice sdic-display-buffer (around sdic-display-buffer-normalize activate)
  "sdic のバッファ表示を普通にする。"
  (setq ad-return-value (buffer-size))
  (let ((p (or (ad-get-arg 0)
               (point))))
    (and sdic-warning-hidden-entry
         (> p (point-min))
         (message "この前にもエントリがあります。"))
    (goto-char p)
    (display-buffer (get-buffer sdic-buffer-name))
    (set-window-start (get-buffer-window sdic-buffer-name) p)))

(defadvice sdic-other-window (around sdic-other-normalize activate)
  "sdic のバッファ移動を普通にする。"
  (other-window 1))

(defadvice sdic-close-window (around sdic-close-normalize activate)
  "sdic のバッファクローズを普通にする。"
  (bury-buffer sdic-buffer-name))
これは 2ch の Emacs Part 39 からいただきました。

0 件のコメント:

コメントを投稿