bash bash-completion

bash - Obteniendo “completo” y “menú completo” para trabajar juntos



bash-completion (4)

Descubrí que el shell Bash admite un tipo de autocompletado que es diferente del autocompletado "tradicional", donde todas las posibilidades se enumeran en la siguiente línea.

Con el autocompletado "tradicional", si escribo ch y luego presiono la tecla Tab , obtengo algo como:

$ ch chacl chgrp chmod chown chvt

Pero si agrego la siguiente línea a mi /etc/inputrc (que vuelve a asignar la tecla Tab a la función integrada de menu-complete ):

Tab: menu-complete

luego, el comportamiento del shell cambia: la palabra a completar se reemplaza "en línea" con una única coincidencia de la lista de posibles terminaciones, y si presiono la tecla Tab nuevamente, la palabra se reemplazará con la siguiente coincidencia.

Encontré esto útil, pero todavía quería mantener el autocompletado tradicional y tenerlo vinculado a la combinación de Ctrl + Tab . Así que agregué la siguiente línea a mi /etc/inputrc , de acuerdo con lo que sugiere la documentación de la biblioteca readline :

Ctrl-Tab: complete

Sin embargo, agregar esta línea solo parece hacer que tanto Tab como Ctrl-Tab llamen a la función complete tradicional.

¿Alguien sabe lo que estoy haciendo mal?

¡Gracias por adelantado!


Lo siguiente debería lograr lo que estás buscando (¡si lo entiendo correctamente!)

En su .inputrc

# display all possible matches for an ambiguous pattern at first tab set show-all-if-ambiguous on # next tab(s) will cycle through matches TAB: menu-complete # shift tab cycles backward "/e[Z": menu-complete-backward


No estoy seguro de que Ctrl-Tab sea un personaje real; Mi terminal, por ejemplo, ignora la combinación. Creo que la única forma de usar Ctrl-Tab es usar el emulador de terminal para asignarlo a alguna secuencia de escape que no se usa, y luego vincular esa secuencia para complete .


Para empezar, no soy un gran experto en esta área, pero creo que puedo responder tu pregunta. En primer lugar, mientras usa Bash, Bash es un shell que interpreta los comandos del teclado que recibe de un terminal / consola. Mientras informa a Bash cómo reaccionar ante combinaciones de teclas específicas en el archivo inputrc, su Terminal determina con precisión qué carácter se ''envía'' al Shell antes de que el archivo inputrc ingrese en la ecuación.

Desafortunadamente, en mi sistema (concedido, es OSX, pero no creo que este sea un comportamiento extraño en comparación con Linux), tanto Tab como Ctrl-Tab envían la misma entrada de teclado al shell. De hecho, tanto Tab como Ctrl-Tab envían un comando Ctrl-I al shell y, de hecho, si ingreso Ctrl-I cuando uso el terminal, realiza la finalización como si presionara Tab.

El software (instalado en la mayoría de los sistemas Linux por defecto), showkey le dirá qué claves recibe el shell cuando presiona las entradas específicas del teclado cuando las presiona.

De todos modos, mi sugerencia para ti es usar Shift-Tab , que parece enviar su propio código de clave al shell. Shift-Tab en mi computadora aparece (usando showkey) como ''<ESC> [Z'', que creo que es bastante estándar en todos los ámbitos. Como tal, su archivo inputrc con los siguientes enlaces debería permitirle usar shift-tab en lugar de ctrl-tab para lograr lo que desea:

Tab: menu-complete "/e[Z": complete

La / e en el segundo enlace representa el carácter de escape, y la [Z son simplemente los caracteres como se muestra usando showkey. Puede obtener un efecto similar en OSX simplemente usando cat, ejecutando cat desde dentro de un terminal y presionando Shift-Tab le mostrará "^ [[Z", donde ^ [representa el carácter de escape y los otros caracteres son como antes.

Sé que esto no resuelve su pregunta con precisión, pero como no creo que pueda usar Ctrl-Tab como una combinación de teclas, sin volver a asignar Ctrl-Tab a otra combinación de teclas dentro de su terminal (es más probable que sea más fácil Si está utilizando un terminal GUI), ¡esto es lo más cercano posible sin un esfuerzo significativo!


Tengo Shift Tab enlazado a menu-complete-backward , por lo que retrocede un paso si omito la terminación correcta, y asigné Ctrl q para complete , así que si hay varias finalizaciones posibles, presiono Ctrl q para enumerarlas sin Teniendo que pasar por ellos.

# Make Tab cycle between possible completions # Cycle forward: Tab # Cycle backward: Shift-Tab TAB: menu-complete "/e[Z": menu-complete-backward # Make C-q display the list of possible completions Control-q: complete # Display the list of matches when no further completion is possible set show-all-if-unmodified on

Edición: Ctrl q está vinculado a quoted-insert con quoted-insert de forma predeterminada, es decir, le dice al shell que tome la siguiente clave literalmente. quoted-insert también está vinculado a Ctrl v , por lo que no perderá esa funcionalidad si vuelve a enlazar Ctrl q . De todos modos, he encontrado que Alt ESC también funciona, por defecto, para mostrar las posibles terminaciones (por lo que puedo decir que es equivalente a TAB ); tenga en cuenta que Gnome puede aprovecharla, luego presione dos veces la tecla ESC o vuelva a enlazar "Cambiar ventanas directamente" en Configuración → Dispositivos → Teclado → Navegación.