VimScriptざっくりチュートリアル(データ型)
まずはここを読む
help eval
データ型の確認方法
let test = 1 echo type(test)
以下の6種類が数値で返ってくる
- 数値 : 0
- 文字列 : 1
- Funcref : 2 (関数リファレンス)
- リスト : 3
- 辞書 : 4
- 浮動小数点数 : 5
数値型
32bit or 64bit の符号付き整数
- 32bit なら、−2147483648 〜 2147483647
" 16進 echo 0x10 " 10進 echo 16 " 8進 echo 020
" サイズ越えの場合 -1 を返す echo 999999999999999999999999999999999999999999999999
数値演算
" 四則演算 echo (1+1)-1*10/10 " 余り echo 100%3 " 整数型の割り算は整数型を返す echo 10/3 "| -> 3 " 0 除算すると 0 を返す echo 1/0 "複合演算子は、+= と、-= だけ let test = 0 let test += 1 echo test-=1
数値⇔文字列
文字列 -> 数値
" それぞれ 16 を返す echo str2nr("0x10", 16) echo str2nr("16", 10) echo str2nr("020", 8) " 123 を返す echo str2nr("123abc", 10) " 0 を返す echo str2nr("abc123", 10)
数値 -> 文字列
echo printf("0x%x",16) | " -> "0x10" echo printf("%d",16) | " -> "16" echo printf("0%o",16) | " -> "020" echo printf("%02d",8) | " ->" "08"
文字列型
宣言
let test = "123" let test = '123' " ダブルクォーテーション文字列の場合、特殊文字を入力できる let test = "改行:\n タブ:\t バックスラッシュ:\\ 等..." " ダブルクォーテーション文字列中にダブルクォーテーションを入れたい場合 let test = "\"123\"" let test = '"123"' " シングルクォーテーション文字列中にシングルクォーテーションを入れたい場合 let test = 'test''test'
ヒアドキュメントは無い
文字列操作
" 結合 echo 'abc'. '123' " バイト数取得 echo strlen('abc') |" -> 3 echo strlen('2バイト文字') |" -> 16 " 正規表現検索 echo stridx('123abc', 'bc') |" -> indexが返る(ない場合は-1) " 正規表現置換 echo substitute('123abc', 'a', 'z', 'g') |" -> 123zbc
正規表現については、後述
Funcref型
関数の項で解説
リスト型
宣言
let test = [1,'abc',[1,2,3]]
参照
echo test[0] " 要素の参照 echo test[99] " 範囲外を参照するとエラー " get 関数を使用すると、範囲外の場合 0 を返す echo get(test, 99) " デフォルト値も定義可能 echo get(test, 99, 'NONE') " 部分リスト echo test[1:2] echo test[1:] " 1〜末尾まで echo test[:1] " 先頭〜1まで
リスト操作
" 要素を変更したい時は let を使う let test[1] = "123" " 要素数 echo len(test) " 空であるか? echo empty(test) echo empty([]) echo add(test, 'add') | " 末尾に追加 echo insert(test, 'add') | " 先頭に追加 echo remove(test, -1) | " 末尾を削除(remove の戻り値は消した要素) echo remove(test, 0) | " 先頭を削除 " ソート echo sort(test) " split/join " -> "1\t2\t3\t4" echo join(split('1,2,3,4', ','), "\t")
配列の繰り返し(for,map)
for i in [1,2,3,4] echo i unlet i " i にいろんなデータ型が来るとエラーになるので毎回 unlet する必要がある endfor
echo map([1,2,3,4], '1+v:val')
第1引数の各要素を、第2引数の文字列をevalした結果に置き換えた結果を返す
v:val は、要素の値を格納する組み込み変数
辞書型
hashみたいなの
宣言
" キーは数値も定義できるけど、文字列に置換される let hash = {'key1': 'val1', 2: 'val2'}
参照
echo hash['key1'] " キーがアルファベット、数値、アンダースコアだけの場合、以下でも参照できる echo hash.key1
要素の再定義、追加
let hash.key2 = 'val' let hash.key3 = 'val3' echo hash
辞書操作
echo keys(hash) | " キーをリストに echo keys(hash) | " 値をリストに echo items(hash) | " 辞書をリストのリストに変換 " items を使って、辞書のループ for [key, value] in items(hash) echo key . ': ' . value endfor echo has_key(hash, 'key1') | " 存在確認 echo remove(hash, 'key1') | " 削除
不動小数点数型
int と同じく、64 or 32bit
let test = 0.1 let test = 1.0e3 " 指数もOK
" 数値型で割り算すると戻り値は数値型 echo 1/10 " 浮動小数点数型で割り算すれば良い echo 1.0/10
異なる型の変数への再代入
文字列型 ⇔ 数値型は交互に再代入ができる
let test = 1
let test = "abc"
let test = 1
それ以外は例外になる
- 古いvimでは、文字列型と数値型しか無かったのが理由???
let test = 1
let test = ["abc", "def"] |" 変数の型が一致しません" 一度変数を削除する必要がある
unlet test
let test = ["abc", "def"] |" OK
異なる型の配列を for する時に大事
for i in [1,'test',0.1,[1,2,3]] # 毎回内部でletされている
echo i
unlet i
endfor