在Emacs中使用正则表达式
Emacs中正则表达式的语法有点令人失望,但是在Emacs中使用正则表达式的方式倒是令人印象深刻。
I've written before about the syntax of Emacs regular expressions. It's a pretty conservative subset of the features you may be used to from other environments as summarized in the diagram below. 我曾经写过关于Emacs正则表达式语法的内容。它与其他环境中正则表达式相比相当保守,只是其中的一个子集,如下图所示。
https://www.johndcook.com/blog/regex-perl-python-emacs/
但是在Emacs中有很多使用正则表达式的场景。我快速地搜索了一下,发现在厚厚的Emacs手册中,大约15%的页面包含了至少一个对正则表达式的引用。 详尽地列出正则表达式的用法既不实际也没意思。相反,我将重点介绍一些我认为有用的用法。
查找与替换
Emacs中最常用的特性之一是增量搜索。您可以使用 C-s
(isearch-forward
)和 C-r
(isearch-back
) 命令在键入内容时向前或向后搜索字符串。
这些命令对应的正则表达式版本是 C-M-s
(isearch-forward-regexp
)和 C-M-r
(isearch-back-regexp
)。
注意,正则表达式版命令与字符串版命令相比多了Alt (meta)键。
另外,请注意,Emacs始终使用 regexp
来表示正则表达式,而不是 regex
.(Emacs严重依赖于这类惯例来保持代码库的可管理性。)
不管使用什么编辑器,一个常见的任务总是搜索和替换文本。在Emacs中你可以用 replace-regexp
来替换所有出现的正则表达式,或者用 query-replace-regexp
交互地选择替换哪个实例。
调整代码
一个不太为人所知但很方便的特性是 align-regexp
. 此命令将根据需要插入空白,以便使区域内所有匹配正则表达垂直对齐。
例如,如果在编程语言中有连续多个赋值语句,则可以使用 align-regexp
,输入只包含等号的正则表达式就可以将所有语句在等号上进行对齐。当然,你也可以通过更复杂的模式进行排列。
虽然我认为这个特性主要用于编辑源代码,但我认在其他环境中也很有用,比如调整诗歌或画ASCII艺术图。
目录编辑
The Emacs directory editor dired
is something like the Windows File Explorer or the OSX Finder, but text-based. dired
has many features that use regular expressions. Here are a few of the more common ones.
Emacs目录编辑器 dired
类似于Windows文件管理器或OSX Finder,只不过是基于文本的界面. dired
中的很多功能都用到了正则表达式。以下是一些比较常见的例子。
可以使用 % m
(dired-mark-files-regexp
)来根据文件名标记文件,也可以使用 % g
(dired-mark-files-containing-regexp
)来根据文件内容标记文件。 还可以使用=% d= (dired-flag-files-regexp
)来标记要删除的文件。
在 dired
中,可以通过键入 A
(dired-do-find-regexp
)来搜索指定的文件集,并且可以通过 Q
(dired-do-find-regexpand-replace
)来交互式地搜索和替换一组文件。
杂项
help apropos命令(C-h a
)可以接受字符串或正则表达式。
搜索可用字体的命令(list-faces-display
)可以使用字符串或正则表达式。
交互式高亮命令(highlight-regexp
, unhighlight-regexp
, highlight-line-matchings-regexp
)接受一个正则表达式参数。
kill-match -buffers
可以使用正则表达式指定关闭哪些缓冲区。
也许Emacs中正则表达式的最大用途是配置。 Emacs中的许多自定义操作(例如给Emacs提示以确定文件的正确编辑模式,告诉Emacs如何识别不同语言中的注释)都使用正则表达式作为参数。
资源
你可以在我的 technical notes 中找到更多Emacs正则表达式的帖子. 注意在顶部大纲上有 正则表达式 和 Emacs 相关的链接.
想获取关于正则表达式或像Emacs这类unix原生工具的每日提示,请在Twitter上关注@RegexTip和@UnixToolTip。