読者です 読者をやめる 読者になる 読者になる

ctrlp.vimのExtensionを書くときに:NeoBundleLazy autoloadを考慮してg:ctrlp_builtinsをそのまま使わない

ctrlp拡張を作ったら、最後にctrlpからid番号を取得してctrlpに登録することになるが、
このとき、ctrlpがNeoBundleLazy状態であるのなら、

command! CtrlPExtension  call ctrlp#init(ctrlp#{extension-name}#id())
let s:id = g:ctrlp_builtins + len(g:ctrlp_ext_vars)
function! ctrlp#{extension-name}#id()
  return s:id
endfunction

は、g:ctrlp_builtinsが定義されていないためにエラーが出る。
ctrlp.vimctrlp#init()が呼び出されたときに初めてneobundle.vimによって読み込まれるために、それ以前にはg:ctrlp_builtinsが定義されていないからである。

エラーが出ないようにするためには、たとえば以下のように書き改める。

let s:id = ctrlp#getvar('g:ctrlp_builtins') + len(g:ctrlp_ext_vars)
function! ctrlp#{extension-name}#id()
  return s:id
endfunction

ctrlpの変数の値を返すctrlp#getvar()が呼ばれたときに、neobundle.vimがctrlp.vimを読み込むようになるために、エラーが出なくなる。

ctrlpのExtensionの作り方は以下の記事に詳しい。