第2回Vimスクリプト入門みたいの(変数)

" usr_41.txt  vimスクリプトの書き方から
" 「41.2 変数」より
"
" 変数名のルールはCとだいたい同じ(Perlぽい正規表現だと[A-Za-z_][A-Za-z0-9_]*かな)
" どうやら変数はデフォルトでグローバルみたいです。
" スクリプトローカルな変数にするには s: をつけるらしい。
" s:
" 他にも
" b: バッファローカル
" w: ウィンドウローカル
" g: グローバル
" v: Vimが用意したもの
" などがあって internal-variables を見るといいみたい。
"
" :unlet を使わないと変数は削除されないみたい。
" のっていたサンプルぽいものを打って動かしてみる

if !exists("s:cnt")
  let s:cnt = 0
en
let s:cnt = s:cnt + 1
ec s:cnt

" :so %
" ( :so は :so[urce] 。:h :so で調べるとわかる )
"
" たしかに数字は実行するたびに増える
"
" サンプル中に exists() が出現したので
" :h exists() 
" まぁ名前の通りの関数で、変数が存在するかを確認するもの
"
" ここで注意。
" サンプルを打ちなおす時に exists(s:cnt) とやって見事にコケた
" :h exists() の注意書きにもあるが、この引数は文字列らしい。
" exists(s:cnt) だと s:cnt の中身が対象になるようだ。
"
" 先のサンプルに数行を追加して確かめてみる。
" ( 先のサンプルを実行した窓で :so % すると s:cnt が残っているので注意 )
" 

if !exists("s:cnt")
  let s:cnt = 0
en
" 追加行ここから
if s:cnt == 1
  let s:v1 = 0
en
let s:var = "s:v1"
if exists(s:var)
  ec 'exists(s:v1)'
el
  ec '!exists(s:v1)'
en
" 追加行ここまで
let s:cnt = s:cnt + 1
ec s:cnt

" 意図通りに最初の一回は !exists(s:var) 、
" 次からは s:v1 が存在するので exists(s:var) が出力される
"
" 今日は時間がなくて手抜きだけど、このへんで終了。
" 明日は :unlet のテストを書いて次に進みたいね!
"
" 今日のまとめ ( コマンド一覧だと不便なので改名 )
" s: でスクリプトローカル。:unlet されるまで残る
" ( :h internal-variables )
" exists({expr})
" :unl[et][!] {var-name} ...
"
" 次回予告
" :unlet で変数削除!それがプロ。
"