2012、264日目の記事になります。本日は、automatic.vimというプラグインを使って、Vimにおける「ウィンドウの一時的分割」をハンドリングする方法をお伝えします。automatic.vimとは私が「popwin.el」のVim版欲しいなーとつぶやいたらおしょーさんが作ってくれたプラグインです。automatic.vimは、ウィンドウの状態変化をフックとして人気の処理を実行するための、薄いライブラリです。ここでいう「ウィンドウ」とは、Vim用語のウィンドウです。Vimの画面が二分割されている場合、Vimにはウィンドウが2つ存在する状態となります。指定したウィンドウに対して任意の設定を行うプラグインをつくった」をご覧ください。今回の記事では、automatic.vimを用いて、「ウィンドウの一時的分割」をハンドリングするノウハウをお伝えします。ウィンドウの「一時的分割」とはこの記事における「一時的分割」のウィンドウとは、「何らかの操作のために分割したが、その目的が終わったらすぐ閉じるウィンドウ」を指します。以下の様なシーンにおける分割ウィンドウは、一時的分割のウィンドウです。-toggleで閉じるVimShellの分割ウィンドウq:で開き、コマンド実行後自動で閉じるCmdWinの分割ウィンドウ逆に、以下の様なシーンにおける分割は、一時的分割ではありません:spもしくは:vspし画面を分割し、二つのファイルのソースコードを見比べているautomatic.vimによってできることautomatic.vimを使用することで、これらの一時的分割ウィンドウの出現位置やサイズなどを、一元化して管理することができます。automatic.vimにはapplyという仕組みがあり、任意の関数をこれらのウィンドウにおいて実行させることができ、これを活用することで一時的ウィンドウに共通したキーバインドや設定を定義することが可能となります。]g:automatic_default_set_configのheightやmogeはそのまんま、位置とサイズの指定です。これによって、特に個別指定しない場合に関しては、高さがVim全体の60%、位置が下で分割が行われるようになります。QuickRunウィンドウはもう少し小さめで表示したいので、個別設定で8行分の高さとなるように設定、特殊なウィンドウであるCmdWinは、リサイズや移動ができず、行おうとするとエラーが発生してしまうため、unsettingsオプションでmoveとresize(heightおよびwidthに該当)のデフォルト設定を無効化しています。ここまではautomatic.vimのヘルプにも記載されている一般的な設定なのですが、キモはapplyオプションで指定しているs:my_temporary_window_init関数になります。この関数は、該当バッファ内のみで有効なマッピングとして、「ノーマルモードにおけるC-[で:qを実行する」というものを定義するというものです。この関数を適用することで、一時的分割のウィンドウは、どのような状態からでもC-[を連打すれば閉じることができ、分割状態からニュートラルなウィンドウ分割状態へと戻ることが出来る様になります。Emacsの「とりあえず困ったらC-g連打」の様な操作感です。この設定は地味なものの、かなり強力です。私はもうautomatic.vimなしのVimは使えなくなってしまいました。みなさんも、ぜひお試しください。おまけなぜわざわざ<Plug>(quit)を定義しているんだ?と思われる方もいると思いますので解説しておきます。私は:をq:iにマッピングしており、:を打鍵するとCmdWinが開くような設定をしています。:<C-u>q<CR>といったマッピングを行うと、実際はq:i<C-u>q<CR>と入力した際と同じ様な動作になってしまいます。いった場合、この様にマッピングを経由させて本来の:を入力するというテクニックが使えます。はてブに追加この記事をツイートFeedlyで購読supermomongaかなりすごいことでゆうめい。したまちでしらぬものはいない。),;’EmacsユーザーがVimを1ヶ月使った感想RubyでGUIアプリを作るならJRuby+JavaFX+Rawrで決まり!ももんが流NeoBundle管理術Vimと対話せよVimShellが動的プロンプトに対応しました(やばい)ジャズだって聴ける。X(1)homebrew(1)rbenv(1)Evil(1)Mechanize(1)Scraping(1)聴いてるやつ。