我认为实现你想要的唯一方法是使用自定义的 complete-function。请参阅 help complete-functions
,查看(非常有用!)文档。这是我的解决方案:
首先,您需要一个单独的函数来静默地在文件中搜索字符串(如果您只调用裸的 vimgrep
函数,则如果没有匹配项,将会出现难看的错误)。
function! SilentFileGrep( leader, file )
try
exe 'vimgrep /^\s*' . a:leader . '.*/j ' . a:file
catch /.*/
echo "no matches"
endtry
endfunction
现在,这是您的完成函数。请注意,您要搜索的文件的路径在此处是硬编码的,但如果您希望,可以更改为使用变量。我们调用 SilentFileGrep()
,将结果转储到快速修复列表中。然后,我们从 qflist 中提取结果(修剪前导空格),清除 qflist 并返回结果。
function! LineCompleteFromFile(findstart,base)
if a:findstart
" column to begin searching from (first non-whitespace column):
return match(getline("."),'\S')
else
" grep the file and build list of results:
let path = <path_to_file>
call SilentFileGrep( a:base, path )
let matches = []
for thismatch in getqflist()
" trim leading whitespace
call add(matches, matchstr(thismatch.text,'\S.*'))
endfor
call setqflist([])
return matches
endif
endfunction
为了使用这个函数,你需要将
completefunc
选项设置为指向它的位置。
set completefunc=LineCompleteFromFile
然后你可以使用<C-X><C-U>
来调用补全,你可以很容易地将它映射到<C-X><C-L>
。
对我来说,这似乎运行得非常好,但没有完全测试。
:help ins-completion
吗? - Hauleth