是否有可能改变emacs的正则​​expression式语法?

我爱emacs。 我喜欢正则expression式。 我讨厌emacs的正则​​expression式语法 – 需要避免分组parens和大括号,你逃避字面parens,缺乏预定义的字符类,等等。

我可以replaceemacs的正则​​expression式引擎,或调整一些设置,以便当我使用Query-replace-regexp(或许多其他function之一)function时,我可以使用在java / js / perl / ruby​​ / etc中编程的语法…?

编辑:该主题最初是“如何更改emacs的正则​​expression式引擎”,这不仅将改变逃逸规则和添加字符类,但也(在后文中没有提到)添加支持各种常见的扩展(?…)。 像非捕获伙伴的function:(?:…),仅当/如果没有后面跟:(?= …)/(?!…),以及其他。 我不相信(虽然很高兴能被纠正),但emacs当前的正则expression式引擎可能会有这些function,而且没有任何语法replace可以解决这个问题。

下面的解决scheme通过replaceemacs理解的语法来解决转义和其他char类的原始问题。 第二个答案(现在删除)build议build议(添加一个函数在另一个开始运行)emacs的正则​​expression式函数来替代所有的正则expression式处理。 作者很快就审查了自己意识到这可能会破坏现有的emacs代码,最终这个post被删除了。

我仍然希望将正则expression式引擎更改为支持扩展的引擎,但是我同意改变逃逸行为会造成严重的后果,我不愿意追逐。 因此,我正在改变主题来匹配问题并接受答复。

它改变了引擎以支持通用语法和扩展,build议使用regex函数将emacs-internal代码转换成通用语法,build议交互function将我的通用语法转换为emacs-syntax(所以它可以是转换回普通)…但我认为即使RMS会build议在此之前分叉。

你可以定义你自己的elisp函数修改正则expression式然后把它传回给emacs。 在伪elisp:

(defun my-query-replace-regexp (regexp) ; modify regexp to replace ( with \(, { with \{, etc. (query-replace-regexp modified-regexp) ) ; rebind C-% to use new regexp function (global-set-key "\C-%" 'my-query-replace-regexp) 

如果使用Python正则expression式进行增量search/replace,而replace和查询replace就足够了,那么visual-regexp-steroids是一个不错的select。

visual-regexp-steroids是visual-regexp的扩展,它可以使用现代正则expression式引擎(没有更多的转义组括号,和其他的好东西!)…现在,Python和pcre2el开箱即用Linux和Windows)。

它默认为Python正则expression式 。

一个非常好的function是实时search/replace,例如开始

 one = 1 two = 2 three = 3 four = 4 

你可以像这样交换数字和string:

在这里输入图像说明

它可以通过MELPA轻松安装。 我的.emacs是:

 (require 'visual-regexp-steroids) (define-key global-map (kbd "Cc r") 'vr/isearch-backward) (define-key global-map (kbd "Cc s") 'vr/isearch-forward) (define-key global-map (kbd "Cc l") 'vr/replace) (define-key global-map (kbd "Cc q") 'vr/query-replace) 

但显然你可以改变以适应,并覆盖内置的键映射search和replace,如果你想。