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を参照してください。

新追加
  • 便利なキーマップであるpopwin:keymapを追加
  • w3mと協調するmisc/popwin-w3m.elを追加
  • YaTeXと協調するmisc/popwin-yatex.elを追加
バグ修正
  • ポップアップウィンドウを閉じたときに前回のウィンドウのフォーカスが失われる問題を修正
  • ウィンドウ構成が3カラムのときに表示がおかしくなる問題を修正
  • ウィンドウの幅/高さが整数指定のときにレイアウトがおかしくなる問題を修正

主張しないスクロールバーモード、yascroll.elをリリースしました

恥をしのんで告白しますが、実は僕は数カ月前まで標準のスクロールバーモードを有効にしていました。明確な目的があったわけではなく、単純に自分の編集箇所を視覚的に知りたかっただけです。

しかしながら、この標準のスクロールバーモードは、個別のウィンドウごとに出す出さないの選択ができず、しかもスクロールバーが不要な時でも常に表示されるため、編集領域を無駄にするという欠点があります。

そこでiPhoneのスクロールバーからインスピレーションを得て、主張しないスクロールバーモード、yascroll.elというのを作ってみました。yascroll.elはスクロール時にスクロールバーがウィンドウ右辺に現われるという単純なものです。

本体は次のURLから手に入ります。

https://github.com/m2ym/yascroll-el

install-elispauto-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-modejaspace-modeとの共存で問題があることが分かっています。それらの問題は今後、解決したいと思います。

それでは。

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した直後にポップアップウィンドウを表示するとすぐに閉じてしまう問題

ヘルプバッファや補完バッファをポップアップで表示してくれる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")

最後に.emacsに次の初期化コードを書いてください。

(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にメッセージくれると嬉しいです。それでは。

久しぶりの日記

久しぶりの日記です。実に半年ぶりですね。ネタがなかったわけではありません。単に文章を書くのが面倒だっただけです(作文は苦手なのです)。逆に、書きたいと思わせるほどのネタがなかっただけなのかもしれません。

人間の学習曲線は指数的であると言われますが、僕は同意しません。そりゃ長い目でみれば指数的だと思いますが、細かいところではS字カーブがいくつも描かれているはずです。僕は、S字のおしりの部分を入力期とか充電期などと呼んでいます。また、S字の胴から頭にかけてを出力期とか発散期などと呼んでいます。言い訳がましいですが、僕はこの半年間、充電期にあったわけです。たくさんの情報を入力しました。さらなる情報を入力するには、何かアウトプットしなくてはなりません。というわけで今年はいろいろな情報をアウトプットしたいと思います。

(こうして無駄に自分にプレッシャーをかけて筆をおくのであった)

ちなみに、今後のアウトプットは次のような内容になります。Emacsの情報は少なくなるかもしれません(もともと少ないだろ)。

auto-complete v1.3をリリースしました

auto-complete v1.3をリリースしました。

http://cx4a.org/software/auto-complete/

主張するほどの新機能はありません。現状に不満がなければアップグレードしなくてもいいかもしれません。

なお詳しい変更点は以下のURLにあります。

http://cx4a.org/software/auto-complete/changes.html#Changes_v1.3

ここに書くべき変更点は以下のようになります。

単語収集速度の改善

初回補完時に、補完対象となる単語を全てのバッファから収集しますが、この処理にパフォーマンス上の問題があったので修正しました。文字入力中に待たされるというのがなくなると思います。

ac-use-menu-map

ac-use-menu-mapをtにしておくと、メニューー表示時のみに有効になるキーマップを利用できます。有効になるキーマップはac-menu-mapで、デフォルトでC-nにac-next、C-pにac-previousが割り当てられています。従来はM-nやM-pなどの押しにくいキーで補完候補を選択しなければなりませんでしたが、この機能を利用することでC-nとC-pで補完候補を選択できるようになります。メニューが表示されない場合は無視されるので、このキーマップが邪魔になることは少ないと思います。

ac-use-menu-mapはまだ実験的なので、デフォルトではnilになっています。

サマリ

これは情報源の作者向けの機能で、例えば関数のシグネチャを補完候補の右側に簡潔に表示するようなことができるようになりました。