Ejemplo: Quiero unir la tecla F12 al comando echo "foobar"
de tal manera que cada vez que me golpeó F12 el mensaje "foobar" se imprimirá en pantalla. Idealmente, podría ser cualquier comando de shell arbitrario, no solo builtins. ¿Cómo se puede hacer esto?En bash, ¿cómo puedo vincular una tecla de función a un comando?
Respuesta
se puede determinar la secuencia de caracteres emitida por una clave pulsando Ctrl -. v en la línea de comandos, a continuación, pulsar la tecla que le interesa En mi sistema de F12, consigo ^[[24~
. El ^[
representa Esc. Los diferentes tipos de terminales o emuladores de terminal pueden emitir códigos diferentes para la misma clave.
En un indicador de Bash, puede introducir un comando como este para habilitar la macro de la clave para que pueda probarla.
bind '"\e[24~":"foobar"'
Ahora, al pulsar F12 , obtendrá "foobar" en la línea de comandos listos para su posterior edición. Si quieres un golpe de teclado para introducir un comando de inmediato, se puede añadir una nueva línea:
bind '"\e[24~":"pwd\n"'
Ahora al pulsar F12 , obtendrá el directorio actual que se muestra sin tener que pulsar 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, se puede borrar la línea como parte de su macro:
bind '"\e[24~":"\C-k \C-upwd\n"'
El espacio se asegura de que el Ctrl - u tiene algo que eliminar para mantener la campana suene.
Una vez que haya conseguido que la macro funcione como desea, puede hacer que sea persistente al agregarla a su archivo ~/.inputrc
.No hay necesidad de que el comando bind
o el conjunto exterior de comillas simples:
"\e[24~":"\C-k \C-upwd\n"
Editar:
También puede crear una clave de unión que se ejecutará algo sin molestar a la línea de comandos actual.
bind -x '"\eW":"who"'
A continuación, mientras se está escribiendo un comando que requiere un nombre de usuario, por ejemplo, y lo que necesita saber los nombres de usuario que ha iniciado sesión, puede pulsar Alt - Shift - W y se mostrará la salida de who
y el aviso se volverá a emitir 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 F12 que producen más de dos caracteres. En algunos casos esto se puede solucionar.
El comando (who
en este caso) podría ser cualquier ejecutable: un programa, script o función.
Esta solución es específica para entornos x11 y no tiene nada que ver con la fiesta, pero añadiendo lo siguiente a sus .Xmodmaps
% loadkeys
keycode 88 = F12
string F12 = "foobar"
%
enviará la cadena "foobar" al terminal al chocar contra F12.
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
Esto sería increíble, pero parece que no funciona 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
Puede definir enlaces de teclas bash en .inputrc (archivo de configuración para la biblioteca GNU Readline). La sintaxis es
< keysym o tecla del nombre >: Macro
por ejemplo:
Control-o: "> output"
va a crear una macro que inserta "> salida" cuando se presiona
"\e[11~": "echo foobar"
se crea una macro que inserta "echo foobar" cuando presionas F1 ... No sé qué teclados para F11 está disponible.
Bien, pero esto solo "se inserta", ¿correcto? –
puede usar "\ n" dentro de una macro, para agregar un carácter de línea nueva: –
Esto funciona mejor para mí, ya que define la asignación de teclas al abrir un terminal. – Heldraug
- 1. Cómo vincular una clave a sigkill en bash?
- 2. ¿Puedo vincular una propiedad del componente Flex a una función?
- 3. ¿Cómo vincular el botón WPF a un comando en ViewModelBase?
- 4. ¿Cómo puedo vincular una ObservableCollection de ViewModels a un MenuItem?
- 5. ¿Cómo puedo vincular un comando a C-i sin cambiar TAB?
- 6. ¿Cómo puedo vincular una ArrayList a un PreparedStatement en Oracle?
- 7. ¿Cuándo puedo vincular una función a otro nombre?
- 8. En Bash, ¿cómo se accede a los argumentos de línea de comando dentro de una función?
- 9. Cómo obtener salida de un comando bash en una variable
- 10. tecla Comando tecla Meta en OS X Terminal.app
- 11. Tecla de comando en MacVim
- 12. ¿Cómo puedo vincular un ObservableCollection a TextBoxes en un DataTemplate?
- 13. ¿Cuántos argumentos puedo pasar a una función bash?
- 14. Ejecutar una función bash al ingresar a un directorio
- 15. ¿Puedo abortar el comando actual bash corriendo?
- 16. ¿Cómo puedo formatear la salida de un comando bash en columnas nítidas?
- 17. ¿Cómo puedo vincular un FormView ASP.NET a un solo registro?
- 18. ¿Cómo puedo vincular un GridView a un objeto personalizado?
- 19. ¿Puedo vincular un método existente a una Función LLVM * y utilizarlo desde el código compilado JIT?
- 20. ¿Cómo puedo ejecutar una función bash usando sudo?
- 21. Construyendo dinámicamente un comando en bash
- 22. En backbone.js, ¿cómo puedo vincular una clave al documento
- 23. comando bash para copiar archivos de una computadora a otra
- 24. Cómo pasar una matriz a una función bash
- 25. ¿Cómo se ejecuta un comando en un sistema remoto en una secuencia de comandos de BASH?
- 26. ¿Cómo puedo asignar la salida de una función a una variable usando bash?
- 27. Ejecutando la función bash al comando de su
- 28. comando "sed" en bash
- 29. Cómo crear un pico de CPU con un comando bash
- 30. BASH cómo ejecutar un comando en la terminación del script?
¿Qué sucede si quiero agregar un enlace a "ctrl + q"? – kubudi
@kubudi: 'bind '" \ C-q ": menu-complete'' por ejemplo (o en su' ~/.inputrc': '" \ C-q ": menu-complete'). También puede necesitar 'stty -ixon' en su' ~/.bashrc' para deshabilitar el control de flujo y hacer que^S y^Q estén disponibles. –
Usted dice que '^ [' representa 'esc' y luego parece sustituirlo por' \ e' en su ejemplo. ¿Podrías explicar por qué por favor? – Remover