6

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

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

РЕДАКТИРОВАТЬ: Я хотел бы добавить, что у меня включен параметр терминала «Использовать как мета-ключ», и, кажется, работает нормально. Например, я могу использовать alt-B и alt-F для перехода вперед и назад по одному слову за раз в bash и Emacs.

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

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

4 ответа4

2

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

Вам, вероятно, повезет больше, если сопоставить query-replace-regexp с ключом (комбинацией), который действительно что-то передает. «Клавиши F» (обычно) отображаются в стиле VT-220, который записи синтаксиса termcap/terminfo xterm-color знают, как анализировать (хотя F1-F4/F5 может быть в стиле VT-100!). При необходимости вы можете настроить Терминал для отправки любых кодов, ожидаемых вашим termcap/terminfo (по крайней мере, я могу в Терминале 10.4). Вы можете назначить коды для открытой клавиши F или клавиши F с помощью одного модификатора (Shift, Control или Option). Любые модификаторы не будут передаваться (через терминал) в Emacs как таковые, но вы можете сопоставить некоторые из этих комбинаций с кодами клавиш терминала для более высоких функциональных клавиш (F14-F20) (если комбинация не используется системным сочетанием клавиш - « Полный доступ с клавиатуры »,« Expose »и« Spaces »(?)).

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

Обратите внимание, что F1-F4 может не работать должным образом, в зависимости от конфигурации Terminal и emacs. Например, в моей системе (10.4) терминал настроен с « ESC OP» (код ключа VT-100) для F1, но emacs ожидает « ESC [11 ~» («старая» xterm последовательность). Ключи отлично работают в emacs, если я переконфигурирую Terminal (⌘I; Keyboard) или 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])
1

Исследуя function-key-map (C-h v function-key-map), я обнаружил, что C-x @ c связан с event-apply-control-modifier . Кажется, что это будет работать, но плохо взаимодействует с тем, как Терминал отправляет мета-ключи с опцией «Использовать опцию как мета-ключ» (он отправляет символ ESC перед обычным символом).

Когда вы набираете Control - x @ c Option - Shift - 5, emacs видит C-x @ c ESC % . Тем не менее, он привязывает искусственный модификатор Control к клавише Escape вместо перевода конечного 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)

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

1

Для замены запросов на MacBook Pro 2017 с OSX Sierra, использующей встроенные emacs в Terminal, используйте

<esc> % 

по порядку. При необходимости (в зависимости от раскладки клавиатуры) используйте одновременную клавишу <shift> для доступа к знаку%.

1

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

Клавиша escape часто отображается на meta (а alt (опция на mac) не всегда отображается на meta). Единственное, что вы не удерживаете его, как клавиша переключения, вы просто нажимаете на него.

Кстати, если вы привыкли использовать alt в качестве мета, то следующий вопрос: «Как мне сопоставить alt с мета в терминале Mac?«Как я полагаю, давно задавался вопрос о переполнении стека: клавиша Option или Command в качестве мета-ключа для LispBox на Macintosh предлагает добавить (setq mac-command-modifier 'meta) в ваш файл .emacs.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .