Existe suficiente información se pasa a la función de terminación a través de sus argumentos. Conociendo la posición actual del cursor en la línea de comando que se va a completada, es posible determinar el número del argumento que está actualmente en proceso de edición. Aquí es la función que devuelve ese número como la única sugerencia de finalización.
" 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
Sustituto de la última línea con una llamada a una de las funciones que completan argumento específico (si es que ya están escritos). Por ejemplo,
let funcs = ['FooCompleteFirst', 'FooCompleteSecond']
return call(funcs[n], [a:arg, a:line, a:pos])
Tenga en cuenta que es necesario hacer caso omiso de las palabras de espacio en blanco separados antes del nombre de comandos, ya que los que podrían ser los límites de un rango, o un recuento (espacios son permitido en ambos), si el comando tiene uno de ellos.
La expresión regular utilizada para dividir la línea de comandos en argumentos lleva a espacios en blanco con escape que es parte de un argumento, y no a un separador. (Por supuesto, las funciones de finalización debe escapar de los espacios en blanco en sugirió candidatos, como es habitual en el caso de la orden de tener más de un argumento posible.)
Genial, gracias! Puedo obtener una solución de trabajo de esto, investigaré más después. – centerback