
Eu tenho explorado terminfo
e stty
. Se eu executar, stty -a|grep icanon
parece que o modo canônico está definido, mas se eu tentar desligá-lo stty -icanon
e verificar novamente, vejo que ainda está definido. Quando faço a mesma coisa no bash, consigo desabilitar o icanon, mas não noto nenhuma mudança no comportamento. Então eu tenho 2 perguntas; por que não consigo desativar o icanon no zsh e como isso afetaria o comportamento, se pudesse?
Responder1
Quando faço a mesma coisa no bash, consigo desabilitar o icanon, mas não noto nenhuma mudança no comportamento.
Isso porque o bash ativa o modo canônicodesligadoao ler comandos do usuário (para poder implementar recursos de edição de linha não oferecidos pelo driver do terminal - como inserir texto, mover o cursor para a esquerda e para a direita com as teclas de seta, etc.), e entãorestauraas configurações anteriores do terminal ao executar qualquer linha de comando.
Para ver seu efeito, execute um comando externo como cat
:
bash$ stty -icanon
bash$ cat
hheelloo
Cada chave será repetida, uma vez porque stty echo
está ativada e uma vez porque cat
irá lê-la e escrevê-la imediatamente, em vez de ter que esperar pelas linhas completas.
[com zsh] se eu tentar desligá-lo
stty -icanon
e verificar novamente, vejo que ainda está configurado.
Ao restaurar as configurações anteriores do terminal conforme descrito acima, zsh
também está aplicandoalguns padrões sensatos(que incluem as configurações echo
e icanon
). Provavelmente é porque assume que, se um comando sair do modo canônicodesligadoao encerrar, foi apenas um acidente (por exemplo, quando um aplicativo em tela cheia travou vi
ou less
travou).
Não consegui encontrar nenhuma zsh
opção que fizesse funcionar como bash
(e como qualquer outro programa usando a biblioteca readline), mas se você quiser desligar o modo icanon antes de executar um comando, você pode fazer isso chamando stty de a mesma linha de comando:
zsh$ stty -icanon; cat
hheelloo