Мне не удалось решить это очень элегантно, но есть обходной путь, написав специальную функцию завершения, которая просто ищет файл словаря для совпадений:
function! MyCompleteFunction( findstart, base )
if a:findstart
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~ '[A-Za-z_]'
let start -= 1
endwhile
return start
else
silent call DictGrep( a:base, 'path\to\dictionary\file' )
let matches = []
for thismatch in getqflist()
call add(matches, thismatch.text)
endfor
return matches
endif
endfunction
Обратите внимание, что я определил функцию DictGrep (), которая фактически выполняет vimgrep. Это так, чтобы я мог назвать это тихо и не беспокоиться сообщениями об ошибках:
function! DictGrep( leader, file )
try
exe "vimgrep /^" . a:leader . ".*/j " . a:file
catch /.*/
echo "no matches"
endtry
endfunction
Тогда просто определите set the completefunc:
setlocal completefunc=MyCompleteFunction()
, а затем использовать для завершения в режиме вставки (которое может быть отображено для замены текущей привязки завершения словаря).
vimgrep может быть довольно медленной операцией, но я не заметил никаких проблем, если в файле словаря нет сотен совпадений.
Надеюсь, это поможет.