在Emacs中设置auto-mode-alist

29

我注意到当前的auto-mode-alist条目都以单引号结尾,例如:

 ("\\.java\\'" . java-mode)

单引号的作用是什么?我本来以为会看到

 ("\\.java$" . java-mode)

我问这个问题的原因是因为我正尝试获取文件名与正则表达式匹配的文件。

^twiki\.corp.* 

我尝试了以下方法打开org模式,但都没有成功:

(add-to-list 'auto-mode-alist '("^twiki\\.corp" . org-mode))
(add-to-list 'auto-mode-alist '("\\'twiki\\.corp" . org-mode))
以下内容是:

以下代码有效:

(add-to-list 'auto-mode-alist '("twiki\\.corp" . org-mode))

但这并不是我想要的,因为带有 twiki.corp 的文件名将在 org-mode 中打开。

1个回答

30

\\'匹配字符串/缓冲区的末尾空字符串:

http://www.gnu.org/software/emacs/manual/html_node/emacs/Regexp-Backslash.html

$将匹配行尾:如果文件名中有换行符(非常罕见),$将匹配换行符而不是字符串的末尾。

正则表达式与整个文件名进行匹配,因此您需要包括“/”以匹配目录分隔符:

(add-to-list 'auto-mode-alist '("/twiki\\.corp" . org-mode))

谢谢!在这种情况下,匹配空字符串的目的是什么?是为了确保“.java”后面没有空格吗?它比使用$更好在哪里? - chris
3
为确保你在“.java”之后没有任何其他字符。否则像“somefile.java.not.really”这样的文件名也会被匹配。比“$”更好,如果文件名中有换行符,虽然不太可能,但仍有可能出现。例如,“bob.java\nsomething else”这样的文件名可能是某些恶意攻击的手段(尽管我不知道攻击会是什么)。 - Ivan Andrus
5
我会使用可爱的 rx 表单,它可以帮助您避免记住那可怕的正则表达式语法。(相反,您需要记住 rx 的语法,但它更易读。)(rx "/twiki.corp" eos) - offby1
4
如果你的文件名中有换行符,那么你就必须承担因此产生的任何奇怪错误。 - Cheeso
如果仍有人对此感到困惑,“匹配空字符串,但仅在字符串的结尾”是一种复杂但严格正确的说法,大多数人会称之为“匹配字符串的结尾”。因此,在elisp中的\'就像在Ruby中的\z。正则表达式的好处在于,几乎无论您在哪里找到它,它的方言都与您之前学过的略有不同。 - clacke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接