2010-08-16 44 views
25

我注意到,当前的自动模式ALIST项全部结束用单引号,例如设置自动模式ALIST在Emacs

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

什么是单引号的目的。我本来期望看到

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

我想问的原因是,我试图让与名称匹配的正则表达式

^twiki\.corp.* 

开在组织模式的文件。我曾尝试没有成功如下:

以下工作:

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

,但不是我想要什么比较,因为嵌入在他们twiki.corp文件名会在组织模式中打开。

回答

27

\\”空字符串在字符串/缓冲的结尾匹配:

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

$将匹配行的末尾:如果你在你的文件名换行(很少见) $将匹配换行符而不是字符串的结尾。

的正则表达式是对整个匹配,所以你需要包括“/”相匹配的目录分隔符:

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

THX!在这种情况下匹配字符串末尾的空字符串的目的是什么?是否确保“.java”之后没有空格?它如何比使用$更好? – chris 2010-08-16 15:56:40

+3

这是为了确保你在'.java'之后什么也没有。否则,像'somefile.java.not.really'这样的东西也会匹配。如果你的文件名中有一个换行符,但这是不常见的,但可能的话,它比'$'要好。例如,像'bob.java \ nsomething else'这样的文件名可能是一些恶意攻击的载体(尽管我不知道攻击会是什么)。 – 2010-08-17 13:59:14

+5

我会使用可爱的'rx'形式,这样可以避免您必须记住糟糕的正则表达式语法。 (你必须记住rx自己的语法,但它更具可读性。) '(rx“/twiki.corp”eos)' – offby1 2010-08-17 16:28:37