2011-08-04 11 views
7

¿Hay alguna manera de lograr lo siguiente?¿Hay alguna forma de utilizar dos funciones completas y personalizadas en Vim-script?

command! -nargs=* -complete=customlist,CustomFunc1 -complete=customlist,CustomFunc2 Foo call MyFunction(<f-args>) 

El usuario será capaz de lengüeta completa dos argumentos al llamar a la función foo desde la línea de vim cmd. El autocompletado se extraerá de dos listas diferentes.

p. Ej.

:Foo arg1 good<TAB> whi<TAB> 

presionar <TAB> completa las palabras.

:Foo arg1 goodyear white 

Respuesta

7

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.)

+0

Genial, gracias! Puedo obtener una solución de trabajo de esto, investigaré más después. – centerback

1

No hay manera integrada para vim para hacer esto. Lo que haría en esta situación es integrar la lógica en la función de finalización. Cuando se establece -complete=customlist,CompletionFunction, la función especificada se invoca con tres argumentos, en este orden:

  • El argumento actual
  • Toda la línea de comandos hasta este punto
  • La posición del cursor

Entonces, puede analizar estos y llamar a otra función dependiendo de si parece que está en el segundo parámetro. He aquí un ejemplo:

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 

Un problema con este ejemplo es que éste deje de terminaciones que contienen espacios en blanco, por lo que si que es una posibilidad, usted va a tener que hacer un control más cuidadoso.

Cuestiones relacionadas