vim - 如何使用程序对 VIM 进行全能补全

标签 vim

我正在寻找为 VIM 创建自定义全向补全,并且我想要在另一个程序中完成查找可能匹配的实际工作。解决这个问题的最佳方法是什么?

到目前为止,我的想法是创建一个 vim 脚本,将整个缓冲区和光标的位置发送到外部脚本。然而,我还没有找到比使用 join(getline(0, line('$')), '\n') 更有效的获取缓冲区的方法,这是非常有效的大文件速度慢。如果您有兴趣,我到目前为止有什么:

自动完成 vim 脚本:

fun! MyComplete(findstart, base)
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
        let start -= 1
    endwhile
    if a:findstart
        return start
    else
        let result = system('java AutoComplete '.shellescape(expand('%')).' '.line('.').' '.start, 'File sourcecode here')
        let res = []
        for m in split(result)
            if m =~ '^' . a:base
                call add(res, m)
            endif
        endfor
        return res
    endif
endfun
set completefunc=MyComplete

自动完成.java:

class AutoComplete {
    public static void main(String[] argv) {
        // To be expanded into an amazing program...
        System.out.print("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec");
    }
}

最佳答案

最好创建一个临时文件并将其名称传递给外部命令。例如,这是来自 clang_complete 插件:

let l:buf = getline(1, '$')
let l:tempfile = expand('%:p:h') . '/' . localtime() . expand('%:t')
try
    call writefile(l:buf, l:tempfile)
catch /^Vim\%((\a\+)\)\=:E482/
    " TODO: handle exception
endtry

" TODO: call external program here

call delete(l:tempfile)

另请参阅QueryCommandComplete插件,这对您有用。

关于vim - 如何使用程序对 VIM 进行全能补全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12572720/

相关文章:

python - 为什么某些 Vim 插件需要 "source"?

Vim:如何通过单个命令在当前目录中的所有文件上运行 `:TOhtml`?

python - 我可以使用 VIM 在 Python 中查看函数的文档字符串吗?

vim - 可以根据文件类型动态设置vim快捷方式吗?

vim - 在Vim中创建并打开以编辑光标下不存在的文件

vim - 设置特定文件类型的 vim 更新时间

text-editor - vim72 和 vimfiles 文件夹有什么区别?

vim - 如何在现有 vim 窗口中的特定行打开文件?

javascript - 使用 Sublime Text(或其他编辑器)递归搜索单个源文件以及该文件中导入/包含的所有文件

vim - textwidth=78(而不是80)的原因/来源是什么?