shackle 20170213.1534(in MELPA)
Enforce rules for popups

概要

shackle.el は、バッファの表示方法を
シンプルなルールで記述してカスタマイズするものです。

Emacs24から display-buffer-alist という
表示方法を細かく設定するオプションが導入されましたが、
複雑怪奇な代物で理解がとても困難です。

それを理解しやすい形で記述できるようにします。

バッファの表示方法とかポップアップといえば popwin.el(本家) が有名です。

しかし、タイマーを使っているなど、かなり入れ込んだ構造になっていて、
shackle.el作者曰く、デバッグ困難で不可解なバグがあるらしいです。

対してshackle.elは、標準のdisplay-buffer-alistに
ひとつのエントリを追加するだけの
シンプルで内部理解しやすい構造になっています。

popwin.el ではC-gでポップアップウィンドウを消せますが、
*M-x winner-undo*をキーに割り当ててしまえば(ここではC-z)
特にメリットを感じません。

シンプルな方が好きならばshackle.elを試してみてください。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。

(package-initialize)
(setq package-archives
      '(("gnu" . "http://elpa.gnu.org/packages/")
        ("melpa" . "http://melpa.org/packages/")
        ("org" . "http://orgmode.org/elpa/")))

初めてshackleを使う方は
以下のコマンドを実行します。

M-x package-install shackle

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name shackle

設定 150310063649.shackle.el(以下のコードと同一)

(require 'shackle)
(setq shackle-rules
      '(;; *compilation*は下部に2割の大きさで表示
        (compilation-mode :align below :ratio 0.2)
        ;; ヘルプバッファは右側に表示
        ("*Help*" :align right)
        ;; 補完バッファは下部に3割の大きさで表示
        ("*Completions*" :align below :ratio 0.3)
        ;; M-x helm-miniは下部に7割の大きさで表示
        ("*helm mini*" :align below :ratio 0.7)
        ;; 他のhelmコマンドは右側に表示 (バッファ名の正規表現マッチ)
        ("\*helm" :regexp t :align right)
        ;; 上部に表示
        ("foo" :align above)
        ;; 別フレームで表示
        ("bar" :frame t)
        ;; 同じウィンドウで表示
        ("baz" :same t)
        ;; ポップアップで表示
        ("hoge" :popup t)
        ;; 選択する
        ("abc" :select t)
        ))
(shackle-mode 1)
(setq shackle-lighter "")

;;; C-zで直前のウィンドウ構成に戻す
(winner-mode 1)
(global-set-key (kbd "C-z") 'winner-undo)
;;;; test
;; (display-buffer (get-buffer-create "*compilation*"))
;; (display-buffer (get-buffer-create "*Help*"))
;; (display-buffer (get-buffer-create "foo"))
;; (display-buffer (get-buffer-create "bar"))
;; (display-buffer (get-buffer-create "baz"))
;; (display-buffer (get-buffer-create "hoge"))
;; (display-buffer (get-buffer-create "abc"))

実行方法

$ wget http://rubikitch.com/f/150310063649.shackle.el
$ emacs -Q -f package-initialize -l 150310063649.shackle.el

上の設定をすると、このように表示されます。

スクリーンショットを撮る際フォントを大きくしているため
ウィンドウが小さすぎるように見えますが、
作業時のフォントでは問題ありません。

20150310074634.png
Fig1: *compilation*

20150310074701.png
Fig2: *Help*

20150310074717.png
Fig3: *completions*

20150310074737.png
Fig4: *helm mini*

20150310074754.png
Fig5: *helm buffers*

20150310074811.png
Fig6: foo

20150310074819.png
Fig7: bar(別フレーム)

20150310074834.png
Fig8: baz(同一ウィンドウ)

20150310074844.png
Fig9: hoge

20150310074851.png
Fig10: abc


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。