vim-users.jp

Hack #239: グローバル変数を安全に参照する

Posted at 2011/10/30
このエントリーをはてなブックマークに追加

こんにちは、ujihisaです。以前からこのvim-users.jp上で告知していた、東京でのVimのカンファレンスであるujihisa.vim#2が、ついに一般参加者の募集をはじめたようです。

このページの末尾から参加申し込みページにアクセスできるようです。なお、HootSuiteをお使いの方は、以下のリンクから簡単にujihisa.vim#2の宣伝ができるようで、とても便利です。

さて、本題です。

問題

Vim scriptを読んでいると以下のようなコードを比較的頻繁に見かけるのではないでしょうか。

if !exists('g:aaa_bbb')
  let g:aaa_bbb = 'something default'
endif

特定のグローバル変数が存在しないときのみデフォルトの値を入れるときのパターンです。これは一行で宣言的に書きたいですよね。かといって、これのためだけに別の関数を用意するのも、健康的でなさそうです。

解決

実はグローバル変数の一覧をg:で取得することができます。同様にバッファローカル変数一覧はb:、スクリプトローカル変数一覧はs:など。これは変数名がキーで変数の値が値の辞書となっています。

echo g:hello

は、実は以下のように書くことができます。

echo (g:).hello
echo (g:)['hello']

いずれもそのキーがなければ実行時エラーをだしてしまいます。しかし、get()関数を用いれば、デフォルト値を使いつつその値に参照することができます。

echo get(g:, 'hello', 'the default value')

これはg:helloが定義されていればその値を表示、定義されていなければthe default valueを表示します。

したがって、元々の問題は、

if !exists('g:aaa_bbb')
  let g:aaa_bbb = 'something default'
endif

以下のように一行で記述することができます。

let g:aaa_bbb = get(g:, 'aaa_bbb', 'something default')

美しいですね。これがVim script使いの生きる道といえるのではないでしょうか。

ujihisa

もどる
blog comments powered by Disqus