如何填充vim“;插入模式完成“;与shell输出的对话框?

如何填充vim“;插入模式完成“;与shell输出的对话框?,vim,vim-plugin,Vim,Vim Plugin,我正在尝试为vim编写一个插件,其中我调用了一个ruby脚本。该功能不属于CTRL-P自动完成功能的一部分。我只需要调用一个带有选项的弹出窗口 将方法及其上一个单词传递给脚本。例如Array.fill或某个变量。new将传递整个字符串,而某个变量。某个单词。new将传递某个单词。new。插件将找到方法的参数,并将它们附加到Vim中的文本中。当存在多个可能性时,它将调用一个弹出窗口供用户选择 一切工作正常,可通过以下方式将结果粘贴到行中: [Full code at the end of

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

将方法及其上一个单词传递给脚本。例如
Array.fill
某个变量。new
将传递整个字符串,而
某个变量。某个单词。new
将传递
某个单词。new
。插件将找到方法的参数,并将它们附加到Vim中的文本中。当存在多个可能性时,它将调用一个弹出窗口供用户选择

一切工作正常,可通过以下方式将结果粘贴到行中:

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

    call setline(line('.'), getline('.') . shell_output)
现在vim抱怨我没有从插入模式调用它。但我需要从正常模式调用它来传递上一个单词

    call complete(col('.'), [shell_output])
inoremap“*yiW:调用TestDio(@*)
函数!TestDio(字符串)
让result=a:string
让shell_output=system(“ruby scautomplete.rb”.result)
调用完成(列('.'),[shell_输出])
端功能

您不需要离开插入模式来捕获上一个单词;您可以使用
getline()
col()
进行捕获。请参阅
中的示例:帮助E839
了解如何执行此操作,或使用此选项:

    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

还要注意的是,每次完成调用外部Ruby脚本的成本都很高。如果使用内置Ruby接口(
:help if_Ruby
),您将获得更好的性能。

您不需要离开插入模式来捕获前一个单词;您可以使用
getline()
col()
。请参见
:help E839中的示例,了解如何执行此操作,或使用此:

    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

还要注意的是,每次完成调用外部Ruby脚本的成本都很高。如果使用内置Ruby接口,您将获得更好的性能(
:help if_Ruby
).

谢谢你的回答:)我决定使用一个外部脚本,以便自动完成,而无需使用Ruby编译vim。我想将其作为开放源代码项目的一部分进行贡献,并使其始终开箱即用。我将在接下来的几天检查你的答案,并返回反馈。看了一下,但我仍然没有似乎得到了我所需要的。
completefunc
似乎对自动完成过于具体,而这正是我想要实现的。很抱歉,我在原始帖子中没有提供足够的信息。我提交了一个编辑,如果您能再看一看,我将不胜感激。如果您从插入模式触发您的某种完成,那么
completefunc
调用complete()
都很好;事实上,它们基本上是等价的。Vim没有自动完成功能(仅通过插件);触发始终是手动的。感谢您的回答:)我决定使用外部脚本,以便自动完成工作,而无需使用Ruby编译vim。我希望将其作为开放源代码项目的一部分,并使其始终开箱即用。我将在接下来的几天检查您的答案,并返回反馈。看了一眼,但我仍然没有得到我需要的。completefunc
似乎太具体了,无法自动完成,这不是我想要实现的。抱歉,我在原始帖子中没有提供足够的信息。我提交了一个编辑,如果你能再看一眼,我将不胜感激。如果你从插入模式下,
completefunc
callcomplete()
都可以;事实上,它们基本上是等效的。Vim没有自动完成功能(仅通过插件);触发总是手动的。