我已经开始按照http://www.emacswiki.org/emacs/EmacsScripts给出的说明编写Emacs脚本,基本上说您的脚本应该以以下内容开头:

:;exec emacs --script "$0" $@

现在,我想自定义auto-mode-interpreter-regexp' accordingly, to make Emacs scripts automatically loaded with emacs-lisp-mode'。

原始的“auto-mode-interpreter-regexp”旨在匹配:
#! /bin/bash
#! /usr/bin/env perl

依此类推,就是这样一个:
"\\(?:#![   ]?\\([^     \n]*/bin/env[   ]\\)?\\([^  \n]+\\)\\)"

我尝试添加新的正则表达式作为替代:
(setq auto-mode-interpreter-regexp
   (concat ;; match "#! /bin/bash", "#! /usr/bin/env perl", etc.
           "\\(?:#![    ]?\\([^     \n]*/bin/env[   ]\\)?\\([^  \n]+\\)\\)"
           ;; or
           "\\|"
           ;; match ":;exec emacs "
           "\\(?::;[    ]?\\(exec\\)[   ]+\\([^     \n]+\\)[    ]*\\)"))

但是该字符串虽然与整个字符串匹配,却未能捕获其子匹配项,尤其是检测解释器所需的第二个子匹配项。因此,我混合了regexp以同时匹配两个 header :
(setq auto-mode-interpreter-regexp
    (concat ;; match "#!" or ":;"
            "\\(?:#!\\|:;\\)"
            ;; optional spaces
            "[  ]?"
            ;; match "/bin/bash", "/usr/bin/env" or "exec"
            "\\(\\[^    \n]*/bin/env[   ]\\|exec[   ]\\)?"
            ;; match interpreter
            "\\([^  \n]+\\)"))

我可以做得更好吗?谢谢你。

最佳答案

Emacs中的Regexp支持使用“显式编号的组”构造为任何子匹配分配组号。参见Elisp Manual 34.3.1.3 Backslash Constructs in Regular Expressions

语法为‘(?num: ... )’,其中num是所选的组号。

关于regex - Emacs Lisp : can the same regexp match two different patterns with same number of groupings?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9121522/

10-13 02:57