A tecla ESC causa um pequeno atraso no terminal devido ao seu comportamento Alt +

67

Minha configuração do terminal é gnome-terminal + tmux + zsh com ligações do vi.

Em aplicativos como o vim ou mesmo no modo de edição da linha de comando vi do zsh, preciso pressionar a ESCtecla frequentemente, mas há um pequeno atraso antes que os efeitos dessa chave ocorram. Veja GNU Screen torna a tecla ESC do Vim lenta

Após algumas experiências, descobri que pressionar a ESCtecla e imediatamente outra tecla (digamos b) tem o mesmo efeito que pressionar Alt+b. Não sei por que esse é o caso (provavelmente por motivos de legado, quando não havia Alt? Não sei). De qualquer forma, tenho duas Altchaves e não quero esse comportamento com a minha ESCchave. Eu tentei com C+[e é o mesmo problema com isso também.

Não tenho certeza de quem é responsável por isso, gnome-terminal ou tmux ou meu próprio sistema operacional (Ubuntu Natty). Qualquer idéia de como lidar com isso seria ótimo.

Atualização : verifiquei sem tmux em um terminal diferente (LXTerminal) e o atraso também está presente lá.

Shrikant Sharat
fonte
11
Eu não conseguia descobrir por que meu vim estava agindo de forma estranha. Esta pergunta me fez lembrar que eu tinha começado a usá-lo na tela. Você salvou minha sanidade.
Pab

Respostas:

111

Aqui está uma correção real. Adicione o seguinte a .tmux.conf:

set -s escape-time 0
Vicent Marti
fonte
4
Brilhante, obrigado! Teve um atraso ao sair do modo de inserção no vim e realmente não tinha pensado que poderia estar interferindo no tmux. Isso fez o truque
actionshrimp
7
Como mencionado em superuser.com/questions/252214/…, eu tive que fazer tmux kill-serverisso para entrar em vigor.
PhilT
Para quem chegou a esta página tentando entender por que há um atraso ao alternar do modo de inserção para o modo de comando enquanto usa o modo vi no bash, consulte superuser.com/a/1161871/236677
Kvass
3
Você pode recarregar o arquivo de configuração abrindo o prompt de comando dentro do tmux com tmux-prefix(padrão Ctrl+b) seguido por :e digitando source-file $HOME/.tmux.conf.
Folfy
7

O atraso é causado pelas rotinas de entrada que podem ter que decidir se uma tecla de função foi pressionada ou não. Para isso, a rotina de entrada inicia um temporizador sempre que lê em um caractere ESC. Os caracteres que são lidos da entrada antes que o temporizador se esgote (digamos um décimo de segundo) são então interpretados como sequência ESC de uma tecla de função e essa sequência ESC será comparada com seqüências conhecidas de secuências ESC do terminfo ou do base de dados termcap (depende de quais rotinas de baixo nível são usadas).

É claro que isso é irritante para aplicativos em que o ESC é usado por si só, mas não conheço nenhuma solução alternativa para isso.

Em relação à sua pergunta com o comportamento de ESC a= Meta a:

Meta chaves não estavam disponíveis em todos os teclados. Como solução alternativa, muitas vezes era permitido usar a tecla ESC para pressionar antes da outra tecla.

ktf
fonte
Obrigado pela explicação ktf. O atraso não está presente no gvim, apenas no terminal (verifiquei sem tmux e o atraso ainda está lá).
Shrikant Sharat
O gvim não sofre com esse problema, porque obtém as informações sobre qual tecla foi pressionada no servidor X11 (para que não precise analisar sequências ESC).
Ktf # 24/11
Ok, então eu preciso fazer meu terminal gnome se comportar da mesma maneira.
Shrikant Sharat
o gnome-terminal não é o problema - o problema descrito afeta apenas programas em execução em um terminal (ou em uma emulação de terminal) e precisa analisar as teclas de função. Você experimentará o mesmo comportamento, se tentar o xterm ou o KDE-Terminal, por exemplo.
Ktf #
2
"As teclas meta não estavam disponíveis em todos os teclados. Como solução alternativa, muitas vezes era permitido usar a tecla ESC para pressionar antes da outra tecla." Talvez até antes disso, os ttys geralmente tivessem apenas interfaces de dados de sete bits; não havia oitavo "meta bit", então você tinha que enviar um ESC para o Meta. E hoje em dia o UTF-8 é generalizado, portanto, mesmo com conexões de oito bits, você não pode usar o alto para o Meta.
Chris Page
3

Embora isso possa não corrigir diretamente o seu problema, descobri que posso usá-lo <Ctrl> cpara sair do modo de inserção. Isso também pode ser usado para sair da rolagem de tela do tmux (que pode ser chamada usando <leader> PgUP)

dtyler
fonte
3
Eu não recomendaria o uso <C-c>para sair do modo de inserção no uso regular, pois ele não executa o InsertLeavecomando automático que alguns plugins podem estar assistindo. Veja :h i_CTRL-C.
Shrikant Sharat