在 Mac 终端中运行的 Emacs 中使用 CM-% 执行查询替换正则表达式

在 Mac 终端中运行的 Emacs 中使用 CM-% 执行查询替换正则表达式

我正在尝试在 Emacs 中进行正则表达式搜索和替换,该程序运行在运行 OS X 10.6.2 的 MacBook Pro 上的终端程序中。据我所知,这可以通过按 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-% 相同的问题。

我怎样才能让它工作?

答案1

我刚刚找到了一个解决方案(我在我的 macbook pro 上的 iterm2 中运行 emacs)。

首先,通过运行查看 emacs 中的当前键绑定C-h b。搜索 CM-%(使用命令,例如),你会发现几个转义序列实际上映射到 CM-%。在 iTerm2 中,你可以在“首选项”>“配置文件”>“键”中将+ + +C-s映射到一个这样的转义序列(ControlOptionShift5图片)。然后 Emacs 会将该转义序列转换为 CM-%,它与 query-replace-regexp 绑定。现在按Control+ Option+ Shift+5即可按您想要的方式工作。

Control可以以相同的方式重新映射使用和的类似组合(Shift例如 C-+)。我不确定在默认终端中是否可以这样做。

这个问题了解更多信息。

答案2

与基于 GUI 的应用程序不同,基于终端的应用程序(就像您在终端中运行的几乎所有应用程序一样)终端windows)在它们能够感知的按键组合方面是有限的。当终端是真正的硬件(而不仅仅是由类似终端终端),像 DEC 的 VT-100 这样的终端有一个Control密钥,但是它只能与某些其他键组合使用由于大多数终端仿真程序都模拟 VT-100(及其后继产品,包括 VT-102 和 VT-220),因此无法真正向基于终端的程序发送 - Control- Shift5或键盘上的任何 C-%)。

您可能更幸运地映射query-replace-regexp到实际传输某些内容的键(组合)。“F 键”通常以 VT-220 样式映射,xterm-colortermcap/terminfo 条目知道如何解析(但 F1-F4/F5 可能采用 VT-100 样式!)。如果需要,您可以配置终端发送你的 termcap/terminfo 期望的任何代码(至少在 10.4 中我终端)。您可以将代码分配给裸 F 键或带有单个修饰符(Shift、Control 或 Option)的 F 键。任何修饰符都不会通过终端传递到 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 可能无法正常工作,具体取决于终端emacs。例如,在我的系统(10.4)上,终端配置为“ESC键OP”(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])

答案3

你试过了吗<esc> C-%?对我来说很有效。

Esc 键通常映射到 meta(而 alt(mac 上的 option)是不是它总是映射到元)。唯一的问题是,你不需要像按 Shift 键那样按住它,而是只需按下它即可。

顺便说一句——如果你习惯使用 alt 作为 meta,那么接下来的问题是“如何在 mac 终端中将 alt 映射到 meta?”我相信这个问题很久以前在 Stack Overflow 上就有人问过:在 Macintosh 上,Option 或 Command 键作为 LispBox 的 Meta 键建议放入(setq mac-command-modifier 'meta)你的.emacs文件中。

答案4

对于在装有 OSX Sierra 的 MacBook Pro 2017 上使用 query-replace,在终端中运行内置 emacs,使用

<esc> % 

按顺序。如果需要(取决于键盘布局),同时使用 <shift> 键来访问 % 符号。

相关内容