如何使用程序对VIM进行全向完成

时间:2012-09-24 20:50:58

标签: vim

我正在为VIM创建一个自定义的omni完成,我想在另一个程序中找到可能匹配的实际工作。什么是最好的方法呢?

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

自动完成vimscript:

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

AutoComplete.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");
    }
}

1 个答案:

答案 0 :(得分:2)

最好创建一个临时文件并将其名称传递给外部命令。例如,这来自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插件,它对您有用。