3

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

Сегодня я понял, что загадочной комбинацией было Shift+Enter. Конечно же, нажатие Shift+Enter запускает отмену, независимо от того, находится ли он в режиме вставки.

Затем я попытался сделать Ctrl+V Shift+Enter, чтобы увидеть, каково было буквальное значение Shift+Enter, и оно распечатало:

^[[13;2u

И теперь это имело смысл - ^ [это бегство, а ты в конце концов отменяешь. Другие символы ничего не делают, когда набираются в таком порядке.

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

Кто-нибудь знает, что означает этот контрольный код и можно ли его отключить в Vim? Я предполагаю, что мой терминал может иметь к этому какое-то отношение - я использую стандартный терминал Cygwin для установки ssh в Linux-систему и запускаю ssh поверх этого.

1 ответ1

4

Не вдаваясь в тонкости возможностей терминала и escape-кодов, я подтверждаю то, что вы уже обнаружили: терминал пытается обеспечить способ различения модифицированного и немодифицированного ключа ввода.

Редактировать: Исправление. Похоже, что когда Vim переводит терминал Mintty в "сырой" режим, он видит Shift+Enter как нулевой байт и отображает его как ^@ когда вы предшествуете ему Control+v, но в остальном обрабатывает его как новую строку. тем не мение.

Есть несколько способов решить эту проблему. Одним из них является использование Mintty Cygwin's, который не отправляет ничего уникального с Shift+Enter. У него есть и другие преимущества по сравнению со стоковым терминалом.

Однако, "быстрое и грязное" решение состоит в том, чтобы просто добавить что-то вроде этого в ~/.vimrc на удаленной машине:

:imap <esc>[13;2u <CR>

Недостатком этого является то, что с этой точки каждый раз, когда вы нажимаете escape, он не будет выходить из режима вставки, пока вы не начнете использовать команды перемещения или пока не истечет интервал времени ожидания карты. Смотрите " :help 'timeout' " и следующие связанные записи.

Другое решение может быть неосуществимым (и может фактически не решить проблему), но оно должно убедиться, что ваша переменная TERM правильно установлена на вашей оболочке Cygwin перед вашей ssh, и на удаленной оболочке после вашей ssh, и что они совпадают Или они достаточно похожи. (Вы никогда не должны иметь безусловную настройку TERM=<anything> в ваших файлах конфигурации оболочки.)

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