En bash, ¿cómo vinculo una tecla de función a un comando?

91

Ejemplo: Quiero vincular la F12clave al comando de echo "foobar"modo que cada vez que presione F12el mensaje "foobar" se imprima en la pantalla. Idealmente, podría ser cualquier comando de shell arbitrario, no solo incorporados. ¿Cómo se hace esto?

SiegeX
fuente

Respuestas:

163

Puede determinar la secuencia de caracteres emitida por una tecla presionando Ctrl- ven la línea de comando, luego presionando la tecla que le interesa. En mi sistema F12, obtengo ^[[24~. El ^[representa Esc. Diferentes tipos de terminales o emuladores de terminales pueden emitir diferentes códigos para la misma clave.

En un indicador de Bash, puede ingresar un comando como este para habilitar la macro clave y poder probarla.

bind '"\e[24~":"foobar"'

Ahora, cuando presione F12, obtendrá "foobar" en la línea de comando listo para editarlo más. Si desea que una pulsación de tecla ingrese un comando inmediatamente, puede agregar una nueva línea:

bind '"\e[24~":"pwd\n"'

Ahora, cuando presione F12, verá el directorio actual sin tener que presionarEnter . ¿Qué pasa si ya ha escrito algo en la línea y usa esto que se ejecuta automáticamente? Podría ensuciarse. Sin embargo, puede borrar la línea como parte de su macro:

bind '"\e[24~":"\C-k \C-upwd\n"'

El espacio asegura que el Ctrl - utenga algo que borrar para evitar que suene la campana.

Una vez que haya conseguido que la macro funcione como desea, puede hacerla persistente agregándola a su ~/.inputrcarchivo. No es necesario el bindcomando o el conjunto externo de comillas simples:

"\e[24~":"\C-k \C-upwd\n"

Editar:

También puede crear una combinación de teclas que ejecutará algo sin alterar la línea de comando actual.

bind -x '"\eW":"who"'

Luego, mientras escribe un comando que requiere un nombre de usuario, por ejemplo, y necesita saber los nombres del usuario que inició sesión, puede presionar Alt- Shift- Wy la salida dewho se mostrará y se volverá a emitir el mensaje. con su comando parcial intacto y el cursor en la misma posición en la línea.

Desafortunadamente, esto no funciona correctamente para claves como las F12que generan más de dos caracteres. En algunos casos, esto se puede solucionar.

El comando ( whoen este caso) podría ser cualquier ejecutable: un programa, script o función.

Pausado hasta nuevo aviso.
fuente
2
¿Qué pasa si quiero agregar un enlace a "ctrl + q"?
kubudi
5
@kubudi: bind '"\C-q": menu-complete'por ejemplo (o en su ~/.inputrc: "\C-q": menu-complete). También puede ser necesario stty -ixonen su ~/.bashrca desactivar el control de flujo y hacer ^ ^ Q y S disponible.
Pausado hasta nuevo aviso.
Dices que ^[representa escy luego pareces sustituirlo \een tu ejemplo. ¿Podría explicar por qué, por favor?
Remover
1
@Remover: ^[es la representación de salida. El \ees una manera de entrar en él ( ^[no funciona para eso).
Pausado hasta nuevo aviso.
¿Cómo puedo enlazar "\ Cz"? Me encantaría obtener algo como lo que se describe para zsh en sheerun.net/2014/03/21/how-to-boost-your-vim-productivity
pkoch
19

Puede definir vinculaciones de teclas bash en ~/.inputrc (archivo de configuración para la biblioteca GNU Readline). La sintaxis es

<keyym o nombre de la clave>: macro

por ejemplo:

Control-o: "> output"

creará una macro que inserta "> salida" cuando presiona ControlO

 "\e[11~": "echo foobar"

creará una macro que inserta "echo foobar" cuando presiona F1... No sé cuál es el significado de la clave F11.

Editar:

.inputrccomprende la \nsecuencia de escape para el salto de línea, por lo que puede utilizar

 "\e[11~": "echo foobar\n"

Lo que efectivamente 'presionará enter' después de que se emita el comando.

Barton Chittenden
fuente
4
puede usar "\ n" dentro de una macro, para agregar un carácter de nueva línea:
Barton Chittenden
Esto funciona mejor para mí ya que define la asignación de teclas al abrir una terminal.
Heldraug
Para Alt, use \e, por ejemplo "\eo": "> output".
Jānis Elmeris
Para obtener un tutorial más detallado sobre el uso, .inputrcconsulte hackaday.com/2018/01/19/linux-fu-custom-bash-command-completion
Josh Habdas
1
@ArthurHenriqueDellaFraga He editado la respuesta; estará en su directorio personal. Si no existe, puede crearlo.
Barton Chittenden
7

Esta solución es específica para entornos X11 y no tiene nada que ver con bash, pero agrega lo siguiente a su .Xmodmaps

 % loadkeys
 keycode 88 = F12
 string F12 = "foobar"
 %

enviará la cadena "foobar" a la terminal al presionar F12.

Wesley Rice
fuente
Tenga en cuenta que esto no es lo mismo que el shell que ejecuta un comando. Si realmente desea ejecutar un comando, tendrá que presionar enter (o hacer que la cadena enviada lo haga por usted). Probablemente también quiera estar seguro y despejar la línea primero.
Cascabel
2
Esto sería genial, pero no parece funcionar a partir de Fedora 20 de todos modos. Incluso intenté usar xev para encontrar primero el código clave apropiado para F12 (en mi caso, 96) y usarlo en lugar de 88. Ninguno de los dos funciona.
BobDoolittle
2

Quería unirme Ctrl+Ba un comando. Inspirado por una respuesta anterior, traté de usar bindpero no pude averiguar qué serie de garabatos crípticos ( \e[24~?) Se traducen enCtrl+B .

En una Mac, vaya a Configuración de la aplicación Terminal, Perfiles -> Teclado -> +luego presione el atajo de teclado que está buscando y aparecerá. Para mí Ctrl+Bresultó en el \002que me comprometí con éxito a mandar

bind '"\002":"echo command"'

Además, si desea que el comando se ejecute de inmediato (no solo se inserte en el símbolo del sistema), puede agregar Enter al final de su comando, así:

bind '"\002":"echo command\015"'

Peter Perháč
fuente