Чи є термінали Linux, які можуть обробляти всі комбінації клавіш?


11

Мені подобається використовувати emacs в термінальному режимі ( -nw), але, здається, більшість (усі?) Терміналів не можуть обробити деякі комбінації клавіш - наприклад, C-<RET>або C-M-%. Я знаю, це тому, що більшість терміналів емулюють VT-100, який не мав цих комбінацій. Чи є якісь термінали Linux (бажано KDE), які можуть обробляти ці комбінації клавіш, чи це фундаментальне обмеження всіх терміналів?

Відповіді:


15

Коли ви натискаєте клавішу або комбінацію клавіш у терміналі, вона передається програмі, що працює в терміналі, як послідовність одного або декількох символів. Наприклад, коли ви натискаєте a, програма отримує a. Коли ви натискаєте Enter, програма отримує символ CR(ака ^M(вимовляється "control-emm"), також номер символу 13, він \rабо \015). Комбінації клавіш, що включають Alt, зазвичай передаються як символ ESC(а.ка. ^[aka \eабо \033) з подальшим послідовністю для ключа або комбінації клавіш без Alt. Функціональні клавіші та інші комбінації клавіш передаються у вигляді послідовностей, що починаються з \e[або \eO.

Послідовності виходу не повністю стандартизовані, і термінали зазвичай ігнорують певні атрибути для певних клавіш. Наприклад, Ctrl+ Shift+ letterчасто передається точно так само Ctrl+ letterза замовчуванням.

Ви можете побачити, що ваш термінал надсилає для комбінації клавіш, натиснувши клавішу Ctrl+, Vа потім комбінацію клавіш у запиті оболонки або, C-qабо C-h cслідуючи за комбінацією клавіш у Emacs.

За допомогою деяких термінальних емуляторів ви можете налаштувати послідовності евакуації для кожної клавіші. На Xterm, це робиться через X ресурсів . Більшість установок читають ресурси з ~/.Xresourcesмоменту запуску X, і ви можете завантажити файл вручну xrdb -merge ~/.Xresources.

Term.VT100.translations:       #override \n\
    Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
    Ctrl Shift ~Meta <key>percent: string("\033[37;6~")

Загальна умова використовує послідовності виходу форми ESC [ number1 ; number2 ~для функціональних клавіш з модифікаторами. number1вказує функціональну клавішу ( 15to 24for F5to F12- з історичних причин, F1 через F4мають різні послідовності відходу) і number2вказує на модифікатор ( 2for Shift, 3for Meta, 5for Ctrl, 7for Ctrl+ Meta, і додати 1 для Shiftпринаймні одного з Ctrlабо Meta).

Emacs переводить послідовності втечі у своє внутрішнє представлення ключів через input-decode-mapабоlocal-function-key-map (або function-key-mapперед Emacs 23).

(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])

Отже, якщо я правильно це розумію, мені потрібно спершу визначити послідовність вхідного сигналу в моєму терміналі, яка відповідає деякій комбінації клавіш. Потім у emacs мені потрібно зіставити послідовність втечі назад до комбінації клавіш. Чи може послідовність втечі бути довільною, якщо вона не суперечить тим, які визначені в infocmp $TERM?
Йоссаріан

2
@Yossarian Так. Окрім того, що не суперечать один одному, послідовності відходу повинні бути однозначними, тобто жодна послідовність відходу не повинна бути префіксом іншої. На практиці це означає, що першим символом має бути ESC(якщо ви не хочете спробувати якийсь символ ≥128, але це обмежить можливі вхідні кодування), а другий символ повинен бути чимось, для чого не потрібно ESC fooприв'язки.
Жил "ТАК - перестань бути злим"

Я щойно намагаюся спробувати те, що ви запропонували. Чи local-set-keyнасправді має бути define-key? Перший дає помилку (неправильна кількість аргументів), а другий працює, принаймні, для <kbd> C-Enter </kbd>. Здається, у konsole все ще виникають проблеми з надсиланням <kbd> CM-% </kbd>.
Йоссаріан

@Yossarian Дійсно, так і має бути define-key. Я не знаю, чи можна налаштувати ключі відключення Konsole, xterm, ймовірно, більше настроюється, ніж будь-яка альтернатива.
Жиль "ТАК - перестань бути злим"

1
Зауважте, що xterm Томаса Дікі знаходиться в активному розвитку. За допомогою XTerm*modifyOtherKeys: 2ресурсу він буде генерувати унікальні послідовності навіть для C-M-комбінацій, але за допомогою цього налаштування вам потрібно буде забезпечити безліч користувальницьких відображень ( XTerm*modifyOtherKeys: 1є менш здатними, але набагато більш функціональними поза коробкою). Для прикладу (хоча і той , який не працює для мене) бачити xterm-extras.elбібліотеку і пов'язаний з ним .Xresourcesі .inputrcфайли в easymacs завантаження.
філ

1

Для обмеженого, але значного набору ключів, якщо припустити консоль KDE, можна виконати наступні дії, щоб мати працюючі складні прив'язки клавіш у emacs -nw:

Я буду використовувати S-<RET>приклад, як працювати на прикладі:

  1. Відкрийте нову консоль, перейдіть до налаштувань -> поточний профіль -> клавіатура -> редагувати
  2. Натисніть Додати та зробіть новий запис для Return+Shiftі дайте йому корисну послідовність клавіш (я вибрав, на \E[27;3мою думку, це послідовність ключів, що надсилає X, коли я копався з xev, але це може бути неправильно - важливо, що потрібно зробити, це зробити впевнений, що він має належну втечу і не конфліктує ні з чим іншим).
  3. Пограйте з ним у маленькій тестовій області внизу, щоб переконатися, що вона працює.
  4. Перезапустіть консоль.
  5. Запуск emacs -nwта в буфері подряпин оцініть:

    (read-key-sequence-vector "Type your new key:")

    потім введіть нову комбінацію клавіш.

    • Якщо ви не знайомі з цим, запишіть рядок, залиште курсор в кінці рядка і натисніть Cx Ce, щоб отримати emacs для запуску цього рядка, він повинен сказати вам все, що ви ставите в лапки, і чекати, коли ви набрати щось.
  6. Він повинен виплюнути ключову послідовність, яку ви можете зв’язати.
    (Він повернувся [27 91 50 55 59 51]до мене, на відміну від нудного старого, [13]перш ніж я заплутався з консольним в'язанням клавіш.)

  7. Додайте до конфігурації emacs:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. Я протестував це emacs -nwна екрані, використовуючи:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    

0

Коротка відповідь - це основне обмеження всіх терміналів.

Трохи довша відповідь полягає в тому, що навіть якщо хтось створив термінал, який виконує те, що ви хочете, сам Emacs вимагатиме великих змін для роботи з цим гіпотетичним терміналом.


Це хороший момент щодо emacs, який мені навіть не траплявся. Я думаю, я почну використовувати gui замість цього.
Йоссаріан

Це я і роблю.
hruvulum

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