Достаточная информация передается функции завершения через ее аргументы.Зная текущую позицию курсора в командной строке для завершения, можно определить номер аргумента, который в данный момент редактируется.Здесь это функция, которая возвращает это число как единственное предложение о завершении.
" 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])
Обратите внимание, что необходимо игнорировать слова, разделенные пробелами, перед именем команды, поскольку это могут быть ограничения диапазона или количество (пробелы допускаются в обоих), еслиКоманда имеет один из них.
Регулярное выражение, используемое для разбиения командной строки на аргументы, учитывает экранированный пробел, являющийся частью аргумента, а не разделителем.(Конечно, функции завершения должны избегать пробелов в предложенных кандидатах, как обычно, если команда имеет более одного возможного аргумента.)