EMACS-DOCUMENT

=============>随便,谢谢

在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 交互地选择替换哪个实例。

删除行

可以用 flush-lines 删除文件中包含给定正则表达式的所有行。你还可以反转此命令,使用 keep-lines 指定不删除哪些行。

调整代码

一个不太为人所知但很方便的特性是 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