Wie kann ich Konflikte in zsh-Tastenkombinationen vermeiden?

403
Sasgorilla

Ich möchte eine Funktion CtrlgCtrlbin zsh binden .

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

Dies funktioniert nicht mit CtrlgCtrlb, aber es funktioniert gut mit anderen beliebigen Tastenkombinationen ( CtrlgCtrlxzum Beispiel). Vielleicht besteht das Problem darin, dass Ctrlbbereits ein Alias ​​vorliegt backward-char:

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

Ich möchte diesen Emacs jedoch Ctrlbverbindlich halten . Gibt es eine Möglichkeit, wie ich diese Arbeit machen kann?

2
Es funktioniert gut auf meiner Maschine. Haben Sie mit einer leeren Konfiguration begonnen (`zsh -f` ohne dsoh-my-zsh und so weiter!)? Hast du es mit einem anderen Terminalemulator versucht? xterm und urxvt funktionieren gut. mpy vor 6 Jahren 0
Das funktioniert jetzt auch für mich. Ich bin nicht sicher, was das anfängliche Problem ist. Wenn ich es reproduzieren kann, werde ich diese Frage aktualisieren, um das wiederzugeben. Sasgorilla vor 6 Jahren 0
Ok, jetzt funktioniert '^ G ^ B' korrekt und ich sehe das Problem stattdessen mit einer '^ G ^ C'-Verknüpfung. Ich sehe keine widersprüchlichen "^ C" -Kürzel, also war das ein roter Hering. Das `^ G ^ C` bleibt bei` zsh -f` bestehen. Im Moment bin ich ein Rätsel, was dazu führt, dass einige Tastenkombinationen fehlschlagen, während ähnliche funktionieren. Sasgorilla vor 6 Jahren 0
Nur spekulieren: Vielleicht funktioniert 'CTRL-C' nicht, weil es normalerweise ein 'SIGINT'-Signal sendet. mpy vor 6 Jahren 0

1 Antwort auf die Frage

0
wjv

Der Grund für die manchmal arbeitende / manchmal nicht funktionierende Natur dieses Problems könnte in der Ursache liegen $KEYTIMEOUT.

Wenn Sie eine Taste drücken, die Teil einer Sequenz aus mehreren Zeichen ist, die in der aktuellen Keymap eingebunden ist, wartet zsh $KEYTIMEOUTMillisekunden, bis Sie eine zweite Taste drücken. Standardmäßig ist der Wert 40 festgelegt. Dies ist im Handbuch zsh dokumentiert .

Wenn Sie also drücken ^G, haben Sie 40 ms Zeit, um die Taste zu drücken ^B. Andernfalls werden die beiden Tastendrücke als separat eingegeben interpretiert und nicht als Teil einer Sequenz.

Sie können den Wert von natürlich ändern $KEYTIMEOUT, z. B. um ihn länger zu machen, sodass Sie mehr Zeit haben, die zweite Taste zu drücken.

(Beachten Sie, dass dies Anstoßeffekte haben kann, z. B. wenn Sie sich im vi-Einfügemodus befinden und versuchen, ESCzum vi-Befehlsmodus zu drücken, wartet die Shell auf $KEYTIMEOUTMillisekunden, da es mehrteilige Tastenkombinationen gibt, die mit ESC- insbesondere Pfeil - beginnen Schlüssel!)