2011-12-03 13 views
9

¿Hay alguna forma de combinar dos operaciones en una combinación de teclas (no creo que funcione con la función)?Encuadernación compleja en bash

Esto es lo que me gustaría hacer:

me gustaría una combinación de teclas (Ctrl-X dicen) a -

  1. insertar un texto, a continuación,
  2. invocar al completo o menú completo, utilizando el texto insertado como base para la realización

sé que puedo (en ~/.inputrc) especificar

  • inserción de texto con (C-X: "ls")
  • Ejecutar comandos de readline (C-SPACE: menu-complete)

pero no estoy seguro de cómo poner estos juntos

Respuesta

13

El truco para esto es llamar a funciones que vuelven a enlazar sus claves. En mi ejemplo usaré C-b para insertar texto y llamar al menú completo, en lugar de C-x. Tendrá que sacrificar una clave, en mi ejemplo C-t

In.bashrc, o un archivo de golpe a ser de origen

set_Cb_to_insert_text() { 
    bind '"\C-m": accept-line' 
    bind '"\C-b":"ls \C-t1"' 
    bind -x '"\C-t1":set_Cb_to_complete' 
} 
set_Cb_to_complete() { 
    bind '"\C-m":"\C-t2\C-t3"' 
    bind '"\C-b": menu-complete' 
    bind '"\C-t2": accept-line' 
    bind -x '"\C-t3":set_Cb_to_insert_text' 
} 
set_Cb_to_insert_text 

¿Cómo funciona esto:

Con bind, puede enlazar claves para hacer una de tres cosas, pero ninguna combinación de ellos:

  • ejecutar un comando readline: bind '"key": command'
  • ejecutar una serie de pulsaciones de teclas: bind '"key":"keystrokes"'
  • ejecutar un comando shell: bind -x '"key": shell-command'

Así que si usted quiere combinar estas tres cosas, que necesita para unirse a cada uno por separado a una combinación de pulsaciones de teclas (en mi ejemplo Ct {1 ,2, 3 }) y enlaza una tecla para ejecutar todas estas teclas.

En el ejemplo:

C-b primeros insertos ls y 'prensas' C-t , que ejecuta set_Cb_to_complete, que a su vez vuelve a enlazar C-b a menu-complete. También vuelve a enlazar Cm, retorno de carro, o Introduzca, ya que ahora tiene que hacer dos cosas: Aceptar la línea, y restablecer Cb para insertar ls, llamando a la función set_Cb_to_insert_text, que también restablece Introduzca a es uso normal.

La razón por la que dijo que Ct tuvo que ser "sacrificado", es que si pulsa Ct, readline esperar a ver si se va a presionar 1 o 2, o cualquiera de la tecla cota secuencias, antes de que tome cualquier acción. Pero cuando usa C-t para este uso, puede usarlo como una clave inicial para una gran cantidad de teclas para cubrir todos sus trucos de readline.

Un consejo: Mientras que usted está escribiendo y probando estos, enlazar una clave alternativa a accept-line, porque de repente algo se rompe la cadena en el lugar equivocado, y que están atrapados en un terminal sin una manera de ejecutar comandos :)

+0

muchas gracias por la idea, el ejemplo y la respuesta detallada (enrevesado, sí, pero trabajó en el marco de bash + readline y sus limitaciones). Más de un año después de mi publicación, solo puedo recordar vagamente lo que estaba tratando de hacer en el panorama general ... así que solo verifiqué que su ejemplo funciona, pero invertiré más tiempo recreando lo que estaba tratando de lograr previamente. ¡Gracias! – nhed

4

Esto podría funcionar para usted:

"\ex": menu-complete 
"\ez": "ls \ex" 

Incluya estas líneas en su archivo ~/.inputrc.

Estas líneas establecen Alt-x a menu-complete y Alt-z a lsspacemenu-complete. Esto le dará el primer archivo en el directorio y usar Alt-x para recorrer el resto uno a la vez.

Consulte here para ver más ejemplos de macros.

Verifique los comandos readline invocando bind -p o bind -P y bind -s le mostrará las macros que ya tiene. Consulte here para el comando de vinculación, también puede crear macros también, consulte here. Por último, compruebe que se está leyendo el archivo .inputrc, tuve problemas porque la variable del entorno se configuró en /etc/Inputrc y nunca se invocó mi versión personal.

BTW manténgase alejado de Control-x, ya que está en uso para muchos comandos readline.

+0

Esto casi hace el truco pero requiere 2 combinaciones de teclas para las llamadas siguientes. Ya tenía el conocimiento de cómo vincular la inserción de texto y cómo vincular el menú completo ... Si "Alt-z" una segunda vez me gustaría que la pantalla muestre 'ls ', pero en su lugar veo 'ls ls '... – nhed

+0

Esto implicaría (y puedo estar equivocado aquí), que desea la misma combinación de teclas para alternar su acción. Al leer la documentación de la biblioteca readline, los únicos preceptos condicionales se refieren a 'modo', es decir, bash, emacs, ftp ... Tal vez en este caso necesite escribir una nueva función readline ver [aquí] (http: // cnswww) .cns.cwru.edu/php/chet/readline/readline.html # SEC23). Por cierto, mire de esta manera ... Alt-x y Alt-z no están a un millón de millas de distancia (bueno, no en mi teclado) y una combinación de teclas para menú completo es útil en general. – potong

+0

En realidad, en mi mac, los keycombos que mencionas solo están respondiendo a Esc-x, Esc-z, y al final el "\ ex" final no parece realmente hacer nada – nhed