1
    [Full code at the end of message]

我正在尝试为 vim 编写一个插件,我在其中调用了一个 ruby​​ 脚本。该函数不会成为CTRL-P自动完成的一部分。我只需要调用一个带有选项的弹出窗口。

脚本被传递方法和它的前一个单词。例如Array.fillorsome_variable.new将传递整个字符串,而some_var.some_word.new将传递some_word.new。该插件将找到方法的参数并将它们附加到 Vim 中的文本中。当有多种可能性时,它将调用一个弹出窗口供用户选择。

一切正常,并且可以使用以下方法将结果粘贴到行中:

    call setline(line('.'), getline('.') . shell_output)

但在多种可能性的情况下,我想使用一个弹出对话框,用户可以选择插入什么。我试过这个:

    call complete(col('.'), [shell_output])

现在 vim 抱怨我没有从插入模式调用它。但是我需要从正常模式调用它才能传入前一个单词……!!

    inoremap <TAB> <esc>"*yiW:call TestDio(@*)<CR>

    function! TestDio(string)
         let result = a:string
         let shell_output = system("ruby SCAutoComplete.rb " . result)
         call complete(col('.'), [shell_output])
    endfunction
4

1 回答 1

1

您无需离开插入模式即可捕获前一个单词;你可以使用getline()and col()。请参阅示例以:help E839了解如何执行此操作,或使用此示例:

let l:startCol = searchpos('\k*\%#', 'bn', line('.'))[1]
if l:startCol == 0
    let l:startCol = col('.')
endif
    let l:base = strpart(getline('.'), l:startCol - 1, (col('.') - l:startCol))

另请注意,为每个完成调用外部 Ruby 脚本的成本很高。如果您使用内置的 Ruby 接口 ( :help if_ruby),您将获得更好的性能。

于 2013-06-14T10:33:13.520 回答