По умолчанию завершение кода в VIM выполняется с начала слова. Возможно ли это сделать в любом месте слова. Например, если у меня есть "MY_DEVICE_CTRL_ADR" и "MY_DEVICE_STAT_ADR" в файле заголовка C, могу ли я начать набирать CTRL_, а затем выполнить VIM для меня?
Копирование VIM-кода в любом месте строки
Ответ 1
Хорошо, это очень грубо и готово, но, похоже, оно работает (по крайней мере, в простых случаях).
Прежде всего, это функция, которая выполняет 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
).
Даже если это не тот ответ, который вы искали, я надеюсь, что это поможет вам в ваших поисках!