[Full code at the end of message]
我正在尝试为vim编写一个插件,我正在调用一个ruby脚本。该功能不属于CTRL-P
自动完成功能。我只需要调用带有选项的弹出窗口。
脚本传递方法及其前一个单词。例如,Array.fill
或some_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
答案 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
),您将获得更好的性能。