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