Me gustaría indicarle a bash que use un método especial para completar en ciertos nombres de directorio. Por ejemplo, bash llamaría a un programa mío para realizar la finalización si una ruta comienza con "$$", y realizar la finalización normalmente de lo contrario.
¿Es esto posible? ¿Cómo lo implementaría?
Recompensa : Realmente agradecería una respuesta a esa pregunta. El objetivo es permitir que el salto automático complete rutas para todos los comandos cuando el usuario los inicia con un determinado prefijo. Entonces, por ejemplo, al copiar un archivo de un directorio remoto, puede escribir:
cp $$patern + <Tab>
y autojump completaría
cp /home/user/CompliCatedDireCTOry/long/path/bla/bla
y solo tendría que agregar donde desea colocar el archivo. Por supuesto, puedo usar el comentario de ott para agregarlo a algunos comandos específicos, pero si alguien tiene una mejor idea, estaría muy agradecido.
fuente
Respuestas:
Puede hacer esto anulando el enlace predeterminado para TAB (^ i). Primero debe anular el enlace TAB, luego debe crear una función que llame a su comando, por último, debe tomar la salida de ese comando y actualizar la variable que contiene la línea de comando actual.
Esta función toma la línea de comando actual y cambia los dos últimos caracteres a 'huugs'.
Para su ejemplo, probablemente desee cambiar la línea new_argument para que se vea así:
Ahora anule el enlace ^ i:
Ahora prueba que funciona:
para que la finalización normal siga funcionando, puede probar la parte $$ haciendo cd $$ ... etc.
Si tiene problemas, active el modo detallado:
Imprimirá todo lo que está haciendo la función.
Probé esto en Ubuntu 11 usando bash 4.2.8 (1) -release (el valor predeterminado).
fuente
La rutina de finalización de bash se puede programar como un script de shell.
Aquí hay un ejemplo de un script de shell que reemplazará en cualquier parámetro
$$[Tab]
pormy replacement string
, pero solo para el comando específicomycommand
y solo si el parámetro es exactamente "$$":Debe
source <file-name>
iniciar el script para bash via (o el comando dot) para comenzar a funcionar, y luego:Para que siempre funcione para algunos o todos los usuarios, inclúyalo en una de las rutinas de perfil de bash .
El problema con el
complete
comando es que solo funcionará para uno o más nombres de comandos, que se especifican como parámetros. Uno podría simplemente darle la lista de todos los comandos que posiblemente podrían ser utilizados por los usuarios, o en casos desesperados expandirse/bin/* /usr/bin/* ~/bin/*
.Probado en CentOS 5.5.
Este script simple se basa en las fuentes que he enumerado en mi otra respuesta, la que fue eliminada por el moderador studiohack. Si está interesado, solo pídale que lo recupere.
fuente