代码之家  ›  专栏  ›  技术社区  ›  Chadwick

是否可以更改Emacs的regexp语法?

  •  41
  • Chadwick  · 技术社区  · 15 年前

    我爱Emacs。我喜欢雷格斯。我讨厌emacs的regex语法-需要转义分组parens和大括号, 转义字面parens,缺少预定义的字符类等。

    我可以替换Emacs的ReGEX引擎,或者调整一些设置,这样当我使用查询替换ReGEXP(或许多其他的一个)特性时,我可以使用Java/JS/Perl/Ruby……的语法I程序……

    编辑: 主题最初是“如何更改Emacs的regex引擎”,它不仅更改转义规则并添加字符类,而且(在文章中没有提到)添加对各种公共扩展的支持(?…)。像不捕捉帕伦斯这样的特征:(?:…),仅当/如果后面没有:(?)时匹配。=…)/(?!…)等。我不相信(尽管很高兴被纠正)这些在Emacs当前的regex引擎中是可能的,而且没有多少语法替换可以解决这个问题。

    下面的解决方案通过替换Emacs所理解的语法来解决转义和其他char类的原始问题。第二个答案(现在已删除)建议(添加一个函数在另一个函数开始时运行)Emacs的regex函数来替换所有regex处理。作者很快对他/她自己进行了审查,意识到这可能会破坏现有的很多Emacs代码,最终这篇文章被删除。

    我仍然希望将regex引擎改为支持扩展的引擎,但我同意,普遍地更改转义行为将导致我不愿意追求的破坏。因此,我正在改变主题以匹配问题并接受回答。

    我的想法是改变引擎以支持公共语法和扩展,建议regex函数将emacs内部代码转换为公共语法,建议交互函数将我的公共语法转换为emacs语法(以便它可以转换回公共语法)。但我认为,即使是RMS也会在这之前推荐一个叉子。

    2 回复  |  直到 9 年前
        1
  •  15
  •   Adam Rosenfield    15 年前

    您可以定义自己的elisp函数,该函数修改regexp,然后将其传递回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)
    
        2
  •  6
  •   TooTone    9 年前

    如果使用python正则表达式进行增量搜索/替换,并且对于replace和query replace足够,那么 visual-regexp-steroids 是个不错的选择。

    VisualRegexp类固醇是对VisualRegexp的扩展,它支持使用现代Regexp引擎(不再使用转义的组括号和其他好东西!)…目前,python和pcre2el是开箱即用的(在Linux和Windows上测试)。

    它默认为 Python regular expressions .

    一个非常好的功能是实时搜索/替换,例如从

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

    您可以像这样交换数字和字符串:

    enter image description here

    它可以通过 MELPA . 我的Emacs是:

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

    但很明显,您可以更改为适合,并根据需要覆盖用于搜索和替换的内置键映射。