vim-users.jp

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表記が導入された理由の一つは、 値として数値と文字列しか存在しなかった時代に、 なんとかして配列を実現するための手段としてです。

参考資料

kana

もどる
blog comments powered by Disqus