bash - scripts - ¿Cómo restablecer COMP_WORDBREAKS sin afectar a otro script de finalización?
scripts bash ejemplos (1)
La modificación de $COMP_WORDBREAKS
en su secuencia de comandos de finalización no es la forma recomendada (ya que es una variable global y podría afectar el comportamiento de otras secuencias de comandos de finalización, por ejemplo, ssh).
Sin embargo, la finalización de bash ofrece algunos métodos de ayuda que puede utilizar para lograr su objetivo.
La forma recomendada de manejar los caracteres que no se separan de las palabras en palabras de terminación es mediante los dos métodos auxiliares:
-
_get_comp_words_by_ref
con la opción-n EXCLUDE
- obtiene la palabra para completar sin considerar los caracteres en EXCLUIR como saltos de palabra
-
__ltrim_colon_completions
- elimina los dos puntos que contienen el prefijo de los elementos COMPLETOS
(una solución para http://tiswww.case.edu/php/chet/bash/FAQ - E13)
- elimina los dos puntos que contienen el prefijo de los elementos COMPLETOS
Entonces, aquí hay un ejemplo básico de cómo manejar los dos puntos (:) en palabras de terminació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 para leer una descripción detallada de cada método y descubrir más métodos de ayuda.
Hay algo que me confunde cuando implemento una función de autocompletado de bash que la pondré en /etc/bash_completion.d/
Para lograr alguna característica, quiero eliminar los caracteres de separación de palabras dos puntos ( $COMP_WORDBREAKS
de la variable $COMP_WORDBREAKS
y agregar una barra ( /
) 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 se comparte con otros scripts 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 completado, por lo que los cambios COMP_WORDBREAKS
nivel local no tienen efecto.
¿Hay alguna solución para cambiar COMP_WORDBREAKS
en una secuencia de comandos de finalización y no afecta a otra secuencia de comandos?
$ echo $BASH_VERSION
4.2.10(1)-release