【发布时间】:2012-02-02 23:21:49
【问题描述】:
我已经根据http://www.emacswiki.org/emacs/EmacsScripts 给出的说明开始编写 Emacs 脚本,基本上说你的脚本应该以:
:;exec emacs --script "$0" $@
现在我想自定义auto-mode-interpreter-regexp' accordingly, to make Emacs scripts automatically loaded withemacs-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]+\\)[ ]*\\)"))
但是这个匹配整个字符串时,未能捕获其子匹配,尤其是检测解释器所需的第二个。因此,我混合了正则表达式以同时匹配两个标题:
(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]+\\)"))
我可以做得更好吗?谢谢。
【问题讨论】: