Используя % C-M-, чтобы сделать query-replace-regexp в Emacs, работающем в терминале Mac

Я пытаюсь сделать поиск-и-замену регулярного выражения в Emacs, работающем в Терминальной программе на моем MacBook Pro, который выполняет OS X 10.6.2. Насколько я знаю, это может быть сделано путем нажатия % C-M-(я предполагаю, что это означает Ctrl+Alt+Shift+5. Исправьте меня, если я неправ, так как я только начинаю изучать Emacs). Однако, когда я делаю это, это не работает.

Я могу сделать это путем ввода M-x query-replace-regexp, и когда я делаю это, я вижу напоминание в нижней части экрана, говоря, что я могу также сделать это с % C-M-, но когда я пробую % C-M-, ничего не происходит.

Править: Я хотел бы добавить, что у меня есть "Опция Use, поскольку метаклавиша" терминальная опция включила, и это, кажется, хорошо работает. Например, я могу использовать alt-B и alt-F, чтобы продвинуться и поддержать одно слово за один раз в ударе и Emacs.

РЕДАКТИРОВАНИЕ 2: Я также хотел бы упомянуть, что у меня есть свой терминальный набор для объявления терминального типа как "xterm", а не значение по умолчанию "xterm-цвета". Я сделал это по причинам, не связанным с этим вопросом (чтобы препятствовать тому, чтобы моя цветная подсказка выглядела забавной после того, как я отменяю reverse-i-search). Однако я экспериментировал в Emacs с "xterm" и "xterm-цветом", и так или иначе у меня есть та же проблема с % C-M-.

Как я могу сделать эту работу?

6
задан 15.12.2009, 20:15

3 ответа

В отличие от основанных на GUI приложений, ограничены на терминальном основанные приложения (как почти все те, которые Вы запускаете внутренний Windows терминала), в которых сочетаниях клавиш они могут распознаться. Назад, когда терминалы были реальными аппаратными средствами (не только эмулированный программами как Терминал и xterm), терминалы как VT-100 DEC имели a Клавиша CTRL, но это только работало в сочетании с определенными другими ключами. Так как большинство программ эмуляции терминала эмулирует VT-100 (и его преемники, включая VT-102 и VT-220), нет никакого способа на самом деле отправить Control-Shift-5 (или независимо от того, что % C-находится на Вашей клавиатуре) к на терминальном основанной программе.

У Вас, вероятно, будет лучшая удача при отображении query-replace-regexp к ключу (комбинация), которая на самом деле передает что-то. ‘F ключи’ (обычно) отображаются в стиле VT-220 что xterm-color записи termcap/terminfo знают, как проанализировать (F1-F4/F5 может быть в стиле VT-100 хотя!). В случае необходимости можно настроить Терминал для отправки безотносительно кодов, которые ожидает termcap/terminfo (по крайней мере, я могу в 10.4 Терминалах). Можно присвоить коды пустому F-ключу или F-ключу с единственным модификатором (Сдвиг, Управление или Опция). Любые модификаторы не были бы переданы (через терминал) в Emacs как таковой, но Вы могли отобразить некоторые из тех комбинаций к терминальным кодам клавиши для более высоких функциональных клавиш (F14-F20) (если комбинация не взята системным ярлыком — “Полный Доступ Клавиатуры”, Выставьте, и Пробелы (?)).

(global-set-key (kbd "<f13>") 'query-replace-regexp) ; I have a full-sized keyboard with an F13 on it.

Обратите внимание, что F1-F4 не может работать правильно, в зависимости от конфигурации Терминала и emacs. Например, в моей системе (10.4), Терминал настроен с “ESCOP” (код клавиши VT-100) для F1, но emacs ожидает “ESC [11 ~” ('старая' последовательность xterm). Ключи хорошо работают в emacs, если я реконфигурировал любой Терминал (⌘I; Клавиатура) или emacs (см. ниже).

; Expect VT-100 key codes for F1-F4
(define-key function-key-map "\eOP" [f1])
(define-key function-key-map "\eOQ" [f2])
(define-key function-key-map "\eOR" [f3])
(define-key function-key-map "\eOS" [f4])
2
ответ дан 07.12.2019, 16:11

Вы попробовали <esc> C-%? Это работает на меня.

Клавиша выхода часто отображается на meta (и высокий звук (опция на Mac) не всегда отображается на meta). Единственная вещь состоит в том, что Вы не удерживаете его как смещающийся ключ, Вы просто поражаете его.

BTW - Если Вы привыкли использовать высокий звук в качестве meta, следование по вопросу, "Как я отображаю высокий звук на meta в терминале Mac?" Которому я верю, был спрошен относительно Переполнения стека давно: Функциональная или Командная клавиша как Метаклавиша для LispBox на Macintosh предлагает поместить (setq mac-command-modifier 'meta) в Вашем .emacs файле.

1
ответ дан 07.12.2019, 16:11

Ввод по абсолютному адресу вокруг в function-key-map (C-h v function-key-map), я нашел это C-x @ c связывается с event-apply-control-modifier. Это кажется, что работало бы, но это взаимодействует плохо со способом, которым Терминал отправляет Метаклавиши с опцией “Use option as meta key” (это отправляет символ ESC перед обычным символом).

При вводе Управления-x c Option-Shift-5 emacs видит C-x @ c ESC %. Однако это связывает искусственный модификатор Управления с Клавишей выхода вместо того, чтобы перевести запаздывание ESC % кому: M-%. Таким образом, это заканчивает тем, что интерпретировало его как C-ESC %. Попытка сложить их искусственные модификаторы Control и Meta также перестала работать, потому что первое C-x во втором искусственном модификаторе последовательность поглощает первый искусственный модификатор.

Но, это указывает на возможность:

; cargo cult adaptation of event-apply-control-modifier
(defun event-apply-control-meta-modifiers (ignore-prompt)
  (vector
   (event-apply-modifier
    (event-apply-modifier (read-event)
                          'control 26 "C-")
    'meta 27 "M-")))
(define-key function-key-map (kbd "C-x @ %") 'event-apply-control-meta-modifiers)

Теперь, можно ввести Управление-x, Shift-5 Shift-5, emacs будет видеть C-x @ % %, интерпретируйте его как C-M-%, и выполненный наконец query-replace-regexp.

1
ответ дан 07.12.2019, 16:11

Теги

Похожие вопросы