2015/11/27

注意: まだ 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 に見られるので要チェックです。

えっ?見られたくない?そうですか。

Posted at 19:34 | WriteBacks () | Edit
Edit this entry...

wikieditish message: Ready to edit this entry.






















A quick preview will be rendered here when you click "Preview" button.