Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

Vimを変態にしてみた

このエントリは、変態アドベントカレンダー2012の4日目です。一日目は@backpaper0さんの「ノムリッシュJavaで厨二プログラミング」でした。

いよいよ12月になりアドベントカレンダーシーズンに入りましたが、みなさんブログ書いてますか?
まだアドベントカレンダーに参加していない方は、是非参加しましょう。
自分の持ってる暗黙的なノウハウを外化する絶好の機会です。

とはいえ、ブログ記事を書くのって結構大変ですよね。
しかし、我々ITエンジニアは日々ソースコードを書きまくっている経験から、「記述を効率化する術」を持っているはずです。
そう、コード補完です!
今回は、協力な補完機能を提供してくれるvimプラグインのNeoCompleCacheとNeoSnippetを紹介しつつ、さらに変態アドベントカレンダー向けに補完設定を作ってみます。
Vimmerな変態の方も、変態なVimmerの方も、Vimmerでない変態の方も、ぜひご活用ください。

下準備

NeoCompleCacheとNeoSnippetはプレフィクスにNeoとついている事からわかるように、どちらもShougoさんによるVimプラグインです。
非常に強力な補完機能でvimによる作業を支援してくれます。
もともとはNeoCompleCacheだけだったのですが、バージョンを重ねるごとに機能が追加されていき、NeoCompleCacheのバージョン7からそれぞれ別のPluginに分割されました。
国産プラグインなので日本語のインストール手順はそろっているだろうと思ったら、あらまぁ無いじゃないですか!しかも、NeoCompleCacheとNeoSnippetでGitHubに書いてあるインストール手順がズレてる。もういっそ全部まとめてまるっと手順を書いちゃいます。

プラグインの取得

とりあえず、NeoSnippet公式のインストール方法に従って、NeoBundleをインストールして、NeoBundle経由でNeoCompleCacheとNeoSnippetをインストールします。
NeoBundleのインストール方法については、こちらにまとめました。

で、NeoBundleがインストールできてさえしまえば後は簡単です。
.vimrcに以下を追記して、

NeoBundle 'Shougo/neocomplcache.git'
NeoBundle 'Shougo/neosnippet.git'

vimを立ち上げて次のコマンドを実行するだけ

:NeoBundleInstall

これで、NeoCompleCacheとNeoSnippetがインストールできます。
お手軽ですね。

設定

インストールできたら、それぞれの設定です。
次の内容を.vimrcに追記したらOKです。
本当はいろいろ設定できるのですが、とりあえず最低限の設定だけ。

"--------------------------------------------------------------------------
" neocomplcache
let g:neocomplcache_enable_at_startup = 1

" Enable omni completion. Not required if they are already set elsewhere in .vimrc
autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
"--------------------------------------------------------------------------
" neosnippet

" Plugin key-mappings.
imap <C-k>     <Plug>(neosnippet_expand_or_jump)
smap <C-k>     <Plug>(neosnippet_expand_or_jump)

" SuperTab like snippets behavior.
imap <expr><TAB> neosnippet#expandable() ? "\<Plug>(neosnippet_expand_or_jump)" : pumvisible() ? "\<C-n>" : "\<TAB>"
smap <expr><TAB> neosnippet#expandable() ? "\<Plug>(neosnippet_expand_or_jump)" : "\<TAB>"

" For snippet_complete marker.
if has('conceal')
  set conceallevel=2 concealcursor=i
endif

いよいよvimを変態にする

VimにHentaiファイルタイプを認識させる

では、ブログ記事作成を便利にするsnipet作成に入りましょう。
今回は、textファイルを補完するために、.txtの拡張子のファイルをhentaiファイルタイプとして扱います。

ファイルタイプをvimに登録するには、.vim以下にftdetectフォルダを作り、そこにファイルタイプ判別のvimスクリプトを追加します。
今回は、下記のファイルを追加しました。

これで、vimは.txtを拡張子に持つファイルを開いたときにファイルタイプをhentaiファイルタイプとして認識してくれます。

vimにHentai辞書を追加する

NeoCompleCacheは、ユーザ定義の辞書ファイルを追加する事ができ、追加した辞書ファイルを元に単語補完を行う事が出来ます。
今回は、適当に変態アドベントカレンダーに登場しそうな単語と変態アドベントカレンダー参加者の名前を登録したhentai.dictを作りました。
辞書ファイルのパスは自由に設定出来るので、今回はとりあえず.vim以下にdictフォルダを作成し、その中に保存しました。

僕がatndから抜き出すタイミングで名前が載ってない人がいるかもしれません。
別に、変態認定してないわけではないです。

この変態辞書を NeoCompleCache に読み込ませるために.vimrcに下記を追記します。

"辞書の登録
let g:neocomplcache_dictionary_filetype_lists = {
  \ 'default' : '',
  \ 'hentai' : $HOME.'/.vim/dict/hentai.dict',
  \ }

これでvimを起動すると、変態辞書による補完が有効になります。
hを入力して+n を押すと、入力候補が表示されます。

vimに変態Snippetを登録する

さらに、vimを変態アドベントカレンダー向けにカスタマイズしていきましょう。
NeoSnippet を利用する事で、スニペット補完が出来るようになります。
スニペット補完とは、よく書く定型文のひな形を用意しておいて、その一部だけを書き換える事で記述効率をあげる補完手法です。
Snippetについてはこちらの記事が詳しいです。
Vimのsnippetについてあまり知らなかったので設定してみたら便利過ぎてつらい

今回は、変態アドベントカレンダーのテンプレートを登録するために、hentai.snipファイルを作成します。

.vimフォルダ以下にsnippetsフォルダを作って、このhentai.snipファイルを保存します。
このファイルを読み込むための.vimrcの設定はこちら

" スニペットファイルの保存ディレクトリのパスを登録
let g:neosnippet#snippets_directory='~/.vim/bundle/snipmate-snippets/snippets'

これで、変態アドベントカレンダーのひな形が登録出来ました。
haと入力して+kを打ち込むと、記事のひな形が出来上がります。

更に、で入力が必要な箇所に移動して書き換える事が出来ます。

まとめ

これで変態アドベントカレンダーの記事作成が大幅に効率化されました。
もちろん、この設定は工夫次第で普段のコーディングにも適用出来ます。
みなさんも、NeoCompleCacheとNeoSnippetを用いてより快適なvimライフを送ってください。
今回作成した、hentai.vim、hentai.dict、hentai.snipについてはgistに挙げているのでよろしければ参考にしてください。

Gist - vimを変態にするための設定ファイル群

明日ははがねのつるぎさんです。