По-перше, трохи історії. За старих часів, коли ви набирали текст на терміналі , кожна клавіша надсилала символу додатку. Оскільки машини, до яких був підключений термінал, ставали більш потужними, термінали стандартизовані на контрольній клавіші , яка надсилатиме деякі спеціальні символи, які не друкувалися, але мали якусь функцію. У кінцевому підсумку тріумфальний набір символів став 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 або переконфігуруючи свій термінал.