4

行完成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返回:找到所有包含的文件
  • 键入应使用 tt.txt 中的匹配内容完成的行,并Ctrl返回X CtrlL找到模式

我错过了什么?

4

5 回答 5

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>.

这对我来说似乎工作得很好,但它没有经过详尽的测试。

于 2013-08-13T08:16:54.397 回答
2

在 Vim help for line completion 中写到它只适用于加载的缓冲区。作为一种解决方法,你可以在另一个缓冲区中打开你的“字典”文件,Vim 会建议来自这个缓冲区的行。

于 2013-08-12T19:43:36.500 回答
1
  • 'path'应该是目录列表,因此(假设这是 Windows 上的正确语法):set path+=D:\\t1\\tt.txt应该是:set path+=D:\\t1\\or :set path+=D:\\t1

  • iin'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
    

据我所知,它不适用于没有includeC 或 C++ 等机制的语言,因此对于 Markdown、JavaScript、纯文本,或者如果我的测试有任何迹象,甚至 PHP 都可以忘记它有include

如果您想要更通用的机制,只需将该文件添加到 arglist:它将自动用作完成源:

:argadd ~/test/testfile
于 2013-08-13T11:28:07.890 回答
0

正如@black_wizard 指出的那样,另一个文件必须加载到缓冲区中。使用set hidden,您可以使用以下内容加载另一个文件并返回到上一个缓冲区:

command! -nargs=? XL silent edit <args> | silent bprevious

加载tt.txt到另一个缓冲区并返回到前一个:

:XL tt.txt
于 2013-08-12T21:39:09.370 回答
0

如果你这样做

:set dictionary=<some file>

然后你可以使用ctrl+x后跟ctrl+k来完成 from <some file>

:help ins-completion

了解更多信息。

于 2013-08-12T19:05:01.957 回答