Hatena::ブログ(Diary)

C++でゲームプログラミング

2013-03-07

[]unite.vim について語る

この記事は Vim Advent Calendar 2012 97日目の記事になります。

記念すべき 100日目まであとすこし!!って事で今回は unite.vim について書いてみました。


unite.vim とはなんぞや。

という人は結構いると思うので主観バリバリですが unite.vim について説明してみたいと思います。

また untie.vim に関しては 92日目に syui さんも記事を書いているのでそちらも合わせて読んでみるといいと思います。



[unite.vim とは]

unite.vim とは Shougo 氏が作成された Vim プラグインです。

そもそも 「unite.vim とはなんぞや」という話ですが、一言で言ってしまえば

Vim 上で使用出来る統合ユーザインターフェース

になります。

もっと噛み砕いて言えば、


絞り込みやファイルの開き方を指定できるすごい quickfix


というとわかりやすいかも知れません。


unite.vim を使用することによって様々なデータを『unite』という統合されたインターフェースで操作することが出来ます。

よく目にする unite-buffer や unite-file みたいな unite-○○○は unite.vim で buffer や file、○○○を操作する、というイメージを持ってもらうとわかりやすいかと思います。


これにより他のプラグインを作成する場合、unite-source と呼ばれる unite.vim の拡張プラグインを提供すれば unite という統合されたインターフェースでそのプラグインの操作を行うことが出来ます。

ユーザ側は unite.vim の操作方法さえ理解していれば簡単にプラグインを扱うことができ、またプラグイン側もインターフェースを提供する手間を省く事が出来ます。


ともあれ、文章だけではちょっと想像しづらいと思うので実際に使ってみましょう。

ちなみに unite は「ゆないと」と読みます。「うにーと」ではありません。ありません。


[インストール]

unite.vimgithub で公開されておりそこから取得する事が出来ます。



Vimプラグインを使用する場合、いくつか手段があります。

git が導入されていれば、neobundle.vim を使用するのがいいと思います。

neobundle.vim でのプラグインの導入方法は下記を参照してみて下さい。



他には vim-pathogen が git が必要なく、比較的簡単にしようできるかと思います。



[使ってみる]

unite.vim は :Unite コマンドに unite-source 名(buffer や file 等)を渡して起動します。

unite-source とは unite-buffer や unite-file などの事を指します。

試しに unite-file を使用してみたいと思います。


:Unite file

を実行するとカレントディレクトリのファイルとディレクトリの一覧を出力します。

この時に insert モードに入ることで候補の絞り込みを行うテキストを入力する事が出来ます。

そして候補を選択し実行(<CR>)するとそのファイルを開きます。


f:id:osyo-manga:20130307101222g:image


これが unite.vim の基本的な動作になります。

大まかな流れは

  1. :Unite {source 名} で unite を起動する
  2. 必要であれば絞り込みを行う
  3. 目的の候補を選択し、実行する

というような感じです。

他にも :Unite buffer でバッファの一覧を出力したり、:Unite file_mru で最近開いたファイルの一覧を出力したり出来ます。

unite.vim で使用する事ができる unite-source の一覧は、

:Unite source

で unite.vim に出力されます。

選択すればその unite-source を実行するのでいくつか試してみるといいと思います。

現在 unite.vimデフォルトで組み込んでいる unite-source は以下になります。


[unite.vim が定義している unite-source 一覧]

source 名内容
fileカレントディレクトリのファイルとディレクトリ一覧
file/newファイルの新規作成
file_mru最近開いたファイルの一覧
file_recカレントディレクトリの全てのファイルの一覧
file_rec/asyncfile_rec の非同期処理版
directoryカレントディレクトリディレクトリ一覧
directory/newディレクトリの新規作成
directory_mru最近開いたディレクトリの一覧
buffer開かれているバッファの一覧
buffer_tab現在のタブで開かれたバッファの一覧
tabタブの一覧
registerレジスタの一覧
bookmarkブックマークの一覧
sourceunite-source の一覧
window現在のタブのウィンドウの一覧
outputVim のコマンドの出力結果を出力する(e.g. :mes)
command定義されているコマンドの一覧
functionVim の組み込み関数と unite.vimneocomplcache で定義されている関数の一覧
mapping定義されているキーマッピングの一覧
grep外部コマンド "grep" の結果を出力
vimgrep:vimgrep の結果を出力
find外部コマンド "find" の結果を出力
line現在のバッファの行を出力
line/fast10000行以上のバッファ時に使用する line
jump:jump の結果の出力
change:change の結果を出力
jump_pointfile:line に一致するデータを出力
file_pointファイル名か URI に一致するデータを出力する
launcher$PATH にある実行ファイルの一覧
aliasg:unite_source_alias_aliases の一覧
menug:unite_source_menu_menus に登録されてあるメニューの一覧
history/yankヤンクされたワードの一覧
process起動しているプロセスの一覧
runtimepathruntimepath に追加されているパスの一覧

詳しくは、

:help unite-source-file

を参照して下さい。


上記以外にも様々なユーザが独自に unite-source を作成し、プラグインとして提供しています。

unite.vim の組み込み以外の unite-source に関しては下記のサイトが参考になると思います。



[アクションについて理解する]

unite.vim の強力な機能の一つに『アクション』という概念があります。

これは『選択している候補に対してどのような処理を行うか』というものになります。


先ほど紹介した unite-file では『ファイルを開く』がアクションに該当します。

試しに unite-file を起動して、候補を選択し、<Tab> を押すとアクションの一覧が出力されます。

これは Windows でいうところの右クリックメニューのようなイメージをしてもらうとわかりやすいかと思います。

この一覧にあるアクションを実行すると選択している候補に対してその処理が行われます。


f:id:osyo-manga:20130307101223p:image


例えば『新しいタブでファイルを開きたい』のであれば『tabopen』を選択することでそれを実現する事が出来ます。

また :Unite コマンドにオプションを渡すことで候補を実行した時のデフォルトのアクションを設定することも出来ます。


" 候補を実行したら新しいタブでファイルを開きたい
:Unite file -default-action=tabopen

このように unite.vim では『選択した候補』に対して『どのような処理を行うのか』を柔軟に処理する事が出来ます。

これさえ覚えてしまえばある程度は unite.vim を使いこなすことが出来ると思います。

また、:Unite のコマンドオプションは色々と用意されているのでひと通り目を通しておくといいと思います。


:help unite-options

[実際に unite.vim を活用してみる]

ここまでは unite.vim について説明して来ました。

次に具体的にどんな時に使用すると便利なのか、についていくつか例を上げてみたいと思います。


[最近開いたファイルを開く]

Vim の起動後に『前回編集していたファイルを開きたい』と思うことがあると思います。

その場合は unite-file_mru を使用する事で『最近開いたファイルの一覧』を unite.vim へ出力することが出来ます。


:Unite file_mru

これだけでも便利なのですが、次のように Vim の起動時に -C オプションを設定することで Vim を起動した直後に自動的に『最近開いたファイル』の一覧を出力する事が出来ます。


$ gvim.exe  -c ":Unite file_mru"

これでスムーズにファイルの編集を再開することができます。


[Vim コマンドの結果を unite.vim へ出力する]

例えば :message や :version といったコマンドの結果を参照したい場合があるかと思います。

直接コマンドを呼び出してもいいのですが unite-output を使用することでコマンドの実行結果を unite.vim へと出力することが出来ます。


" 指定したコマンドの実行結果を unite.vim へ出力する
" :Unite output:{コマンド名}

" :message の結果を unite.vim へ出力
:Unite output:message

" :version の結果を unite.vim へ出力
:Unite output:version

f:id:osyo-manga:20130307101224p:image


[定義されているキーマッピングを調べる]

unite-mapping は設定されているキーマッピングの一覧を出力します。

これを利用して特定のキーを使用しているキーマッピングを絞り込んで確認したりする事が出来ます。


f:id:osyo-manga:20130307101225p:image


また、unite-mapping では normal のマッピングしか出力しませんが、次のように unite-output を使用することで全てのマッピングを出力することが出来ます。


:Unite output:map|map!|lmap

f:id:osyo-manga:20130307101230p:image


unite-output の汎用性が高いことが分かりますね。


[unite-line でバッファ内を検索する]

unite-line を利用してバッファ内のワードを検索する事が出来ます。

unite.vim の help では次のようなマッピングが例として上げれられています。


nnoremap <silent> / :<C-u>Unite -buffer-name=search line/fast -start-insert -no-quit<CR>

上記の設定は unite-line/fast を利用した検索のキーマッピングになります。

上記の設定では / で unite-line/fast が起動し、即絞り込みの入力になります。

また、候補を選択しても unite.vim が閉じずにカーソルが候補の位置へとジャンプします。

unite.vim ではこういった挙動も制御する事ができます。


f:id:osyo-manga:20130307101226p:image


[よく使うコマンドの一覧をつくる]

g:unite_source_menu_menus に予めコマンドのリストを登録しておけば、unite-menu からそのコマンドの一覧を出力し、実行する事が出来ます。

よく使用するコマンドやファイルなどを登録しておけばスマートに呼び出し実行することが出来ます。


" 例
let g:unite_source_menu_menus = {
\   "shortcut" : {
\       "description" : "sample unite-menu",
\       "command_candidates" : [
\           ["edit vimrc", "edit $MYVIMRC"],
\           ["edit gvimrc", "edit $MYGVIMRC"],
\           ["unite-file_mru", "Unite file_mru"],
\           ["Unite Beautiful Attack", "Unite -auto-preview colorscheme"],
\           ["unite-output:message", "Unite output:message"],
\       ],
\   },
\}

" 呼び出しコマンド
" :Unite menu:shortcut

f:id:osyo-manga:20130307101227p:image


[grep する]

unite-grep や unite-vimgrep を使用する事で grep した結果が unite.vim へと出力されます。

vimgrep は quickfix へと出力されますが、quickfix と比べて unite.vim へと出力する事で次のような利点があります。


  • 検索結果を絞込みできる
  • ファイルの開き方を指定できる
  • 自動プレビューできる

unite.vim だと痒いところに手が届きますね。


[選択したファイルを grep する]

grep はアクションとしても用意されており、選択している候補、もしくは <Space> で選択した範囲を対象として grep する事が出来ます。

例えば、unite-file_mru と grep アクションを組み合わせれば『最近開いたファイルで grep する』というようなことが簡単に行うことが出来ます。

こういう風な自由な組み合わせが出来るところも unite.vim の利点ですね。


[FizzBuzz の出力]

unite-output の応用として次のようなコマンドで FizzBuzz の結果を unite.vim へと出力する事ができます。


:Unite output:for\ i\ in\ range(1,1000)|echo\ i.'\:'.(i%15==0?"FizzBuzz"\:i%3==0?"Fizz"\:i%5==0?"Buzz"\:i)|endfor

f:id:osyo-manga:20130307101228p:image



unite-output 超便利ですね!!


[colorscheme をプレビューしながら確認する]

unite-colorscheme を使用する事で unite.vim で colorscheme を設定することが出来ます。

unite-colorscheme は unite.vim の組み込み source ではないので別途導入する必要があります。

導入方法は普通のプラグインと変わりありません。



これは次のようなコマンドオプションを追加する事でプレビューしながら colorscheme を設定する事が出来ます。


:Unite colorscheme -auto-preview

f:id:osyo-manga:20130307101229g:image


これが俗にいうユナイトビューティフルアタック!!になります。

乱用すると目がやられるので注意して下さい。


[まとめ]

全ての操作は unite.vim というインターフェースに乗っかっています。

例えばプラグインを管理するプラグインであればプラグインの一覧を、メモを管理するプラグインであればメモの一覧を unite.vim へと出力すれば統一された操作でプラグインを使用することが出来ます。

これは様々なデータを扱う上でとても大きな利点だと思います。


と、いう感じで簡単にですが unite.vim について書いてみました。

これで unite.vim の良さについて少しでも分かってもらえればいいと思います。

また unite.vim はとても拡張しやすいつくりになっておりユーザ側で独自に unite-source やアクションなどを定義することが出来ます。

何か unite.vim で操作したいような動作が出てきた場合は自分で unite-source を作成してみるのもいいかと思います。

他にも何か書きたいことがあった気がしますがそろそろ限界なのでこの辺で止めておきます。


[おまけ]

unite.vimバッファで使用出来るキーマッピングの表になります。

書く場所がなかったので最後に貼っておきます。


normal モード

キー動作
i絞り込みのテキストを入力する
I絞り込みのテキストを入力する
a候補が選択されていればアクションの一覧を表示する
されていなければ絞り込みのテキストを入力する
A絞り込みのテキストを入力する
qunite を閉じる
Qunite を全て閉じる
<C-r>unite を再起動する
<Space>候補のマーク、解除する
*全部の候補を選択する
M全部の候補を表示するかしないかのトグル
<Tab>カーソル下の候補に対するアクションを選択、実行する
<C-n>(help みてもよく分からなかった…)
<C-p>(help みてもよく分からなかった…)
<C-g>カーソル下の候補の情報をコマンドラインに出力する
<C-l>unite を再描画する
<C-h>絞り込みのテキストを削除する
ggバッファの先頭へ移動
Gバッファの末尾へ移動
j下へ移動
<Down>下へ移動
k上へ移動
<Up>上へ移動
J(help みてもよく分からなかった…)
K(help みてもよく分からなかった…)
?unite のマッピングを出力
<CR>選択されている候補に対して default アクションを実行する
d候補が選択されていれば delete アクションを実行する
e候補が選択されていれば narrow アクションを実行する
t候補が選択されていれば tabopen アクションを実行する
x候補が選択されていれば候補へのジャンプし、default 実行する
.絞り込みに . を設定する

insert モード

キー動作
<Esc>テキストの挿入を抜ける
<Tab>アクションの一覧を表示する
<C-n>下へ移動
<Down>下へ移動
<C-p>上へ移動
<Up>上へ移動
<C-f>次の頁を移動する
<C-b>前の頁を移動する
<CR>選択されている候補に対して default アクションを実行する
<C-h>絞り込みのテキストを1文字削除する
<BS>絞り込みのテキストを1文字削除する
<C-u>絞り込みのテキストを全て字削除する
<C-w>絞り込みのテキストの単語を削除する
<C-a>先頭へ移動する
<Home>先頭へ移動する
<C-l>unite を再描画する
<C-g>unite を閉じる
d候補が選択されていれば delete アクションを実行する
b候補が選択されていれば bookmark アクションを実行する
e候補が選択されていれば narrow アクションを実行する
t候補が選択されていれば tabopen アクションを実行する
yy候補が選択されていれば yank アクションを実行する
p選択されている候補に対して preview アクションを実行する
<Space>候補のマーク、解除する
x候補へのジャンプし、default アクション実行する

visual モード

キー動作
<Space>選択されている候補のマークを指定、解除する

[おまけ2]

unite.vim の簡単な動作説明をキャプチャしてみました。

説明入れながらキャプチャするのがかなり大変ですね…。

むずい


D