反省はしても後悔はしない

Vim とか備忘録とか。それと関数型言語勉強中

あなたの知らない Vim ~ デフォルトの ftplugin 達 ~

この記事は Vim Advent Calendar 2012 の 214 日目の記事です。 昨日は id:manga_osyo さんの Vim で Web ページを :source する でした。

Vim では何も設定せずとも様々なプログラミング言語のためのシンタックスがはじめから提供されています。マニアックなプログラミング言語を編集しようとしていきなりシンタックスで色付けがされてたりするので驚きです。

実は、Vim にはシンタックスだけでなくプラグインみたいなものも言語別にあります。それが ftplugin です。言語によってコメントの仕方やコンパイルエラーの解析*1だけのものからマッピングやコマンドなどの機能まで提供されているものまであります。しかし、これらは help に書かれておらず調べるには自分でソースを読まないといけないのでなかなか知られていないのが現状です。

そこで、今回はこの知られざる ftplugin の世界を紹介したいと思います。

いざ旅立とう 知られざる ftplugin の世界へ

面倒なプラグインのインストールや設定はほとんど不要です(基本的には)!今お使いの Vim (7.3) ですぐに動作します。

追記 filetype plugin on を vimrc に書く必要があります。完全に忘れてた。thx thincs さん。

git

Git のエディタを Vim にしているとコミットするときに Vim が立ち上がりますね。え、Git の設定をしていない?それはいけない。今すぐ設定しましょう!

git config --global core.editor vim

さて、Git の何らかの編集(commit や rebase -i とか)をするときには Vim 上ではいろいろ便利な機能がデフォルトで使えます。

コマンド 機能 備考
gf, <C-w>f など カーソル下のファイルを開ける diff 表示の時の a/hoge b/hoge みたいなのでも開ける。ちなみに、gf よりも <C-w>f とか <C-w>gf とかの方がコミットメッセージ編集用のバッファが迷子にならないのでおすすめ
K カーソル下のリビジョンで git show する rebase -i の時はカーソル下じゃなくてもOK。すごく便利。ちなみに、Vim のカレントディレクトリが全然別のところにあっても正しいパス上で実行されます
:DiffGitCached コミットされる予定のファイルの差分をプレビューウィンドウで見る コミットメッセージの編集時のみ。ちなみに、開いたプレビューウィンドウは q で閉じれるようになっている
:Pick rebase -i のあれを pick にする rebase -i の編集時のみ。マッピングを設定すると便利かもしれない。
:Squash rebase -i のあれを squash にする 同上
:Edit rebase -i のあれを edit にする 同上
:Reword rebase -i のあれを reword にする 同上
:Fixup rebase -i のあれを fixup にする 同上
:Cycle pick, squash, edit, reword, fixup を順に切り替える 同上

ちなみに、書いた人は fugitive や pathogen や rails.vim の作者の Tim Pope 氏のようです。信頼と実績の ftplugin ですね。

ruby

Ruby 界隈は Vimmer が多いと勝手なイメージを持っています。

コマンド 機能 備考
K カーソル下のキーワードを ri で調べる
キーワードの上にマウスカーソルを置く マウスカーソル位置のキーワードを ri で調べてバルーンで表示 GVim のみ。set ballooneval しておく必要があります
]m, [m 次(前)のメソッド定義(def)に移動
]M, [M 次(前)のメソッド定義の終わり(end)に移動
]], [[ 次(前)のクラス、モジュール定義(class, module)に移動
][, [] 次(前)のクラス、モジュール定義の終わり(end)に移動

ちなみに、vim-ruby というプラグインを入れている人も多いと思いますが、vim-ruby はこれらのデフォルトの ftplugin に追加で textobj とかを提供しているので vim-ruby の有無に関係なく上記のコマンドは使えます。

python

私自身は python はほとんど書けないのですがとりあえず、紹介します。 そういえば、最近 VimPython IDE 化する記事がありましたね。設定が面倒くさくてやっていない人もとりあえず、デフォルト機能くらいは覚えておくといいんじゃないでしょうか。

コマンド 機能 備考
]], [[ 次のトップレベルのクラス、メソッド定義(class, def)に移動 nnoremap しかないのでビジュアルモードでは使えません
]m, [m 次のクラス、メソッド定義(class, def)に移動 nnoremap しかないのでビジュアルモードでは使えません
gf, <C-w>f など from, import とかに書いてあるファイルを開く hoge.fuga は hoge/fuga.py みたいな感じで開かれます。ただし、あまり賢いことはしてくれないようです。

ocaml

静的型付け関数型言語です。楽しい! OCaml は割りとデフォルトでもいろんな機能があります。ちなみに、同じく静的型付け関数型言語Haskell の ftplugin には最低限の設定しかないです。

コマンド 機能 備考
<LocalLeader>s ml と mli ファイルを切り替える
<LocalLeader>S ml と mli ファイルを切り替える(分割して開く)
<LocalLeader>c コメントアウト ノーマルモードのときは行コメント、ビジュアルモードのときは複数行コメントになります
<LocalLeader>C コメントアウトを解除
(インサートモードで)ASS (assert (0=1) ( XXX )) を挿入 iabbrev なので何か他のキーを押した時に展開されます
<LocalLeader>t カーソル下の項の方を表示 annot ファイルが存在している必要があります

<LocalLeader> はデフォルトで \ になっています。let g:maplocalleader = ','などのようにすれば変更できます。

sql

突然の SQL!!! お仕事とかで書く人とかいそうですね。私は資格試験のために勉強しただけで書いたことないです...。ちなみに、ここで紹介する以外に割りと細かいオプションを設定できるようです(ソースを見る限り)。たぶんいろんな方言に対応させるためなんでしょうね。正直全然わからないので気になる人はソースを読んでみるといいと思います。

コマンド 機能 備考
]], [[ 次(前)の begin に移動
][, [] 次(前)の end に移動
]}, [{ 次(前)の create 文に移動 どの文に移動するかはg:ftplugin_sql_statementsで設定可能
]}, [{ 次(前)の create 文に移動 どの文に移動するかはg:ftplugin_sql_statementsで設定可能
]" 次のコメントの始まりに移動
[" 次のコメントの終わりに移動

おわり

割りとメジャーそうな(独断)言語の中で便利な機能が定義されているのは以上でした。もっとあるかと思ったのですが。。。 気になる方は $VIM/vim73/ftplugin 以下を探索してみてはいかがでしょうか?

明日は @supermomonga さんです。

*1:QuickFix で使います