エラー発生箇所の探索

function <SNR>96_on_cursor_moved..139 の処理中にエラーが検出されました:
行   22:
E715: 辞書型が必要です

上記のエラーが発生した. エラー発生箇所特定のためのメモ*1. このメッセージは, 関数 96_on_cursor_moved() が 関数 139 を呼び出し, 関数 139 の 22 行目で E715 が発生していることを示す.

最初に 96 が何かを調べる.

:scriptnames
.... () ....
 94: ~/.vim/bundle/context_filetype.vim/autoload/context_filetype.vim
 95: ~/.vim/bundle/echodoc/plugin/echodoc.vim
 96: ~/.vim/bundle/echodoc/autoload/echodoc.vim
 97: ~/.vim/bundle/neosnippet/autoload/neosnippet.vim
 98: ~/.vim/bundle/neosnippet/autoload/neosnippet/util.vim
.... () ....

一つ目の関数は echodoc/autoload/echodoc.vim に定義されている関数 s:on_cursor_moved() だとわかる.

次に, 139 が何かを調べる. これは numbered function と呼ばれるもの.

                *numbered-function* *anonymous-function*
関数に名前をつける必要をなくすために、関数を定義して直接辞書に代入することがで
きる: >
    :let mydict = {'data': [0, 1, 2, 3]}
    :function mydict.len() dict
    : return len(self.data)
    :endfunction
    :echo mydict.len()

こうすると関数に番号がふられ、dict.lenがこの関数を参照する|Funcref|となる。こ
の関数は|Funcref|を通してのみ呼び出せる。参照している|Funcref|がなくなると、こ
の関数は自動的に削除される。

番号付き関数には "dict" 属性を付ける必要はない。

番号付き関数でエラーが発生したときは、あるトリックを使うことで発生源を確認でき
る。例えば 42 という関数なら次のようにする: >
    :function {42}

関数の特定には以下のようにすれば良い.

:verbose function {139}
   function 139(cur_text) dict
        Last set from ~/.vim/bundle/neocomplete/autoload/neocomplete/sources/include.vim
.... () ....
18
19   for word in reverse(words)
20     let key = tolower(word[: completion_length-1])
21
22     for include in filter(copy(s:include_info[bufnr('%')].include_files), 'ha
s_key(s:include_cache, v:val) && has_key(s:include_cache[v:val], key)')
24       for matched in filter(values(s:include_cache[include][key]), 'v:val.wor
d ==# word && has_key(v:val, "kind") && v:val.kind != ""')
26         let ret = []
27
.... () ....

{139} の 22 行目でエラーが発生しているので, 上記の部分が問題の箇所であると分かった*2.

*1:lingrid:thinca さんに教えていただいた. 感謝

*2:これは修正されました