默认情况下,VIM中的代码完成从单词的开头搜索.是否可以在单词中的任何地方制作它.例如,如果我在C头文件中有"MY_DEVICE_CTRL_ADR"和"MY_DEVICE_STAT_ADR",我可以开始输入CTRL_然后让VIM为我完成吗?
好的,这是非常粗糙和准备好的,但似乎有效(至少在简单的情况下).
首先,这是一个在给定文件上执行vimgrep的函数.这需要是一个单独的函数,以便稍后可以静默调用它.
function! File_Grep( leader, file )
try
exe "vimgrep /" . a:leader . "/j " . a:file
catch /.*/
echo "no matches"
endtry
endfunction
Run Code Online (Sandbox Code Playgroud)
现在这里是一个自定义完成函数,它调用File_Grep()
并返回匹配单词列表.关键是对add()
函数的调用,如果搜索term(a:base
)在字符串中出现ANYWHERE,则会向列表中添加匹配项.(参见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
Run Code Online (Sandbox Code Playgroud)
然后你只需告诉Vim使用完整的功能:
set completefunc=Fuzzy_Completion
Run Code Online (Sandbox Code Playgroud)
你可以<c-x><x-u>
用来调用完成.当然,该函数可用于搜索任何文件,而不是当前文件(只需修改let fname
行).
即使这不是你想要的答案,我希望它可以帮助你完成任务!