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
とりあえず今回はここら辺で一旦切ります。
ではー!