行完成 Ctrl + X Ctrl + L 用于显示来自特定外部的行完成文件而不是当前缓冲区中的“仅”? 像词典,但线条。
更新:
为了测试我做了以下事情:
tt.txt
:set path+=D:\\t1\\tt.txt
:set complete ?
返回complete =.,w,b,u,t,i
:set path ?
返回path=.,,,D:\t1\tt.txt
checkpath
返回:找到所有包含的文件我错过了什么?
答案 0 :(得分:7)
我认为实现您想要的唯一方法是使用自定义完整功能。有关(非常有用!)文档,请参阅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>
。
这似乎对我来说效果很好,但它没有经过详尽的测试。
答案 1 :(得分:2)
在Vim帮助行完成时,它写的只适用于加载的缓冲区。作为一种解决方法,您可以在另一个缓冲区中打开“词典”文件,Vim将建议来自此缓冲区的行。
答案 2 :(得分:1)
'path'
应该是一个目录列表,因此(假设Windows上的语法正确):set path+=D:\\t1\\tt.txt
应为:set path+=D:\\t1\\
或:set path+=D:\\t1
。
i
中的'complete'
表示完成候选项是从当前和包含文件中选择的。您必须包含文件才能完成工作:如果您没有明确包含该文件,则不会。
假设您已使用以下单行创建~/test/testfile
:
lorem ipsum dolor sit amet
您可以使用以下内容将其添加到Vim的'path'
:set path+=~/test
要在C ++文件中将其用作完成源,您可以这样做:
#include <testfile>
能够做到:
lore<C-x><C-f>
得到:
lorem ipsum dolor sit amet
据我所知,它不适用于没有{C}或C ++等include
机制的语言,所以你可以忘记Markdown,JavaScript,纯文本,或者,如果我的测试有任何迹象,即使PHP确实有include
。
如果你想要一个更通用的机制,只需将该文件添加到arglist:它将自动用作完成源:
:argadd ~/test/testfile
答案 3 :(得分:0)
如果你这样做
:set dictionary=<some file>
然后您可以使用 ctrl + x ,然后使用 ctrl + k 从{{1}完成}&GT;
见
<some file
了解更多信息。
答案 4 :(得分:0)
正如@black_wizard指出的那样,另一个文件必须加载到缓冲区中。使用set hidden
,您可以使用以下内容加载另一个文件并返回到上一个缓冲区:
command! -nargs=? XL silent edit <args> | silent bprevious
将tt.txt
加载到另一个缓冲区并返回上一个缓冲区:
:XL tt.txt