6

Я настроил zsh для использования сочетаний клавиш vi. Я заметил неожиданное поведение с "побег". В vim (я не тестировал vanilla vi), если я дважды нажимаю escape, я могу нажать "i" один раз, чтобы вернуться в режим вставки. В zsh, если мне удастся дважды нажать escape, нажатие "i" не вернет меня в режим вставки, я должен нажать дважды. Еще один пример этого возникает в навигации. Если я нажму клавишу escape один раз, я могу использовать «^» и «$», как и ожидалось. Но если я случайно нажал escape (дважды или более), они не будут работать, пока я не вернусь в режим вставки и не уйду снова.

У меня как-то неправильно настроен zsh, или это просто известная разница в эмуляции zsh vi?

3 ответа3

3

Я тоже это понимаю. Я не заметил этого раньше, так как я обычно использую привязки emacs в своей оболочке. Кажется, что с привязками по умолчанию, использование клавиши escape в режиме vicmd съедает следующий символ. Похоже, что это может быть ошибка в обработке неопределенных ключей.

Я смог обойти эту проблему, определив привязку noop для клавиши escape в режиме vicmd, используя:

noop () { }
zle -N noop
bindkey -M vicmd '\e' noop
2

У меня недостаточно репутации, чтобы отвечать на ответ qqx, поэтому мне просто нужно подать отдельный ответ:

Это не ошибка; происходит следующее: когда вы нажимаете ESC в первый раз, вы переключаетесь из режима вставки vi в режим команд vi (очевидно). Затем вы снова нажмете ESC в командном режиме vi. Проблема заключается в том, что, по умолчанию, ESC не привязан ни к чему в командном режиме, однако, есть несколько ключевых виджетов , начиная с ESC , которые связаны - в частности, последовательности , посылаемые с помощью клавиш со стрелками.

Следовательно, если вы нажмете ESC в командном режиме vi, ZLE будет ждать второго нажатия клавиши виджета. Вот почему, если вы нажмете «i» (или любой другой персонаж), он будет тихо поглощен ZLE.

Ответ заключается в том, чтобы связать ESC с чем-то - чем угодно - в командном режиме vi, точно так же, как qqx указал в своем ответе.

0

Похоже, это не проблема с zsh 5.6.2.

Нужно установить KEYTIMEOUT=1 в вашем ~/.zshrc .

KEYTIMEOUT

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

Смотрите документацию zsh PARAMETERS

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