Вопрос Побег не идемпотент в эмуляции zsh's vi?


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

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


5
2017-12-07 22:29


происхождения




ответы:


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

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

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

3
2017-12-08 01:31



Благодаря! Я ожидал, что могу что-то сделать, связав бегство в режиме vicmd, но не был уверен, что здесь что-то происходит. Я удивлен, что другие пользователи не сделали этого. Может быть, я просто слишком рассеян в отношении пользователя vi, все время ударяясь в бегство. - user1063042
Это беспокоило меня в течение нескольких дней, спасибо! - cchamberlain


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

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

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

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


2
2017-09-20 21:14