Отключить <Esc>, но оставить <C - [>

24

Для возврата из режима вставки я привык <Esc>. Теперь я ищу переобучиться <C-[>вместо <Esc>. Для этого мне нужно отключить, <Esc>чтобы помочь с переподготовкой.

Проблемы в

:inoremap <Esc> <Nop>

также отключает <C-[>. Для vim они кажутся одинаковыми.

Есть ли способ отключить одно без другого?

mxlian
источник
13
Это зависит от того, в какой среде вы работаете. Большинство текстовых терминалов посылают ту же информацию в приложение, когда вы нажимаете Escили C-[, так что вам не повезло, но вы можете сделать что-то с версией графического интерфейса Vim или перенастроить свой терминал.
Жиль "ТАК - перестань быть злым"
Правильно! Не очень важный вопрос. Я найду обходной путь с отображениями клавиатуры. Спасибо
mxlian
3
@ Жиль, почему бы тебе не добавить это в ответ? Это лучше для Googlers и статистики нашего сайта.
Робби Wxyz
2
@SuperScript Я исследовал это немного больше и отправил ответ.
Жиль "ТАК - перестань быть злым"

Ответы:

35

Сначала немного истории. В старые времена, когда вы набирали текст на терминале , каждая клавиша отправляла символ в приложение. По мере того, как машины, к которым был подключен терминал, становились все более мощными, терминалы стандартизировались с помощью клавиши управления , которая отправляла некоторые специальные символы, которые не были напечатаны, но выполняли какую-то функцию. В конечном итоге победившим набором символов стал ASCII , в котором 128 символов, из которых 32 являются управляющими символами. При нажатии Ctrlвместе с буквой или другим символом, написанным 10xxxxx₂ (двоичная запись), отправляется управляющий символ, код которого равен 00xxxxx₂, например, Ctrl+ [отправляет номер символа 27₁₀ = 0011011₂, поскольку [91 is = 1011011₂.

Несколько функциональных клавиш на терминалах отправляют управляющие символы:

  • Backspace= Ctrl-H(BS = BackSpace) ¹
  • Tab= Ctrl-I(HT = Горизонтальная вкладка)
  • Linefeed= Ctrl-J(LF = перевод строки) (этот ключ был у немногих терминалов)
  • Returnили Enter= Ctrl-M(CR = возврат каретки)
  • Escape= Ctrl-[(ESC = Escape)

Когда у терминалов было больше функциональных клавиш, не хватало управляющих символов, чтобы представлять их все. Таким образом , они послали последовательность характера, а универсальная конвенция является то , что эти последовательности символов начинаются с экранирующим символом, Ctrl-[.

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

Таким образом, даже сегодня в Unix-подобных системах приложения, работающие в эмуляторе терминала, получают символ, Ctrl-Iкогда пользователь нажимает Tabклавишу, символ, Ctrl-[когда пользователь нажимает Esc, и т. Д. Если Vim работает в терминале Unix, он не может различить <Esc>и <Ctrl-[>потому что терминал отправляет ту же информацию.

Vim, работающий в других средах, не имеет этого ограничения, поэтому в принципе они могут посылать различную информацию. Учитывая, что Vim использует Ctrl-[персонажа для представления <Esc>во многих местах, изменение было бы нецелесообразным; вместо Ctrl+ [можно сделать, чтобы отправить другое событие ввода.

Я не знаю ни версии самого Vim , который различает между Escи Ctrl+ [(но это не так, как я когда - либо использовать любой). Gvim, со своей стороны, похоже, имитирует садовый терминал .

По иронии судьбы, лучшим вариантом может быть запуск Vim в эмуляторе терминала. Некоторые эмуляторы терминала позволяют настраивать escape-последовательности, посылаемые ключами и цепочками ключей. Таким образом, вы можете организовать Ctrl+, [чтобы отправлять не символ ␛ ( Ctrl-[), а некоторую escape-последовательность. Xterm, «эталонный» эмулятор терминала для Unix-подобных систем, поддерживает две такие схемы. Например:

  • Escотправляет и Tabотправляет во всех конфигурациях.
  • С ?.VT100.modifyOtherKeys: 0(по умолчанию) или ?.VT100.modifyOtherKeys: 1, Ctrl+ [отправляет и Ctrl+ Iотправляет . ?.VT100.modifyOtherKeys: 1влияет только на мета-комбинации и управляющие комбинации, в которых отсутствует символ ASCII.
  • С ?.VT100.modifyOtherKeys: 2и ?.VT100.formatOtherKeys: 0(по умолчанию) Ctrl+ [отправляет ␛[27;5;91~и Ctrl+ Iотправляет ␛[27;5;105~.
  • С ?.VT100.modifyOtherKeys: 2и ?.VT100.formatOtherKeys: 1, Ctrl+ [посылает ␛[91;5uи Ctrl+ Iпосылает ␛[105;5u.

Поддержка может быть включена путем установки modifyOtherKeys ресурса при запуске xterm (и formatOtherKeysвыбора между двумя схемами), или его может динамически включать и выключать приложение.

У Vim нет встроенной поддержки, о которой я знаю. Вы можете написать свои собственные привязки для этих escape-последовательностей. Может быть возможно заставить Vim автоматически установить терминал в modifyOtherKeysрежиме, передав ему модифицированное определение терминала, но это выходит за рамки этого ответа.

Neovim имеет встроенную поддержку для одного из вариантов . Насколько я понимаю, он не включает поддержку, если терминал его поддерживает, это должен сделать пользователь.

¹ все чаще и чаще в наше время Backspaceотправляет персонажа 127.

Жиль "ТАК - перестань быть злым"
источник