Вимкнути <Esc>, але зберегти <C - [>


24

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

Проблеми є

:inoremap <Esc> <Nop>

також відключає <C-[>. Для vim вони здаються одними і тими ж.

Чи є спосіб відключити одне без іншого?


13
Це залежить в якому середовищі ви працюєте. Більшість текстових терміналів надсилають ту саму інформацію до програми, коли ви натискаєте Escабо C-[, тому вам не пощастило, але можливо, ви зможете зробити щось із версією GUI від GUI або переконфігуруючи свій термінал.
Жил "ТАК - перестань бути злим"

Правильно! Не проблема vim. Я знайду вирішення з відображенням клавіатури. Спасибі
mxlian

3
@Gilles, чому ти не поставиш це у відповідь? Краще для Googlers та статистики нашого сайту.
Robbie Wxyz

2
@SuperScript Я трохи більше дослідив це і опублікував відповідь.
Жил 'ТАК - перестань бути злим'

Відповіді:


35

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.