[Vim] Vim scriptの基本構文


はじめに

Vimのプラグインは使っているけど、自分ではプラグインを作ったことがないという方は意外と多いのではないかと思います。
Vim scriptを使えばプラグインを作れたり、作業を効率化するような便利な設定を書くことも可能です。
今更感もありますが、これをきっかけにどなたかが興味を持たれるかもしれませんのでかなりざっくりと紹介したいと思います。

変数

変数名にはアルファベット、数字、アンダースコアが使えます。
他の言語でもあるように、変数名を数字で開始することはできません。
letコマンドで変数の定義、代入。unletコマンドで変数の破棄を行います。

" 変数の定義、代入
let 変数名 = 式
" 変数の破棄
unlet 変数名 = 式

ex)
let sample = "sample"
unlet sample

変数に関しては、helpのusr_41を参照してください。
Vim scriptにもスコープが存在します。上記の例のようにスコープ指定をしない場合はグローバルとして扱われます。
l:sample, s:sampleとすることでスコープをしていすることができます。
スコープに関しては、internal-variablesを参照してください。
Vimの予約語も存在しますので、vim-variableでチェックしてみてください。

リストと辞書

index型の配列とkey:value型の配列も当然存在します。

" リスト
let sample_list = ['one', 'two', 'three']

" 辞書
let sample_dict = {'one': '1', 'two': '2', 'three': '3'}

sample_dict['two']とかすればアクセスできます。

他の言語と同様にVim scriptにも高機能な式が存在します。
ここでは書きませんが、expression-syntaxの内容が参考になると思います。

if文

条件文はこんな感じです。

if 式
    ...
elseif 式
    ...
else
    ...
endif

他の言語と同様に演算子を用いて式を書きます。==や!=の他にも沢山ありますので、
expr4で確認してみてください。

ループ

while文、for文ともに健在です。

while 条件式
    ...
endwhile
" list分ループ
let alist = ['one', 'two', 'three']
for n in alist
    ...
endfor


" listを作成してループ
for a in range(3)
    ...
endfor

スキップしたりループを抜けたりする処理もcontinuebreakで出来ます。

関数定義

Vim scriptで関数を定義するには下記のように書きます。

function! Min(num1, num2)

    " a:xxxで引数にアクセスする
    if a:num1 < a:num2
        let smaller = a:num1
    else
        let smaller = a:num2
    endif
    return smaller

endfunction

また function Min(num1, num2)でも定義できますが、同名の関数名が既に定義済みだとエラーになるので、!をつけたほうが良いでしょう。

他にも可変長引数で定義できたりもするので詳しくは関数を定義するをご覧ください。

組み込み関数

関数一覧参照
いっぱいあります。

関数を使う

定義した関数や組み込み関数は下記のようにしてcallします

let line = getline(".")
let repl = substitute(line, '\a', "*", "g")
call setline(".", repl)

voidとかであればcallを使うと良いのではないでしょうか?

例外

try
    ...
catch
    ...
endtry

詳しくはexception-handling参照

自作コマンド

Vimでは自作コマンドを定義することができます。
定義したコマンドはコマンドラインモードの他のコマンドと同じように使えます。

" 大文字で定義。commandも!をつけた方がいいよ!
command! Greet echo 'Hello'

上記のように書くとGreetコマンドが定義できます。

command! Greet call s:greet()

function! s:greet()
    echo 'Hello'
endfunction

関数を使って定義することもできます。
詳しくはコマンドラインコマンドを定義する参照

自動コマンド

javascriptのようにあるイベント時にコマンドを自動で実行することもできます。
自動コマンドとかautoコマンドとか言います。
自動コマンドとイベントに関しては自動コマンドページを参照してください。

その他

Vim8を使っているかどうかはわかりませんが、Vim8では色々な機能が追加されていますしvimscriptも拡張されていますので、確認すると面白いと思います。
http://vim-jp.org/vimdoc-ja/version8.html

おわりに

駆け足で紹介してきましたこれを機にどなたかが作成したプラグインを読んでみるのもいいかもしれませんね。
折角Vimを愛用しているのでしたらVim scriptを覚えてVimへの愛情を深めましょう。