Хорошо, это очень грубо и готово, но, похоже, работает (по крайней мере, в простых случаях).
Прежде всего, здесь есть функция, которая выполняет vimgrep для данного файла. Это должна быть отдельная функция, чтобы ее можно было потом беззвучно вызывать.
function! File_Grep( leader, file )
try
exe "vimgrep /" . a:leader . "/j " . a:file
catch /.*/
echo "no matches"
endtry
endfunction
Теперь здесь есть функция пользовательского завершения, которая вызывает File_Grep()
и возвращает список подходящих слов. Ключ - это вызов функции add()
, которая добавляет совпадение в список, если поисковый термин (a:base
) появляется ВСЕГДА в строке. (См. help complete-functions
для структуры этой функции.)
function! Fuzzy_Completion( findstart, base )
if a:findstart
" find start of completion
let line = getline('.')
let start = col('.') - 1
while start > 0 && line[start - 1] =~ '\w'
let start -= 1
endwhile
return start
else
" search for a:base in current file
let fname = expand("%")
silent call File_Grep( a:base, fname )
let matches = []
for this in getqflist()
call add(matches, matchstr(this.text,"\\w*" . a:base . "\\w*"))
endfor
call setqflist([])
return matches
endif
endfunction
Тогда вам просто нужно сказать Vim использовать полную функцию:
set completefunc=Fuzzy_Completion
и вы можете использовать <c-x><x-u>
, чтобы вызвать завершение. Конечно, эту функцию можно использовать для поиска любого файла, а не текущего файла (просто измените строку let fname
).
Даже если это не тот ответ, который вы искали, надеюсь, он поможет вам в ваших поисках!