2011-09-14
2011-07-09
■[Emacs] popwin.el v0.3をリリースしました

popwin.el v0.3をリリースしました。表示まわりの修正が主です。個人的には過去最高の安定度だと思います。
v0.3本体は次のURLから取得してください。
https://github.com/m2ym/popwin-el/tree/v0.3
install-elispあるいはauto-installを持っている人は次の式を評価することでインストールできます。
;; install-elisp (install-elisp "https://raw.github.com/m2ym/popwin-el/v0.3/popwin.el") ;; auto-install (auto-install-from-url "https://raw.github.com/m2ym/popwin-el/v0.3/popwin.el")
今後の目標としては、より積極的なUIの刷新を行いたいと考えています。具体的には以下の通り。
1. popwin:special-display-configのデフォルトをもっと充実させたい
2. diredをなんとかしたい。具体的にはTextMateのナビゲーションペイン(?)を実装したい
3. eshell使ってる人とかansi-term使ってる人を助けたい
4. 他の拡張ともっと協調したい
5. 願わくばGNU Emacsに取り込みたい
何か要望があればpopwin.elのIssuesに登録してください。
https://github.com/m2ym/popwin-el/issues?sort=created&direction=desc&state=open
v0.2からの主な変更点
以下、箇条書き。変更点の詳細についてはREADMEを参照してください。
新追加
バグ修正
- ポップアップウィンドウを閉じたときに前回のウィンドウのフォーカスが失われる問題を修正
- ウィンドウ構成が3カラムのときに表示がおかしくなる問題を修正
- ウィンドウの幅/高さが整数指定のときにレイアウトがおかしくなる問題を修正
2011-04-01
■[Emacs] 主張しないスクロールバーモード、yascroll.elをリリースしました

恥をしのんで告白しますが、実は僕は数カ月前まで標準のスクロールバーモードを有効にしていました。明確な目的があったわけではなく、単純に自分の編集箇所を視覚的に知りたかっただけです。
しかしながら、この標準のスクロールバーモードは、個別のウィンドウごとに出す出さないの選択ができず、しかもスクロールバーが不要な時でも常に表示されるため、編集領域を無駄にするという欠点があります。
そこでiPhoneのスクロールバーからインスピレーションを得て、主張しないスクロールバーモード、yascroll.elというのを作ってみました。yascroll.elはスクロール時にスクロールバーがウィンドウ右辺に現われるという単純なものです。
本体は次のURLから手に入ります。
https://github.com/m2ym/yascroll-el
install-elisp
やauto-install
がある場合は次の式を評価することでインストールできます。
;; install-elisp (install-elisp "https://github.com/m2ym/yascroll-el/raw/master/yascroll.el") ;; auto-install (auto-install-from-url "https://github.com/m2ym/yascroll-el/raw/master/yascroll.el")
後は.emacs
に次の設定を書けばOKです。
(require 'yascroll) (global-yascroll-bar-mode 1)
なお、linum-mode
やjaspace-mode
との共存で問題があることが分かっています。それらの問題は今後、解決したいと思います。
それでは。
2011-02-28
■[Emacs] popwin.el v0.2をリリースしました

popwin.el v0.2をリリースしました。いくつかの対話コマンドの追加と雑多なバグ修正がメインです。v0.2は次のURLから取得できます。
https://github.com/m2ym/popwin-el/tree/v0.2
install-elispやauto-installでインストールする場合は次の式を評価してください。
;; install-elisp (install-elisp "https://github.com/m2ym/popwin-el/raw/v0.2/popwin.el") ;; auto-install (auto-install-from-url "https://github.com/m2ym/popwin-el/raw/v0.2/popwin.el")
追加されたコマンド
popwin:popup-buffer-tail
popwin:popup-bufferと同様ですが、表示されるバッファを末尾までスクロールする点が異なります。ログの表示などに便利です。
popwin:find-file
find-fileしたバッファをポップアップウィンドウで表示します。ファイルをちら見するときに便利です。
popwin:find-file-tail
popwin:find-fileと同様ですが、表示されるバッファを末尾までスクロールする点が異なります。
popwin:messsages
Messagesバッファをポップアップウィンドウで表示します。
popwin:stick-popup-window
現在のポップアップウィンドウをstickします。
popwin:close-popup-window
現在のポップアップウィンドウを閉じます。v0.2から対話コマンドになりました。
popwin:select-popup-window
現在のポップアップウィンドウを選択します。
popwin:popup-buffer
指定したバッファをポップアップウィンドウで表示します。v0.2から機能を限定した対話コマンドになりました。
popwin:display-buffer
popwin:popup-bufferと同様ですが、popwin:special-display-configの設定を使ってポップアップウィンドウを表示します。v0.2から対話コマンドになりました。
popwin:display-last-buffer
popwin:display-bufferで表示したバッファを再度表示します。閉じてしまったポップアップウィンドウを再度確認するときに便利です。
追加された機能
stick
ポップアップウィンドウを自動的に閉じられないようにする機能です。コンパイラのエラーメッセージを見ながら修正するときなどに使います。
popwin:stick-popup-windowで現在のポップアップウィンドウをstickします。
popwin:popup-buffer系の関数に:stick tを渡すとポップアップウィンドウをデフォルトでstickします。
popwin:special-display-configの各設定に:stick tを追加すると、それによって表示されるバッファのポップアップウィンドウをデフォルトでstickします。
幅・高さのパーセント指定
popwin:popup-window-widthやpopwin:popup-window-heightなどにフレームサイズに対するパーセンテージを指定できるようになりました。
修正されたバグ
- C-gした直後にポップアップウィンドウを表示するとすぐに閉じてしまう問題
yousukouwani
これを導入してからtwittering-mode.elなどを快適に仕様できるようになりました。とても感謝しています。ありがとうございます。
2011-01-20
■[Emacs] ヘルプバッファや補完バッファをポップアップで表示してくれるpopwin.elをリリースしました

ヘルプバッファや補完バッファをポップアップで表示してくれるpopwin.elをリリースしました。popwin.elはEmacsにポップアップウィンドウという概念を導入することにより、バッファを表示する(display-buffer)際のEmacsのトチ狂った仕様を矯正します。この「トチ狂った仕様」とは例えば、
- M-x describe-functionしたらウィンドウが勝手に分割された
- あるいはウィンドウのバッファを勝手に切り替えられた
- ヘルプバッファ(*Help*)とか補完バッファ(*Completions*)がどのウィンドウに出現するか予測できない
- しかも作業後にそれらのバッファが表示されたままになったりする
のようなものを指します。Emacsを触ったことがある人なら上記のいずれかは不満に思ったことがあるはずです。ちなみに僕は全てを不満に思っています。
余談になりますが、Wikipediaの学習性無力感によると、長期間のストレスは、その対象にある種の無力感を与えるらしいです(犬に電気ショックを与える実験によりこの学習性無力感を実証した)。Emacsユーザーもこの実験の犬と同じなのではないでしょうか。つまり、この謎仕様に少なからずストレスを感じているのにもかかわらず、そのストレスがあまりに長期間であるため対抗する気概が失なわれているのではないかと。かくいう僕もその状態だったわけですが、重い腰をあげて全力で対抗してやりました。その結果生まれたのがpopwin.elなのです。不満に思いはじめてからおよそ4年が経過していました。
本題に戻って、popwin.elのポップアップウィンドウがどういうものかを説明しておきましょう。ポップアップウィンドウというと小さなウィンドウがポンと出てくるイメージがありますが、ここでのポップアップウィンドウは、あくまでEmacsにおける「ウィンドウ」であって、フレームの4辺からウィンドウを引き出すように表示されます。
ポップアップ前
ポップアップ後(補完バッファを表示)
popwin.elはこのポップアップウィンドウをベースにして、上記の問題の解決するための優れたユーザーインターフェースを提供します。
インストール
popwin.elを下記からダウンロードしてロードパスの通ったディレクトリにインストールしてください。
https://github.com/m2ym/popwin-el
install-elispやauto-installを持っている人は次のようにインストールすることも可能です。
;; install-elisp (install-elisp "https://github.com/m2ym/popwin-el/raw/master/popwin.el") ;; auto-install (auto-install-from-url "https://github.com/m2ym/popwin-el/raw/master/popwin.el")
(require 'popwin) (setq display-buffer-function 'popwin:display-buffer)
display-buffer-functionを変更したくない人は次の初期化コードでも動作します。
(require 'popwin) (setq special-display-function 'popwin:special-display-popup-window)
ただし、あらかじめspecial-display-buffer-namesあるいはspecial-display-regexpsにポップアップ表示したいバッファを設定しておく必要があります。
使い方
デフォルトでは*Help*, *Completions*, *compilatoin*, *Occur*バッファがポップアップ表示されます。試しにM-x find-fileしてTABを数回押してみてください。フレーム下部に*Completions*バッファがポップアップ表示されると思います。
補完バッファのポップアップ表示
他のウィンドウを選択するか、C-gすることによりポップアップウィンドウを閉じることができます。もちろん元のウィンドウの状態は保持されます。
他の例のスクリーンショットも示します。
M-x occur
M-x compile
設定
ポップアップウィンドウの幅や高さはpopwin:popup-window-widthやpopwin:popup-window-heightで設定します。ポップアップウィンドウの表示される場所はpopwin:popup-window-positionで設定します。値はleft, top, right, bottomのいずれかです。
どのバッファをポップアップ表示するかはpopwin:special-display-configで制御します。この変数には(pattern :regexp VAL :width VAL :height VAL :position VAL :noselect VAL)の形をした値のリストが入ります。patternには、ポップアップ表示するバッファ名を文字列を指定します。patternにシンボルを指定するとそのメジャーモードのバッファがポップアップ表示されます。
例えば以下のコードは*scratch*バッファをポップアップ表示します。
(setq popwin:special-display-config '(("*scratch*"))) (display-buffer "*scratch*")
:regexキーワードにtを指定するとpatternに正規表現を指定できます。:widthキーワードに値を設定するとpopwin:popup-window-widthの代わりにこの値が使用されます。:heightキーワードや:positionキーワードも同様です。:noselectキーワードにtを指定するとポップアップ表示時にポップアップウィンドウを選択しません。
popwin.elはあくまでdisplay-bufferを制御するものですので、バッファの切り替えなどはその対象外です。例えば先の*scratch*バッファの設定を行ったあとにswitch-to-bufferしてもポップアップ表示されません。これはバグでなく仕様です。
設定例:Anything
*anything*バッファをポップアップ表示する設定です。
(setq anything-samewindow nil) (push '("*anything*" :height 20) popwin:special-display-config)
*anything*バッファをポップアップ表示
設定例: Dired
diredのバッファをフレームの上部にポップアップ表示する設定です。
(push '(dired-mode :position top) popwin:special-display-config)
(require 'dired-x)してからM-x dired-jump-other-windowするとdiredのバッファをポップアップ表示できます。
diredのバッファをポップアップ表示
API
基本的なAPIを紹介します。詳しくはソースコードは読んでください。
popwin:create-popup-window &optional size position adjust => (master-window popup-window)
popwin:create-popup-windowはポップアップウィンドウを作成して、マスタウィンドウと共に返します。マスタウィンドウとはポップアップウィンドウを作成するために分割されたウィンドウです。ポップアップウィンドウを閉じる作業は開発者の責任です。
popwin:popup-buffer buffer &key width height position noselect => popup-window
popwin:popup-bufferはバッファbufferをポップアップウィンドウで表示します。ポップアップウィンドウは自動的に閉じられます。キーワードで渡す引数の意味はpopwin:special-display-configのものと同じです。
popwin:display-buffer buffer flag => window
popwin:display-bufferはpopwin:special-display-configを参照することにより、バッファbufferをポップアップ表示すべきかどうか調べて、ポップアップ表示すべきならそのバッファ特有の設定でpopwin:popup-bufferを呼び出します。ポップアップ表示すべきでないなら、通常通りdisplay-bufferします。
まとめ
popwin.elは地味ですが、Emacsの根本的なユーザーインターフェースの問題を解決してくれます。まだ安定していないと思いますので、どんどん使ってバグ報告してください。メールならtomo@cx4a.orgに、twitterなら@m2ymにメッセージくれると嬉しいです。それでは。
開発頑張って下さい!!