vim script ことはじめ#2

前回に引き続き vim script になります :)

vim script ことはじめ#1
http://blog.tnker.com/101

リストと辞書

JavaScriptでいう配列とオブジェクトみたいなものですね。

リスト

リストの定義はよくある配列リテラル

let arr = ["hoge", "fuga", "fugo"]

追加とかは

call add(arr, "tanaka")
echo arr " 実行結果 -> ["hoge", "fuga", "fugo", "tanaka"]

拡張関数もあるみたい

call extend(arr, [0, 1])
echo arr " 実行結果 -> ["hoge", "fuga", "fugo", "tanaka", 0, 1]

同じようなことを add で行った場合は結果が異なるので注意

call add(arr, [0, 1])
echo arr " 実行結果 -> ["hoge", "fuga", "fugo", "tanaka", [0, 1]]

拡張は + 演算子でもOK

echo arr + [0, 1]
echo arr " 実行結果 -> ["hoge", "fuga", "fugo", "tanaka", 0, 1]

リストの for

リストを用いた for 文もよくある形

for n in arr
    echo n
endfor
" 実行結果
hoge
fuga
fugo
0
1

辞書

こちらもよくある定義の形

let object = {"one": 1, "two": 2, "three": 3}

定義した辞書のキーにアクセスするには

echo object["one"] " 実行結果 -> 1
echo object.one    " 実行結果 -> 1

辞書の for

for n in keys(object)
    echo object[n]
endfor
" 実行結果
1
2
3

関数定義と辞書への代入を同時に行う

function object.trace(line) dict
    return join(map(split(a:line), 'get(self, v:val, "???")'))
endfunction

だんだん呪文みたくなってきました・・・

まず関数定義の後ろに dict と書いていますが、これはこの関数が辞書から実行されることを明示的に示すものになり、関数内で利用されている self 変数が辞書のスコープになるようです。

実際に return 部分でやっている処理は

  • split(a:line)
    • 引数で渡した文字列をリストに分割する
      • このリストが次で説明する map 関数の第1引数になる
  • map(split(a:line), 'get(self, v:val, "???")')
    • map は第1引数のリスト要素をイテレートし第2引数に設定している処理を行うものになります
    • 第2引数に設定している get は、辞書から指定したプロパティの値を取り出す処理です(指定したプロパティが存在しなかった場合に返す値として第3引数にデフォルト値を設定できます)
      • 今回で言うと "???" がデフォルト値になります

実行例

次のような形で定義した状態で

let object = {"one": 1, "two": 2, "three": 3}

function object.trace(line) dict
    return join(map(split(a:line), 'get(self, v:val, "???")'))
endfunction

次のように実行すると

echo object.trace("one two five three six")

下記のような実行結果になると思います

1 2 ??? 3 ???

このように存在するプロパティであれば値を返し、存在しなければデフォルト値として ??? を返してくれます


例外処理

特に変わった感じのものは無いです。
普通に try catch fainally かけます。

try
    " 何らかの処理
catch
    echo "Errorでっす"
finally
    " お掃除処理
endtry

とりあえず今回はここら辺で一旦切ります。
ではー!