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 :)
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