Копирование VIM-кода в любом месте строки

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

Даже если это не тот ответ, который вы искали, я надеюсь, что это поможет вам в ваших поисках!