2011-08-31

[Vim] SnipMateでなくneocomplcache snippet completeを使うわけ

このエントリーをはてなブックマークに追加
ネット環境がない場所にいるのでブログ記事でも書きます:)

プログラムを書くとき、同じような記述をすることは多々あると思います。
DRY原則云々という問題でなく、if-elseやwhileなどといった条件分岐
メソッドの呼び出しの記述といった話です。

ここで多くのタイピングをしなくてはいけない煩わしさが発生する人もいるでしょう。
それを解消する便利な機能でcode snippetというものがあります。

code snippetとは、誤解を恐れずものっそい簡単に説明すると、一種のテンプレートのようなものです。
(実際は単なるテンプレートよりはるかに強力ではありますが。)

例えば、ifの入力後に<Tab>を押せば、ifの後に続く構文を自動的に補完出力してくれたりします。

if    "<- ここで設定されたsnippet機能呼び出しボタンを押下
こんな感じに。

if condition
  ${0}
endif

そして必要入力場所に簡単に飛んでいくことも可能です。
(上記の例だと、conditionのあとは${0}だったり。 

code snippet自体の詳細はWebでゴロゴロ転がっているので、
概要を深く知りたい方はググってくださいまし。 

code snippet機能を有するエディタ・IDEはいくつもありますが、
VimのPluginではSnipMateが有名でした。
今でも使用している人はたくさんいるでしょう。


ところが最近ではneocomplcache同梱のsnippet completeを使っている、
もしくはSnipMateから移行しているVimmerが多くいます。
 実際にsnipmate neocomplcacheでググッてみると、
いくつか移行してみた・移行してみたい方が多いですね。

  Google検索: snipmate neocomplcache


前置きが長くなりましたが、なぜみんな移行しているのか。
使ってない人・導入を検討している人には何が違うのかハテナですね。
自分が移行した理由を書こうと思います。


snipMateはもちろん便利ですが、
難点のひとつに、補完出力名(以下snippet名)」を覚えておかなくてはいけません。

if else 構文を打つなら ifelse」 といった感じに打たないとsnippetは機能しないでしょう。
単純なsnippet名ならいざしらず、組み込み関数のsnippet名や独自snippet名を
全て覚えることは至難の業でしょう。
(っとゆーかそんなまどろっこしいことしてたらきっとsnippet嫌になります。

neocomplcache(+snippet complete)でこれを解決する手段として、
ネオコンのメイン機能である自動補完が便利です。

snippet名があやふやでも途中まで入力すれば補完出力候補にsnippet候補も出てくれます。
(let g:neocomplcache_enable_at_startup = 1 をvimrcに記述する必要あり)

候補名には<Snip>と書かれてsnippet候補だということが一目瞭然ですね。



そしてもう一つの強力なアプローチとして、unite.vim連携 があります。
neocomplcache snippetにはunite sourceも書かれていて、snippetをより活用できます。
(neocomplcache-unite-source-snippet)

コマンドラインモードで :Unite snippet  と入力してみると、
filetypeに合わせたsnippet候補一覧が現れます。
ここで候補から選択しEnter 
を押すと自動的にsnippetが展開してくれます。






Enterでなくを押すと定義されているsnippetファイルに飛び直接編集ができ、(edit)
を押すとプレビューアクションで展開されるコードを予め見ることができます。(preview)
<Tab>キーで他のunite actionを選択することも勿論できます。

:Unite snippet は予め.vimrcにマッピングしておくとより恩恵を受けられるでしょう。
imap <C-s>  <Plug>(neocomplcache_start_unite_snippet)

上記のようにマッピングしたとすると、インサートモード中に<C-s>
(Ctrl + s)を押すと
:Unite snippet と同じ動作が起きます。

またこれはunite.vim全般のお話ですが、
:Unite hogehoge  でunite sourceを開いているときにインサートモードに移り文字を入力すると、入力された文字で候補検索が抽出されます。
(最初からインサートモードでuniteを開く設定もできます)




「おりゃ自動補完は好かね! 尊敬してるエンジニアが自動補完使ってねぇから俺も使わね」
なんていかにも的なアイデンティティーをお持ちの方にもこれは有力な手段ですね。
(小バカにしてるわけではないです。自分も使う前はそうだったんでw


最近のSnipMateの動向は追ってませんが、unite連携は非常に強力です。
他Pluginを入れる際の検討材料にもなるでしょう。

neocomplecacheのhelpにはSnipMateとの併用の記述もありますが、
個人的には冗長なので、
個別でsnippetを使いたいかたはg:neocomplcache_snippets_dirで指定してもいいかもしれません。


もしcode snippetをこれから活用していきたい方・SnipMateを使ってるけどsnippet名を
覚えきれなくて以前の僕と同じ煩わしさを抱えてる方がいたら、
これを機にunite.vim, neocomplcache + snippet completeを導入してみてはいかがでしょうか。






追記(2011/09/04):

  SnipMateも今は補完機能を有しているようですが、neocomplcacheと競合するようです。
  http://lingr.com/room/vim/archives#message-4683789

NOTE:


0 件のコメント:

コメントを投稿