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:firstlineとa:lastlineにアクセスできるようになる。また、この関数は:1,10call PrintRange()の形で範囲指定して呼び出した際に、範囲全体に対して1度だけ実行されるようになる。
2つ目はcommand!に属性-rangeを付加すること。これにより、このコマンドは範囲指定して実行できるようになる。もしこの指定がないと、コマンドは範囲指定して実行した場合、no range allowedで失敗してしまう。
3つ目はcommand!で<line1>,<line2>callで関数を呼び出すこと。<line1>と<line2>はそれぞれ範囲の最初の行、最後の行に置き換えられる。結果として、この呼び出し方によって、コマンドに渡された範囲を関数に受け渡すことができる。
