使用外部文件完成Vim行

时间:2013-08-10 08:21:22

标签: vim

行完成 Ctrl + X Ctrl + L 用于显示来自特定外部的行完成文件而不是当前缓冲区中的“仅”? 像词典,但线条。

更新:

为了测试我做了以下事情:

  • 创建了一个带有一些测试行的文件tt.txt
  • 将文件放在D:\ t1 \(我在Windows上)
  • 包含:set path+=D:\\t1\\tt.txt
  • 的文件
  • :set complete ?返回complete =.,w,b,u,t,i
  • :set path ?返回path=.,,,D:\t1\tt.txt
  • checkpath返回:找到所有包含的文件
  • 使用 Ctrl + X Ctrl + L <键入应使用tt.txt中匹配内容填写的行/ kbd>返回未找到的模式

我错过了什么?

5 个答案:

答案 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