有没有办法实现以下目标?
command! -nargs=* -complete=customlist,CustomFunc1 -complete=customlist,CustomFunc2 Foo call MyFunction(<f-args>)
当从vim cmd行调用函数Foo时,用户可以选项卡完成两个参数。自动完成将从两个不同的列表中拉出来。
e.g。
:Foo arg1 good<TAB> whi<TAB>
按<TAB>
完成单词。
:Foo arg1 goodyear white
答案 0 :(得分:7)
有足够的信息通过它传递给完成功能 参数。知道命令行中的当前光标位置 完成后,可以确定参数的数量 目前正在编辑中。这是将该数字作为返回的函数 唯一的完成建议。
" Custom completion function for the command 'Foo'
function! FooComplete(arg, line, pos)
let l = split(a:line[:a:pos-1], '\%(\%(\%(^\|[^\\]\)\\\)\@<!\s\)\+', 1)
let n = len(l) - index(l, 'Foo') - 1
return [string(n)]
endfunction
通过调用其中一个完成的函数替换最后一行 具体论证(如果已经写好)。例如,
let funcs = ['FooCompleteFirst', 'FooCompleteSecond']
return call(funcs[n], [a:arg, a:line, a:pos])
请注意,必须在之前忽略以空格分隔的单词 命令名称,因为它们可能是范围的限制或计数(空格是 如果命令中包含其中一个,则允许在两者中使用。
用于将命令行拆分为参数的正则表达式 帐户转义空白是一个参数的一部分,而不是 分隔符。 (当然,完成函数应该逃避空格 如果命令有多个,建议的候选人就像往常一样 可能的论点。)
答案 1 :(得分:1)
vim没有内置的方法来做到这一点。在这种情况下我要做的是将逻辑嵌入到完成函数中。设置-complete=customlist,CompletionFunction
时,将使用三个参数调用指定的函数,顺序为:
因此,您可以分析这些并调用另一个函数,具体取决于它是否在第二个参数上。这是一个例子:
command! -nargs=* -complete=customlist,FooComplete Foo call Foo(<f-args>)
function! Foo(...)
" ...
endfunction
function! FooComplete(current_arg, command_line, cursor_position)
" split by whitespace to get the separate components:
let parts = split(a:command_line, '\s\+')
if len(parts) > 2
" then we're definitely finished with the first argument:
return SecondCompletion(a:current_arg)
elseif len(parts) > 1 && a:current_arg =~ '^\s*$'
" then we've entered the first argument, but the current one is still blank:
return SecondCompletion(a:current_arg)
else
" we're still on the first argument:
return FirstCompletion(a:current_arg)
endif
endfunction
function! FirstCompletion(arg)
" ...
endfunction
function! SecondCompletion(arg)
" ...
endfunction
这个例子的一个问题是,对于包含空格的完成,它会失败,所以如果有可能,你将不得不进行更仔细的检查。