A seqüência Ctrl + Z é manipulada pelo terminal, não pelo shell. (Background útil: Qual é a diferença exata entre um 'terminal', um 'shell', um 'tty' e um 'console'? )
Apenas um conjunto pequeno e não extensível de funções pode ser vinculado a uma chave em um terminal . Você pode personalizar as chaves vinculadas a essas funções, mas não adicionar outra função. Essas funções se dividem em três categorias:
- Edição de linha de comando em programas que não fornecem o seu próprio (modo canônico, também chamado de modo cozido (por oposição ao modo raw), que você raramente usará na prática): fim do arquivo (
eof
, < kbd> Ctrl + D ), fim de linha (eol
, Ctrl + M ), apaga o caractere restante (erase
, Ctrl + H ), apaga a palavra à esquerda (werase
, Ctrl + W ), apaga linha (kill
, Ctrl + U ). - Controle de fluxo manual:
stop
( Ctrl + S ),start
( Ctrl + Q ). Útil apenas em terminais seriais antigos que eliminaram caracteres quando o terminal não conseguia acompanhar o computador ou vice-versa. - Sinalização: interromper (
intr
, Ctrl + C ), forçar a saída (quit
, Ctrl + \ ), suspender ( Ctrl + Z ).
Alguns sistemas, incluindo o Linux, estendem essa lista, mas eu nunca vi um que incluísse o plano de fundo. Observe que seria necessário suporte no driver de terminal no kernel e no emulador de terminal. Então você tem que se contentar com a suspensão, que envia o trabalho em primeiro plano um sinal SIGTSTP . Isso dispara um SIGCHLD no processo pai do líder do trabalho em primeiro plano, que geralmente é o shell. Quando o shell recebe o SIGCHLD, ele chama waitpid
para descobrir por que foi notificado e após a detecção de que um trabalho em segundo plano foi suspenso, ele exibe uma notificação (por exemplo, [1] + 12345 suspended mycommand
) e um novo prompt.
Você poderia programar o shell para enviar um sinal SIGCONT
para o trabalho em primeiro plano. Eu não acho que o zsh tenha um gancho para isso, você precisaria corrigir o código-fonte. E não há como o zsh saber se você realmente quis interromper o programa (oops, esse programa pode estar fazendo a coisa errada, deixe-me suspendê-lo enquanto eu o resolvo) ou fazer o background dele.
O que eu faço é definir a seqüência de teclas Ctrl + Z em zsh para o plano de fundo do trabalho atual ( %%
). Dessa forma, posso enviar o trabalho em primeiro plano para o plano de fundo pressionando Ctrl + Z Ctrl + Z . Enquanto faço isso, eu faço Ctrl + Z fazer outra coisa útil quando a linha de entrada atual não está vazia (então eu não acabei de voltar de um subprocesso ): “Suspende” a linha de entrada atual, permitindo que eu digite outro comando, após o qual a linha interrompida é colocada de volta no buffer 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