Как связать C- [по-настоящему (серьезно по-настоящему на этот раз)

11

Есть ли способ связать C-[что-то и не испортить все M-(мета) привязки?

Не в первый раз , этот вопрос возникает. К сожалению, единственное решение, предлагаемое в предыдущем потоке, это: а) специфичный для Linux, б) требует внешнего инструмента (опять-таки специфического для Linux), который не имеет ничего общего с Emacs. В том же духе я мог бы использовать что-то вроде Karabiner на OS X, чтобы украсть C-[последовательность до того, как Emacs ее получит, но это неуклюже и дорого.

Учитывая , что Emacs , что настаивает на переводе C-[на ESC, C-iчтобы TABи , возможно , другие , я бы очень хотел , чтобы разорвать эти отношения и получить драгоценные последовательности ключевых обратно. Недавно я на полной скорости столкнулся с этой проблемой и обвинил тихий невинный режим smartparens .

Возможное решение , что участие function-key-mapи key-translation-mapбыл обсуждаться здесь , но увы она больше либо не работает или не работать в первую очередь (или я делаю что - то неправильно). Я думаю, что все шло в правильном направлении.

zeRusski
источник
3
Emacs не настаивает на «переводе C-[на ESC». Это одно и то же . Точно так же C-iи TABразные имена для одного и того же кода управления ASCII.
Дрю
2
@Drew Не совсем очевидно, что комбинации клавиш с элементом управления должны отображаться в управляющие коды ASCII (которых всего 32) в приложении с графическим интерфейсом. (Или, черт возьми, даже в xterm, который имеет режим modifyOtherKeys для отправки уникальных escape-последовательностей во многих случаях, хотя я не уверен в этом, в частности)
Random832
3
@ Random832: Вы правы, чтобы отличить ключи от символов . Для редактора несколько логично и просто сопоставить последовательность клавиш C-[ (нажатие Ctrlи нажатие [) с C-[управляющим символом (он же ESCсимвол), но нет, это не обязательно для того, кто разрабатывает редактор. И да, Emacs делает это. C-[и ESCявляются тем же символом, но ключи Ctrl+ [и Escне должны быть сопоставлены с какими-либо конкретными символами.
Дрю

Ответы:

8

Адаптировано из моего собственного конфига :

(define-key input-decode-map [?\C-\[] (kbd "<C-[>"))
(global-set-key (kbd "<C-[>") 'butterfly)

Это, очевидно, будет работать только в графическом интерфейсе.

edit: Обратите внимание, что input-decode-mapтерминал является локальным, что означает, что его изменение не будет работать, если вы используете emacsclient, но будет работать, если вы используете emacs. Я исправил проблему в моей конфигурации, обернув ее в команду, работающую с фреймом, и добавив ее в after-make-frame-functionsловушку.

wasamasa
источник
спасибо это кажется законным! Интересно, есть ли способ, чтобы Emacs не рассматривал Meta и ESC как одно и то же? Также мне интересно, если я просто
испортил
1
Это другой вопрос, пожалуйста, откройте новый для этого.
Васамаса
Интересно , имеющие <C-i>и <C-[>связанные назад TABи ESCв глобальной-карте , как вы предлагаете в вашей конфигурации утончается разбивает мой Emacs каждый раз , когда я ударил Em:
zeRusski
1
Что ж, учитывая, что вы оказались парнем, который выдал ошибку за сбой руля после ввода буквы "j" , я обвиняю вашу сборку Emacs в сбое и предлагаю вам попробовать другую для OS X.
васамаса
поверьте мне, я пробовал много строить. Будет еще одна загадка, с которой мне придется жить. Я справлюсь -) спасибо за решение
zeRusski