El Ctrl +Z La secuencia es manejada por la terminal, no por el shell. (Antecedentes útiles:¿Cuál es la diferencia exacta entre un 'terminal', un 'shell', un 'tty' y una 'consola'?)
Solo un pequeño conjunto de funciones no extensibles se puede vincular a una tecla en una terminal. Puede personalizar las teclas vinculadas a estas funciones pero no agregar otra función. Estas funciones se dividen en tres categorías:
- Edición de la línea de comandos en programas que no proporcionan los suyos propios (modo canónico, también llamado modo cocinado (por oposición al modo sin procesar), que rara vez usará en la práctica):fin de archivo (
eof
, Ctrl +D ), fin de línea (eol
, Ctrl +M ), borrar carácter a la izquierda (erase
, Ctrl +H ), borrar palabra a la izquierda (werase
, Ctrl +W ), borrar línea (kill
, Ctrl +U ). - Control de flujo manual:
stop
(Ctrl +S ),start
(Ctrl +Q ). Solo es útil en terminales seriales antiguos que pierden caracteres cuando el terminal no puede seguir el ritmo de la computadora o viceversa. - Señalización:interrupción (
intr
, Ctrl +C ), forzar salida (quit
, Ctrl +\ ), suspender (Ctrl +Z ).
Algunos sistemas, incluido Linux, amplían esa lista, pero nunca he visto uno que incluyera el fondo. Tenga en cuenta que necesitaría soporte tanto en el controlador de terminal en el kernel como en el emulador de terminal. Así que tienes que conformarte con suspender, que envía al trabajo en primer plano una señal SIGTSTP. Esto desencadena un SIGCHLD en el proceso principal del líder del trabajo en primer plano, que suele ser el shell. Cuando el shell recibe SIGCHLD, llama a waitpid
para averiguar por qué se notificó y, al detectar que se suspendió un trabajo en segundo plano, muestra una notificación (por ejemplo, [1] + 12345 suspended mycommand
) y un mensaje nuevo.
Podrías programar el shell para enviar un SIGCONT
señal al trabajo en primer plano. No creo que zsh tenga un gancho para eso, necesitarías parchear el código fuente. Y no hay forma de que zsh sepa si realmente querías interrumpir el programa (vaya, este programa puede estar haciendo algo incorrecto, déjame suspenderlo mientras lo soluciono) o ponerlo en segundo plano.
Lo que hago es establecer el Ctrl +Z secuencia de teclas en zsh para poner en segundo plano el trabajo actual (%%
). De esa manera, puedo enviar el trabajo de primer plano al segundo plano presionando Ctrl +Z Ctrl +Z . Mientras estoy en eso, hago Ctrl +Z haga otra cosa útil cuando la línea de entrada actual no esté vacía (por lo que no acabo de regresar de un subproceso):"suspender" la línea de entrada actual, permitiéndome escribir otro comando, después de lo cual la línea interrumpida se vuelve a colocar en el búfer de entrada.
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
bg
zle redisplay
else
zle push-input
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z
^z ^z como zsh anterior es posible en bash, aunque es un poco confuso y no lo he ejecutado por mucho tiempo:
- En tu .inputrc incluye el mapeo
"\C-z": "bg\n"
- En la variable bash de PS0, incluya `$(stty susp ^z)'
- En la variable bash PROMPT_COMMAND incluya 'stty susp ^@'
por lo tanto, ^z para suspender se activa cuando se ejecuta un comando, luego se desactiva para el aviso de bash.