2012-05-10 23 views
20

Hay algo que me confunde cuando implemente una función fiesta de finalización automática, que lo voy a poner en /etc/bash_completion.d/¿Cómo restablecer COMP_WORDBREAKS sin afectar a otro script de finalización?

Con el fin de lograr una cierta característica, quiero eliminar la palabra ruptura caracteres dos puntos (:) de la variable $COMP_WORDBREAKS y agregue una barra inclinada (/) al comienzo de $COMP_WORDBREAKS.

COMP_WORDBREAKS=" /'><=;|&(" 
_mytool() 
{ 
    local cur=${COMP_WORDS[COMP_CWORD]} 
    compopt -o nospace 

    # my implement here 

    COMPREPLY=($(compgen ..........my_implement......... -- $cur)) 
} 
complete -F _mytool mytool 

Sin embargo, no puedo restablecer COMP_WORDBREAKS directamente porque el valor es compartida con otras secuencias de comandos de finalización. En el momento en que se llama a la función de finalización, la matriz COMP_WORDS variable ya se ha rellenado, por lo que los cambios locales COMP_WORDBREAKS no tienen ningún efecto.

¿Hay alguna solución para cambiar COMP_WORDBREAKS en una secuencia de comandos de finalización y no tiene efecto en otra secuencia de comandos?

$ echo $BASH_VERSION 
4.2.10(1)-release 

Respuesta

20

Modificación $COMP_WORDBREAKS en el script de finalización no es la forma recomendada (ya que es una variable global y que podría afectar el comportamiento de otras secuencias de comandos de finalización - por ejemplo ssh).

Sin embargo, bash completion ofrece algunos métodos de ayuda que puede utilizar para lograr su objetivo.

La forma recomendada para manejar no-palabra-romper caracteres en palabras de finalización es el uso de los dos métodos de ayuda:

  • _get_comp_words_by_ref con la opción -n EXCLUDE
    • hace correr la voz-a-completa sin teniendo en cuenta los caracteres en EXCLUIRÁ como palabra rompe
  • __ltrim_colon_completions

lo tanto, aquí es un ejemplo básico de cómo un mango de dos puntos (:) en las palabras de conclusión:

_mytool() 
{ 
    local cur 
    _get_comp_words_by_ref -n : cur 

    # my implementation here 

    COMPREPLY=($(compgen ..........my_implement......... -- $cur)) 

    __ltrim_colon_completions "$cur" 
} 
complete -F _mytool mytool 

Como consejo final, los métodos de ayuda se encuentran en /etc/bash_completion. Eche un vistazo al interior para leer una descripción detallada de cada método y descubrir más métodos auxiliares.

+0

¡Muchas gracias, esto fue realmente útil para mis tareas de rake en Ruby on Rails! Además, gracias por señalar la sección E13 en los documentos. – ndbroadbent

+0

esto solo funcionó correctamente, cuando puse esta línea 'cur =" $ {COMP_WORDS [COMP_CWORD]} "' antes de '_get_comp_words_by_ref -n: cur' también es bueno saber, si usa el prev también, puede agregarlo al end '_get_comp_words_by_ref -n: cur prev' – jmk

+0

Cuando tengo terminaciones ambiguas y presiono dos veces la pestaña, obtengo sugerencias incorrectas basadas en lo que he tipeado cuando uso esta solución. Ver http: // stackoverflow.com/questions/28479216/how-to-give-correct-suggestions-to-tab-complete-when-my-words-contains-colons – toftis

Cuestiones relacionadas