2

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

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

Это не работает с Ctrl g Ctrl b, но прекрасно работает с другими произвольными сочетаниями клавиш (например, Ctrl g Ctrl x ). Возможно, проблема в том, что Ctrl b уже имеет псевдоним backward-char:

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

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

1 ответ1

0

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

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .