En bash, es bastante fácil configurar la finalización personalizada de argumentos de comando utilizando el complete
incorporado. 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 foo
y 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 loc
TAB→ localc
. Y mi hermano, que me hizo preguntar esto, lo quiere con mplayer).
fuente
loc
alocalc
? 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
,lockfile
o 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 -I
exactamente 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/loc
con: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 | column
mano 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
complete
funció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
PATH
en 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_ foo
que 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
$PATH
variable.fuente
mplayer
que ya está en su$PATH
y quieren algo comomp<tab>
producirmplayer
, en lugar de todos los binarios que comienzan conmp
(p. Ej.,mpage
mpcd
mpartition
mplayer
Etc.)