Використовуйте Super у emacs -nw в Linux


15

Я намагаюся знайти просте і пряме запитання до відповіді, і тому вирішив задати тут.

Питання: Чи існує спосіб використання Super в Emacs, запущений у терміналі в Linux?

PS : Я читав багато інформації про, xmodmapале думаю, що головне в тому, що емулятор терміналу не може представляти Супер ключ. Однак (kbd "s-SPC")повертає щось, і я думав використовувати засоби перекладу .Xdefaults/X. Я на вірному шляху? З огляду на результат kbd, що мені потрібно помістити як переклади XTerm.VT100.?

Відповіді:


21

Вам буде зручніше в X11 Emacs, який може приймати введення з клавіатури та відображати текст, не проходячи кодування та декодування терміналу . Основна причина використовувати редактор текстового режиму - це запустити його всередині екрана або tmux на віддаленій машині, але завдяки Tramp зазвичай простіше редагувати віддалений файл у вашому локальному Emacs. Якщо говорити, ви можете робити все, що завгодно, доки ваш емулятор терміналу співпрацює, що стосується Xterm.

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

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

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

XTerm.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, 5for Ctrl, 3for Meta, 8for Ctrl+ Meta, і додати 1 for + Shift- no, це не дуже послідовно).

Вам доведеться вказати модифікатори Hyper та Super через їх кількість, як Mod1через Mod5. Запустіть, xmodmap -pmщоб побачити відображення ключів до модифікаторів. Наприклад, якщо Super_Lприв’язаний до Mod5, то наступний рядок (використовуйте цей точний випадок) визначає прив'язку для Super+ Space:

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

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

(define-key local-function-key-map "\033[32;16~" [(super ?\ )])

Цей пост зроблений з 80% переробленого матеріалу з Чи є Linux-термінали, які можуть обробляти всі комбінації клавіш?


Це чудова відповідь, яка охоплює всі знання, які я знайшов трохи розкиданими навколо. Лише одне запитання: де ви знайшли / як вибрали 32; 16 ~ і чому це не збігається з прив’язкою emacs, наведеною нижче? Я зрозумів походження чисел, але хотів би запитати вас, чи можете ви десь посилання на таблицю зіставлення для цифр1 та числа2 .
Андреа Річіарді

@AndreaRichiardi Я вибрав 32, тому що це значення ASCII / Unicode для символу пробілу і 16, тому що для стандартних прив'язок використовуються значення до 8 для Ctrl, Meta та Shift. 33 нижче було помилковим друком. Ви можете вибрати що завгодно, якщо це не суперечить іншим клавішам.
Жил "ТАК - перестань бути злим"

Мені довелося прив’язати послідовність до функції, щоб я на мить вирішив (global-set-key "\033[32;16~" 'set-rectangular-region-anchor). Але щоб бути завершеним, я спробував ваше define-keyвище, але я не міг запустити (global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor). Це було просто друк; 16 ~ в буфері. Було б непогано зв’язати цю послідовність з (kbd "s-SPC"), щоб у мене була пов'язана послідовність ключів і я можу повторно призначити її іншим командам.
Андреа Річіарді

C-h lповертає наступне після натискання s-SPC зараз: ESC [ 3 2 ; 1 6 ~але emacs все ще скаржиться на цеM-[ 32 is undefined
Андреа Річіарді,

@AndreaRichiardi Після виправлення більшої кількості друкарських помилок у частині xterm (яку, здається, виправили, оскільки Emacs отримує призначену послідовність символів), це працює для мене. Чи працює, якщо ви використовуєте function-key-mapзамість local-function-key-map? Можливо, це буде питанням, коли ви встановите local-function-key-map, оскільки це залежить від терміналу.
Жил 'ТАК - перестань бути злим'

0

Якщо ви готові встановити пакет Emacs та налаштувати свій термінал, я написав пакет Emacs, який може навчити Emacs та термінали правильно розпізнавати всі клавіші клавіатури ПК та комбінації модифікаторів клавіш:

https://github.com/CyberShadow/term-keys

Кодування модифікатора Super не включено за замовчуванням, але пакет настроюється та дозволяє налаштувати, які комбінації клавіш модифікатора кодуються. Щоб увімкнути комбінацію клавіш кодування, що включає модифікатор Super, встановіть term-keys/want-key-p-funcфункцію, яка повертається, tколи (elt mods 3)вона не є нульовою ( для пояснення див. Програму за замовчуванням ).


0

У моїх файлах init є такі:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

Це дозволяє мені надсилати супер і гіпер клавіші за допомогою функціональних клавіш.


-1

Коротка відповідь: використання Konsole.

Пояснення:

  • Emacs ' local-function-key-mapмає відображення запису C-x @ sдо event-apply-super-modifier.
  • Konsoleкарти Super(клавіша логотипу Windows) на послідовність втечі ^X@s(що, здається, ніде не зафіксовано, я виявив це випадково). Ви можете спробувати це, відкривши Konsoleі натиснувши напр Ctrl-v Win-o.

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