По-перше, трохи історії. За старих часів, коли ви набирали текст на терміналі , кожна клавіша надсилала символу додатку. Оскільки машини, до яких був підключений термінал, ставали більш потужними, термінали стандартизовані на контрольній клавіші , яка надсилатиме деякі спеціальні символи, які не друкувалися, але мали якусь функцію. У кінцевому підсумку тріумфальний набір символів став ASCII , із 128 символів, з яких 32 - символи управління. При натисканні Ctrlразом з літерою або іншим символом, написаним 10xxxxx₂ (двійкове позначення), надсилається керуючий символ, код якого 00xxxxx₂, наприклад Ctrl+ [посилає номер символу 27₁₀ = 0011011₂, оскільки [
це 91₁₀ = 1011011₂.
Кілька функціональних клавіш на терміналах надсилають контрольні символи:
- Backspace=
Ctrl-H
(BS = BackSpace) ¹
- Tab=
Ctrl-I
(HT = горизонтальна вкладка)
- Linefeed=
Ctrl-J
(LF = Потік рядка) (кілька терміналів коли-небудь мали цей ключ)
- Returnабо Enter=
Ctrl-M
(CR = повернення перевезення)
- Escape=
Ctrl-[
(ESC = Втеча)
Коли в терміналах було більше функціональних клавіш, не було достатньо керуючих символів, щоб представити їх усіх. Таким чином , вони послали послідовність характеру, а універсальна конвенція є те , що ці послідовності символів починаються з екрануючим символом, Ctrl-[
.
З плином часу апаратні термінали ставали все рідше і рідше; В даний час існує багато рівнів перекладу між клавіатурою і додатком . Обмеження кількості доступних символів та жорстко кодованих відповідностей між певними комбінаціями клавіш та певними контрольними символами вже не має значення. Однак програми залишаються сумісними з існуючими терміналами, а термінали залишаються сумісними з існуючими додатками, що ускладнює щось змінити.
Так що навіть сьогодні в Unix-подібних системах програми, що працюють в емуляторі терміналу, отримують символ, Ctrl-I
коли користувач натискає Tabклавішу, символ, Ctrl-[
коли користувач натискає Escі т. Д. Якщо Vim працює в терміналі Unix, він не може розрізнити <Esc>
і <Ctrl-[>
тому, що термінал надсилає ту саму інформацію.
Vim, що працює в інших середовищах, не має цього обмеження, тому в принципі їм можна було б надсилати різну інформацію. Враховуючи, що Вім використовує Ctrl-[
персонаж для представлення <Esc>
у багатьох місцях, змінювати це було б недоцільно; натомість Ctrl+ [можна зробити для надсилання іншої події введення.
Мені невідома будь-яка версія самого Vim, яка б розрізняла значення + Escі (але це не так, як я коли-небудь використовував). Gvim, наприклад, наслідує термінал садових сортів .Ctrl[
Як не дивно, найкращою вашою ставкою може стати Vim, який працює в емуляторі терміналу. Деякі емулятори терміналів дозволяють налаштувати послідовності втечі, що надсилаються клавішами та клавіатурами. Таким чином, ви можете домовитись про Ctrl+ [для надсилання не символу ␛ ( Ctrl-[
), а деякої послідовності втечі. 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 не має вбудованої підтримки, про яку я знаю. Ви можете написати власні прив’язки для цих послідовностей втечі. Може бути можливим заставити Vim автоматично встановлювати термінал у modifyOtherKeys
режимі, подаючи йому модифіковане визначення терміналу, але це не виходить за межі цієї відповіді.
Neovim має вбудовану підтримку одного з варіантів . Наскільки я розумію, вона не вмикає підтримку, якщо термінал її підтримує, це залежить від користувача.
¹ Все частіше і найчастіше нині Backspaceпосилає персонаж 127.
Esc
абоC-[
, тому вам не пощастило, але можливо, ви зможете зробити щось із версією GUI від GUI або переконфігуруючи свій термінал.