注意: まだ Vim Advent Calendar 2015 は始まっていません。
ctrlp.vimのエクステンションの作り方 - koturnの日記
はじめに この記事は ctrlpvim/ctrlp.vim のエクステンションの作り方についての記事であり, ctrlpの公式リポジトリのextensionsブランチ に書かれているエクステンションの...
http://koturn.hatenablog.com/entry/2015/11/19/200000
とても良い記事ですね。みんな CtrlP 拡張書いたらいいと思います。そして Vimmer おじさんから1点だけ。
let s:sample_var = {
\ 'init': s:sid_prefix . 'init()',
\ 'accept': s:sid_prefix . 'accept',
\ 'lname': 'sample extension',
\ 'sname': 'sample',
\ 'type': 'path',
\ 'nolim': 1
\}
if exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars)
call add(g:ctrlp_ext_vars, s:sample_var)
else
let g:ctrlp_ext_vars = [s:sample_var]
endif
unlet s:sample_var
こういう時の if 文、出来れば1行で書きたくないですか。そういう時に使えるのが get
です。get は第一引数(辞書もしくは配列)から第二引数のキーで値を取得し、もしキーが存在しなければ第三引数を返すという関数です。また Vim script では g:
(: の後何も付けない)という辞書変数でグローバル変数が参照出来ます。s:
でスクリプトスコープ、b:
でバッファスコープです。ここテストに出ます。なので
if exists('g:ctrlp_ext_vars') && !empty(g:ctrlp_ext_vars)
call add(g:ctrlp_ext_vars, s:sample_var)
else
let g:ctrlp_ext_vars = [s:sample_var]
endif
これは
let g:ctrlp_ext_vars = get(g:, 'ctrlp_ext_vars', []) + [s:sample_var]
と書くことができ、さらには
let g:ctrlp_ext_vars = get(g:, 'ctrlp_ext_vars', []) + [{
\ 'init': s:sid_prefix . 'init()',
\ 'accept': s:sid_prefix . 'accept',
\ 'lname': 'sample extension',
\ 'sname': 'sample',
\ 'type': 'path',
\ 'nolim': 1
\}]
とすれば sample_var の代入と破棄も必要なくなります。この技、GitHub で pull-request を送ると上級者 Vimmer に見られるので要チェックです。
えっ?見られたくない?そうですか。