2

私は VIM 用のカスタムオムニ補完を作成しようとしています.別のプログラムで実行される可能性のある一致を見つける実際の作業を行いたいです. これについて最善の方法は何ですか?

これまでの私の考えは、バッファ全体とカーソルの位置を外部スクリプトに送信する 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

オートコンプリート.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");
    }
}
4

1 に答える 1

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プラグインも参照してください。

于 2012-09-25T05:53:54.493 に答える