VIM代码在字符串中的任何位置完成

时间:2011-11-08 13:47:10

标签: vim

默认情况下,VIM中的代码完成从单词的开头搜索。是否可以在单词中的任何地方制作它。例如,如果我在C头文件中有“MY_DEVICE_CTRL_ADR”和“MY_DEVICE_STAT_ADR”,我可以开始输入CTRL_然后让VIM为我完成吗?

1 个答案:

答案 0 :(得分:5)

好的,这非常粗糙,但似乎有效(至少在简单的情况下)。

首先,这是一个在给定文件上执行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行)。

即使这不是你想要的答案,我希望它可以帮助你完成任务!