En bash, es bastante fácil configurar la finalización personalizada de argumentos de comando utilizando el completeincorporado. Por ejemplo, si, para un comando hipotético con una sinopsis de foo --a | --b | --c, podría hacercomplete -W '--a --b --c' foo
También puede personalizar la conclusión que se obtiene cuando se pulsa Taben un vacío rápida usando complete -E, por ejemplo, complete -E -W 'foo bar'. Luego, presionando tab en el indicador vacío solo sugeriría fooy bar.
¿Cómo personalizo la finalización de comandos en un indicador no vacío? Por ejemplo, si estoy sentado a las:
anthony@Zia:~$ f
¿Cómo personalizar la finalización para que presionar la pestaña siempre se complete foo?
(El caso real que me gustaría es locTAB→ localc. Y mi hermano, que me hizo preguntar esto, lo quiere con mplayer).
fuente

localocalc? Sugiero alternativas porque después de bastante tiempo cavando y buscando, no he encontrado una manera de personalizar la finalización de bash de esta manera. Puede que no sea posible.locate,locale,lockfileo cualquiera de las otras expansiones deloc. Quizás un mejor enfoque sería asignar una clave diferente a esa finalización específica.loc<TAB>->localc)?Respuestas:
La finalización del comando (junto con otras cosas) se maneja mediante la finalización de bash readline . Esto funciona a un nivel ligeramente más bajo que la "finalización programable" habitual (que se invoca solo cuando se identifica el comando y los dos casos especiales que identificó anteriormente).
Actualización: la nueva versión de bash-5.0 (enero de 2019) agrega
complete -Iexactamente este problema.Los comandos relevantes de readline son:
De manera similar a la más común
complete -F, algo de esto se puede transferir a una función mediante el usobind -x.Esto habilita sus propios enganches de cadena por comando o prefijo
~/.complete.d/. Por ejemplo, si crea un ejecutable~/.complete.d/loccon:Esto hará (aproximadamente) lo que espera.
La función anterior va hasta cierto punto para emular el comportamiento normal de finalización del comando bash, aunque es imperfecto (particularmente el dudoso equipaje de
sort | fmt | columnmano para mostrar una lista de coincidencias).Sin embargo , un problema no trivial con esto solo puede usar una función para reemplazar el enlace a la
completefunción principal (invocado con TAB por defecto).Este enfoque funcionaría bien con una combinación de teclas diferente utilizada solo para la finalización de comandos personalizados, pero simplemente no implementa la lógica de finalización completa después de eso (por ejemplo, palabras posteriores en la línea de comandos). Hacerlo requeriría analizar la línea de comando, tratar con la posición del cursor y otras cosas difíciles que probablemente no deberían considerarse en un script de shell ...
fuente
No sé si entendí tu necesidad de esto ...
Esto implicaría que tu bash solo conoce un comando desde el principio
f.Una idea básica de finalización es: si es ambiguo, imprima las posibilidades.
Por lo tanto, puede configurar su
PATHen un directorio que solo contenga este comando y deshabilitar todas las funciones internas de bash para que funcione.De todos modos, puedo darte también una especie de solución alternativa:
Entonces, si escribe
_ <Tab>, se completará a lo_ fooque se ejecutafoo.Pero, sin embargo
alias f='foo', sería mucho más fácil.fuente
Una respuesta simple para ti sería
solo las salidas básicas
simplemente agregue su programa deseado para completar automáticamente hasta completar bash
fuente
Ejecute el siguiente comando para encontrar dónde está instalado mplayer binary:
O use la ruta al binario mplayer si ya lo sabe, en el siguiente comando:
Idealmente, todo lo que escriba se busca en todos los directorios especificados en la
$PATHvariable.fuente
mplayerque ya está en su$PATHy quieren algo comomp<tab>producirmplayer, en lugar de todos los binarios que comienzan conmp(p. Ej.,mpagempcdmpartitionmplayerEtc.)