Клавиши со стрелками в режиме вставки в vim

Когда я нахожусь в режиме вставки в vim и использую клавиши со стрелками, он отправляет что-то похожее на букву и возврат каретки. Например, нажатие отправляет:

A

Похоже на A\n, но я точно не знаю, какие символы/коды он отправляет. Почему это происходит, и есть ли способ отключить это?


person David542    schedule 27.04.2020    source источник


Ответы (2)


Обычная последовательность, отправляемая терминалом для стрелки вверх, — это <Esc>OA или ^[OA (последовательность ^[ представляет клавишу <Esc>, также эквивалентную Ctrl+[).

Если ваш Vim не распознает эту последовательность как стрелку вверх, он в конечном итоге выполнит следующую последовательность: <Esc>, которая выйдет из режима вставки и перейдет в обычный режим, затем O, чтобы вставить новую строку над текущей и перейти в режим вставки, затем вставьте литерал A, так как вы снова будете в режиме вставки.

Вы можете подтвердить, что это действительно последовательность, которую ваш терминал отправляет Vim, набрав Ctrl+V, а затем стрелку вверх в режиме вставки. (Ctrl+V в режиме вставки следующий символ вставляется буквально.) Я ожидал вы увидите вставленную последовательность ^[OA.

Затем вы можете проверить, что ваш Vim думает о последовательности для стрелки вверх, с помощью команды :set <Up>. Я ожидаю, что вы увидите что-то вроде:

t_ku  <Up>           ^[OA

(t_ku — это внутреннее имя параметра, соответствующего этой клавише со стрелкой вверх. Вы также можете использовать :set termcap для просмотра всех параметров Vim, связанных с терминалом, включая специальные коды клавиш.)

Если какой-либо из них не соответствует ожиданиям, это объясняет, почему ваш Vim не распознает клавишу со стрелкой вверх. (Альтернативное объяснение состоит в том, что 'ttimeoutlen' задано слишком короткое значение, но я д сказать, что это маловероятно.)

Этими параметрами обычно управляет параметр 'term'. По умолчанию он устанавливается на основе того, что у вас есть для $TERM в вашей оболочке вне Vim.

Вы можете начать с того, что Vim считает 'term' и откуда он установлен:

:verbose set term?
  term=screen-256color
        Last set from ~/.vimrc line 100

Часть :verbose просит Vim сообщить вам, откуда она установлена, чтобы вы могли увидеть, перезаписывает ли ее ваш vimrc или один из ваших плагинов. Если Vim не показывает ничего из этого, это означает, что это происходит из переменной $TERM в вашей оболочке.

Итак, посмотрите, что $TERM установлено вне Vim, и посмотрите, кажется ли это правильным или нет. Вы устанавливаете это явно где-то? Будь то один из файлов инициализации оболочки или, возможно, из самого эмулятора вашего терминала?

Также, возможно, имеет значение, используете ли вы tmux или screen, и в этом случае вам следует еще раз проверить, правильно ли установлено $TERM как внутри tmux или screen, так и снаружи.

Надеюсь, все эти подсказки приведут вас в правильном направлении. Если вы не можете понять, опубликуйте свои выводы в комментариях к этому ответу, и я обновлю его более конкретными исправлениями, которые вы можете попробовать.

person filbranden    schedule 28.04.2020
comment
@ David542 Мне было бы любопытно узнать о ваших выводах ... В итоге вы обнаружили неправильную конфигурацию, которая приводила к неправильному поведению клавиш со стрелками в режиме вставки? Что было в итоге? Я рад, что кажется, что мой ответ смог помочь! Ваше здоровье! - person filbranden; 28.04.2020
comment
это кажется правильным, и каковы мои коды, когда я пытаюсь это сделать. Спасибо за развернутый ответ: t_kd <Down> ^[OB t_kl <Left> ^[OD t_kr <Right> ^[OC t_ku <Up> ^[OA и за term я получаю: term=screen-256color - person David542; 29.04.2020

Вероятно, вы находитесь в режиме совместимости с vi. попробуй :set nocompatible

Если это заставит его работать так, как вы хотели бы, поместите set nocompatible в начало вашего файла vimrc, чтобы он работал по умолчанию.

person Christian Gibbons    schedule 27.04.2020
comment
@Chritian - то же самое. Возможно, это связано с кодами, отправленными iterm2? - person David542; 28.04.2020
comment
Не уверен точно, что отправлено, но я знаю, что в моей Linux-системе, если я сделаю :set compatible, он будет вести себя так, как вы описываете. У меня был коллега, у которого была такая же проблема несколько лет назад, я думаю. Я думаю, это случилось с ним, потому что он запускал его с псевдонимом vi, из-за которого он открывался в режиме vi. - person Christian Gibbons; 28.04.2020