エラー発生箇所の探索
function <SNR>96_on_cursor_moved..139 の処理中にエラーが検出されました: 行 22: E715: 辞書型が必要です
上記のエラーが発生した. エラー発生箇所特定のためのメモ*1. このメッセージは, 関数
最初に
: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.