Hack #109: 本当は怖いVim script – var{ia}ble編
Posted at 2009/12/15ツイート
問題
Hack #105: surroundをより便利に使う では、surroundの設定例として以下のものを取り上げました:
let g:surround_{char2nr('j')} = "「\r」"
Hack #105では本筋でないのため軽く流しましたが、 よくよく確認してみると変数名の記述が変態的なものになっています。 一体これはどういうことなのでしょうか。
解説
Vimでは変数名(および関数名)の中に任意の式を
{expr}
の形で埋め込むことができます。
変数名中に{expr}
が含まれる場合、
実行時に{}
中の式exprが評価され、
その結果で{expr}
が置き換えられます。
最終的には{expr}
が置き換えられた
変数名が参照されることになります。
例えばg:surround_{char2nr('j')}
の場合、
式char2nr('j')
を評価した結果(= 106)で
{char2nr('j')}
が置き換えられ、
最終的にg:surround_106
が参照されることになります。
ですから、
let g:surround_{char2nr('j')} = "「\r」"
は
let g:surround_106 = "「\r」"
と等価です。
ただ{expr}
による表記の方が意図するところが分かり易くなります。
現代的なVim scriptならば
let g:surround = {}
let g:surround['j'] = "「\r」"
のような形で記述するところですが、 surroundの場合は過去のバージョン(6.x)のVimでも動作するように記述されており、 またlistやdictionaryなどの現代的な要素はVim 7.xから追加されたものであるため、 このようになっています。
言い換えると、Vim scriptにはつい最近まで配列すら存在しなかったのです。
var{ia}ble
表記が導入された理由の一つは、
値として数値と文字列しか存在しなかった時代に、
なんとかして配列を実現するための手段としてです。
参考資料
- :help curly-braces-names
- :help version6.txt (「curly」でページ内を検索)
もどる
blog comments powered by Disqus