带文本转换的Emacs查询替换

时间:2020-03-05 18:51:52  来源:igfitidea点击:

我想在文件中找到与形式为t[AZ]u的正则表达式匹配的任何文本(即,匹配项t后跟一个大写字母,另一个匹配项u,并转换匹配的文本,以便大写字母为小写,例如,对于regexpx [AZ] y

xAy

变成

xay

xZy

变成

xzy

Emacs的query-replace函数允许向后引用,但AFAIK不允许转换匹配的文本。有内置的功能吗?有人可以使用简短的Elisp函数吗?

更新

@Marcel Levy拥有它:在替换表达式中的\引入了一个(任意的)Elisp表达式。例如,上述解决方案是

M-x replace-regexp <RET> x\([A-Z]\)z <RET> x\,(downcase )z

解决方案

回答

看起来,史蒂夫·耶格(Steve Yegge)早在几年前就已经发布了答案:"发光和新功能:Emacs 22"。向下滚动至"在替换字符串中更改大小写",我们将使用replace-regexp函数查看他的示例代码。

普遍的答案是,我们可以使用" \,"来调用任何lisp表达式作为替换字符串的一部分,例如\,(capitalize \ 1)。阅读帮助文本后,看起来好像只是处于交互模式,但这似乎是最有必要的地方。

回答

在这种情况下,qrr的替代方法是记录宏并重播它。 (isearch-forward-regexp,选择字符,小写区域。)我发现动态宏更容易,因为如果regexp错误,我们会立即得到反馈。

回答

我也将使用宏来执行此操作,但这只是因为从正则表达式的替换字符串中执行代码对我来说是非常不直观的。如果我们正在编写批处理脚本或者需要快速执行的操作,则\当然是可行的方法。