Используйте Super в Emacs -nw в Linux

15

Я изо всех сил пытался найти простой и прямой вопрос к ответу, и поэтому я решил задать здесь.

В: Есть ли способ использовать Super в Emacs, запущенный в Terminal в Linux?

PS : я прочитал много информации о, xmodmapно я думаю, что ключ в том, что эмулятор терминала не может представлять Супер ключ. Тем не менее, (kbd "s-SPC")возвращает что-то, и я думал об использовании средства перевода .Xdefaults/X. Я на правильном пути? Учитывая результат kbd, что мне нужно поставить как XTerm.VT100.translations?

Андреа Ричиарди
источник

Ответы:

21

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

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

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

Xterm позволяет вам настроить escape-последовательности для каждого ключа через 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~")

Общее соглашение использует escape-последовательности формы ESC [ number1 ; number2 ~для функциональных клавиш с модификаторами. number1указывает на функциональную клавишу ( 15в 24течение F5до F12- по историческим причинам, F1 через F4разные управляющие последовательности) и number2указывает модификатор ( 2для Shift, 5для Ctrl, 3для Meta, 8для Ctrl+ Metaи добавить 1 для + Shift- нет, это не очень последовательно).

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

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

Emacs переводит escape-последовательности во внутреннее представление ключа через 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 ниже? Я понял происхождение цифр , но я хотел бы спросить вас , можно ли ссылаться на отображение таблицы где - то для number1 и number2 .
Андреа Ричиарди
@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
Andrea Richiardi,
@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 не включено по умолчанию, но пакет настраивается и позволяет настроить, какие комбинации клавиш модификатора кодируются. Чтобы включить кодирующая комбинации клавиш , которые включают модификатор Супер, установленный term-keys/want-key-p-funcна функцию , которая возвращает , tесли (elt mods 3)это не-ноль (см реализацию по умолчанию для объяснения).

Владимир Пантелеев
источник
0

У меня есть следующее в моих файлах инициализации:

(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)

Это позволяет мне отправлять супер и гипер ключи с помощью функциональных клавиш.

Realraptor
источник
-1

Краткий ответ: используйте Konsole.

Объяснение:

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