vimで範囲指定できるコマンドを定義する方法
タグ: vim / 初版公開: 2014-03-19

vimで範囲指定できるコマンドを定義するには以下のようにする。

" 範囲を受け取る関数の定義
function! PrintRange() range
    echo "firstline: " . a:firstline
    echo "lastline: " . a:lastline
endfunction

" 範囲指定できるコマンドの定義
command! -range PrintRange <line1>,<line2>call PrintRange()

この例では、範囲の最初の行と最後の行を出力する関数PrintRange()と、その関数を実行するコマンドPrintRangeを定義している。

ポイントは3つある。

1つ目は呼び出し先の関数にrange指定をつけること。これにより、関数から選択範囲の先頭と末尾の行数を格納した変数a:firstlinea:lastlineにアクセスできるようになる。また、この関数は:1,10call PrintRange()の形で範囲指定して呼び出した際に、範囲全体に対して1度だけ実行されるようになる。

2つ目はcommand!に属性-rangeを付加すること。これにより、このコマンドは範囲指定して実行できるようになる。もしこの指定がないと、コマンドは範囲指定して実行した場合、no range allowedで失敗してしまう。

3つ目はcommand!<line1>,<line2>callで関数を呼び出すこと。<line1><line2>はそれぞれ範囲の最初の行、最後の行に置き換えられる。結果として、この呼び出し方によって、コマンドに渡された範囲を関数に受け渡すことができる。