Como posso evitar conflitos em atalhos de teclado zsh?

2

Eu gostaria de ligar uma função a Ctrl g Ctrl b em zsh.

gb-widget() { echo "geebee" }
zle     -N     gb-widget
bindkey '^G^B' gb-widget

Isto não funciona com Ctrl g Ctrl b , mas funciona bem com outros atalhos arbitrários ( Ctrl g Ctrl x , por exemplo). Talvez o problema seja que Ctrl b já esteja com alias para backward-char :

$ bindkey | grep -F '^B'
"^B" backward-char
"^G^B" gb-widget

Eu gostaria de manter essa ligação do emacs Ctrl b , no entanto. Existe uma maneira de fazer isso funcionar?

    
por Sasgorilla 11.08.2018 / 22:42

1 resposta

0

O motivo da natureza do problema "às vezes funciona / às vezes não funciona" pode ser devido a $KEYTIMEOUT .

Quando você pressiona uma tecla que faz parte de uma sequência de vários caracteres vinculada no mapa de teclas atual, o comando zsh aguarda $KEYTIMEOUT milésimos de segundo para pressionar uma segunda tecla. Por padrão, ele é definido para um valor de 40. Isso está documentado no manual do zsh .

Portanto, se você pressionar ^G , terá 40ms para pressionar ^B , caso contrário, os dois pressionamentos de tecla serão interpretados como tendo sido inseridos separadamente e não como parte de uma sequência.

Você pode obviamente alterar o valor de $KEYTIMEOUT , por exemplo para torná-lo mais longo para que você tenha mais tempo para pressionar a segunda tecla.

(Note que isto pode ter efeitos secundários, por exemplo, se você estiver no modo de inserção vi e tentar pressionar ESC para ir para o modo de comando vi, o shell irá esperar por $KEYTIMEOUT milissegundos porque existem atalhos de teclado com vários caracteres que começam com ESC - principalmente as teclas de seta!)

    
por 01.11.2018 / 09:57