Tengo un montón de scripts de finalización de bash configurados (principalmente usando bash-it y algunos configurados manualmente).
También tengo un montón de alias configurados para tareas comunes como gco
for git checkout
. En este momento, puedo escribir git checkout d
Taby develop
se ha completado para mí, pero cuando escribo gco d
Tabno se completa.
Supongo que esto se debe a que el script de finalización se está completando git
y no puede ver gco
.
¿Hay alguna manera de obtener genérica / programáticamente todos mis scripts de finalización para que funcionen con mis alias? No poder completar cuando se usa el tipo de alias derrota el propósito del alias.
bash
tab-completion
dstarh
fuente
fuente
bash --version
para obtener esto (no use-v
, salida diferente).ll --[TAB]
, ¿imprimirá una lista de opciones parals
? Soy bastante escéptico con respecto a esto, pero si está seguro de que tal cosa existió en 11.10, tendría curiosidad por analizarlo y determinar qué se eliminó.Respuestas:
El siguiente código, adaptado de esta respuesta de desbordamiento de pila y este hilo de discusión de los foros de Ubuntu agregará terminaciones para todos sus alias definidos:
Para los alias simples (solo comando, sin argumentos) asignará la función de finalización original al alias; para los alias con argumentos, crea una función de contenedor que inserta los argumentos adicionales en la función de finalización original.
A diferencia de los scripts a partir de los cuales ha evolucionado, la función respeta las comillas tanto para el comando de alias como para sus argumentos (pero el primero debe coincidir con el comando de finalización y no puede anidarse), y debe filtrar de manera confiable los alias a las listas de comandos y tuberías (que se omiten, ya que es imposible saber qué completar en ellas sin volver a crear la lógica de análisis de la línea de comandos de shell completa).
Uso
Guarde el código como un archivo de script de shell y fuente que, o copie la función al por mayor,
.bashrc
(o su archivo de puntos pertinente ). Lo importante es llamar a la función después de que se hayan configurado las definiciones de alias y de finalización de bash (el código anterior llama a la función justo después de su definición, en un espíritu de "fuente y olvido", pero puede mover la llamada a cualquier lugar aguas abajo si eso te queda mejor). Si no desea la función en su entorno después de que se cierre, puede agregarlaunset -f alias_completion
después de llamarla.Notas
Si está utilizando
bash
4.1 o superior y usa terminaciones cargadas dinámicamente, el script intentará cargar las terminaciones para todos sus comandos con alias para que pueda construir las funciones de contenedor para sus alias.fuente
~/.bashrc
. Almacénelo como un archivo de script de shell y cómprelo (. /path/to/alias_completion.sh
), o copie y pegue el código al por mayor./usr/share/bash-completion/completions/
que se encuentran debajo , solo se cargan la primera vez que el usuario accede[TAB]
. Entonces, incluso si la función se carga desde~/.bashrc
ella, no generará terminaciones para los alias de los comandos en ella. Después de asegurarme decomplete -p
que funcionaapt-get
yapt-cache
copié y pegué su función en el terminal y funciona correctamente./tmp
de~/.bash_completion
y ha añadido manualmente en sus inicios las correspondientessource /usr/share/bash-completion/completions/
entradas (por separado paraapt-get
yapt-cache
-apt-{cache,get}
Por qué no funciona).Sí, aquí está el proyecto de alias completo que resuelve su problema exactamente. Proporciona la finalización de alias genérico y programático sin usar
eval
.fuente
Esta es la forma manual, para aquellos que buscan esto.
Primero, busque el comando de finalización original. Ejemplo:
Ahora agréguelos a su script de inicio (por ejemplo, ~ / .bashrc):
fuente: https://superuser.com/a/1004334
fuente