如何使用shell输出填充vim“插入模式完成”对话框?

时间:2013-06-13 22:39:52

标签: vim vim-plugin

    [Full code at the end of message]

我正在尝试为vim编写一个插件,我正在调用一个ruby脚本。该功能不属于CTRL-P自动完成功能。我只需要调用带有选项的弹出窗口。

脚本传递方法及其前一个单词。例如,Array.fillsome_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

1 个答案:

答案 0 :(得分:1)

您不需要离开插入模式来捕获前一个单词;您可以使用getline()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),您将获得更好的性能。