gpt4 book ai didi

Vim 行完成与外部文件

转载 作者:行者123 更新时间:2023-12-04 22:47:33 25 4
gpt4 key购买 nike

是否可以使用行完成 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 Ctrl+L 返回模式未找到

  • 我错过了什么?

    最佳答案

    我认为实现您想要的唯一方法是使用自定义完整功能。见 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> .

    这对我来说似乎很有效,但并没有经过详尽的测试。

    关于Vim 行完成与外部文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18160053/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com