我认为实现您想要的唯一方法是使用自定义完整功能。请参阅help complete-functions
(非常有用!)文档。这是我的解决方案尝试:
首先,您需要一个单独的函数来静默地 grep 文件中的字符串(如果您只是调用裸vimgrep
函数,如果没有匹配项,则会收到一个丑陋的错误)。
function! SilentFileGrep( leader, file )
try
exe 'vimgrep /^\s*' . a:leader . '.*/j ' . a:file
catch /.*/
echo "no matches"
endtry
endfunction
现在,这是您的完成功能。请注意,您要搜索的文件的路径在这里是硬编码的,但如果您愿意,可以将其更改为使用变量。我们调用SilentFileGrep()
,它将结果转储到 quickfix 列表中。然后我们从 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>
.
这对我来说似乎工作得很好,但它没有经过详尽的测试。