Как я могу избежать конфликтов в сочетаниях клавиш Zsh?

332
Sasgorilla

Я хотел бы привязать функцию к CtrlgCtrlbZsh.

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

С этим не работает CtrlgCtrlb, но он отлично работает с другими произвольными сочетаниями клавиш ( CtrlgCtrlxнапример). Может быть, проблема в том, что Ctrlbуже есть псевдоним backward-char:

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

Я хотел бы сохранить этот emacs Ctrlbобязательным, хотя. Есть ли способ, которым я могу сделать эту работу?

2
Это нормально работает на моей машине. Вы начали с пустого конфига (`zsh -f` без всяких d'oh-my-zsh и т. Д!)? Вы пробовали с другим эмулятором терминала? xterm и urxvt работают нормально. mpy 6 лет назад 0
Теперь это хорошо работает и для меня. Я не уверен, что начальная проблема; если я смогу воспроизвести это, я обновлю этот вопрос, чтобы отразить это. Sasgorilla 6 лет назад 0
Хорошо, теперь `^ G ^ B` работает правильно, и вместо этого я вижу проблему с ярлыком` ^ G ^ C`. Я не вижу противоречивых сочетаний клавиш `^ C`, поэтому думаю, что это была красная сельдь. `^ G ^ C` сохраняется с` zsh -f`. На данный момент я озадачен тем, что приводит к сбою некоторых сочетаний клавиш, пока работают аналогичные. Sasgorilla 6 лет назад 0
Просто размышления: может быть, `CTRL-C` не работает, потому что обычно посылает сигнал` SIGINT`. mpy 6 лет назад 0

1 ответ на вопрос

0
wjv

Причиной этой проблемы может быть «иногда работает / иногда не работает» $KEYTIMEOUT.

Когда вы нажимаете клавишу, которая является частью многосимвольной последовательности, связанной в текущей раскладке, zsh ждет $KEYTIMEOUTмиллисекунд, пока вы не нажмете вторую клавишу. По умолчанию это значение равно 40. Это описано в руководстве по zsh .

Таким образом, если вы нажмете ^G, у вас будет 40 мс, чтобы нажать клавишу ^B, в противном случае два нажатия клавиш будут интерпретироваться как введенные отдельно, а не как часть одной последовательности.

Очевидно, что вы можете изменить значение $KEYTIMEOUT, например, чтобы увеличить его, чтобы у вас было больше времени для нажатия второй клавиши.

(Обратите внимание, что это может привести к эффектам включения, например, если вы находитесь в режиме вставки vi и пытаетесь нажать, ESCчтобы перейти в командный режим vi, оболочка будет ждать $KEYTIMEOUTмиллисекунды, поскольку существуют многосимвольные сочетания клавиш, начинающиеся с ESC- в частности, стрелки ключи!)