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

Ejemplo: Quiero vincular la tecla F12 con el comando echo "foobar" manera que cada vez que presiono F12, el mensaje “foobar” se imprima en la pantalla. Idealmente, podría ser cualquier comando de shell arbitrario, no solo builtins. ¿Cómo se puede hacer esto?

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

En un aviso de Bash puede ingresar un comando como este para habilitar la macro de la clave para que pueda probarla.

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

Ahora, cuando presione F12 , obtendrá “foobar” en la línea de comandos listo para una posterior edición. Si desea una pulsación de tecla para ingresar un comando inmediatamente, puede agregar una nueva línea:

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

Ahora cuando presione F12 , obtendrá el directorio actual sin tener que presionar Enter . ¿Qué sucede si ya ha escrito algo en la línea y lo usa de manera automática? Podría ser complicado. Sin embargo, puedes borrar la línea como parte de tu macro:

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

El espacio se asegura de que la Ctrlu tenga algo que eliminar para evitar que suene la campana.

Una vez que haya conseguido que la macro funcione de la manera que desee, puede hacerlo persistente al agregarla a su archivo ~/.inputrc . No es necesario el comando bind o el conjunto externo de comillas simples:

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

Editar:

También puede crear un enlace de clave que ejecutará algo sin alterar la línea de comando actual.

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

Luego, mientras está escribiendo un comando que requiere un nombre de usuario, por ejemplo, y necesita saber los nombres del usuario que está conectado, puede presionar AltShiftW y la salida de who se mostrará y la solicitud vuelva a emitirse con su comando parcial intacto y el cursor en la misma posición en la línea.

Desafortunadamente, esto no funciona correctamente para teclas como F12 que generan más de dos caracteres. En algunos casos esto se puede solucionar.

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

Puede definir enlaces de tecla bash en .inputrc (archivo de configuración para la biblioteca GNU Readline). La syntax es

: macro

por ejemplo:

 Control-o: "> output" 

creará una macro que inserta “> salida” cuando presiona

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

creará una macro que inserta “echo foobar” cuando presionas F1 … No sé qué teclados para F11 está disponible.

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

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

enviará la cadena “foobar” a la terminal al presionar F12.

Quise vincular Ctrl+B a un comando. Inspirado por una respuesta anterior, traté de usar bind pero no pude descifrar qué series de garabatos crípticos ( \e[24~ ?) Se traducen en Ctrl+B

En una Mac, vaya a Configuraciones de la aplicación Terminal, Perfiles -> Teclado -> + luego presione el atajo de teclado que está buscando y saldrá. Para mí, Ctrl+B dio como resultado \002 cual logré controlar

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

Además, si desea que el comando se ejecute inmediatamente (no solo se inserta en el indicador), puede agregar el Enter al final de su comando, de esta forma:

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