Сначала немного истории. В старые времена, когда вы набирали текст на терминале , каждая клавиша отправляла символ в приложение. По мере того, как машины, к которым был подключен терминал, становились все более мощными, терминалы стандартизировались с помощью клавиши управления , которая отправляла некоторые специальные символы, которые не были напечатаны, но выполняли какую-то функцию. В конечном итоге победившим набором символов стал 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.
Esc
илиC-[
, так что вам не повезло, но вы можете сделать что-то с версией графического интерфейса Vim или перенастроить свой терминал.