在emacs中设置auto-mode-alist

chr*_*ris 27 emacs elisp

我注意到当前的自动模式alist条目都以单引号结束,例如

 ("\\.java\\'" . java-mode)
Run Code Online (Sandbox Code Playgroud)

单引号的目的是什么?我本以期待看到

 ("\\.java$" . java-mode)
Run Code Online (Sandbox Code Playgroud)

我问的原因是我试图获取名称与regexp匹配的文件

^twiki\.corp.* 
Run Code Online (Sandbox Code Playgroud)

以组织模式打开.我试过以下没有成功:

(add-to-list 'auto-mode-alist '("^twiki\\.corp" . org-mode))
(add-to-list 'auto-mode-alist '("\\'twiki\\.corp" . org-mode))
Run Code Online (Sandbox Code Playgroud)

以下作品:

(add-to-list 'auto-mode-alist '("twiki\\.corp" . org-mode))
Run Code Online (Sandbox Code Playgroud)

但是不是我想要的,因为嵌入了twiki.corp的文件名将在org-mode中打开.

Jür*_*zel 29

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

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

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

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

(add-to-list 'auto-mode-alist '("/twiki\\.corp" . org-mode))
Run Code Online (Sandbox Code Playgroud)

  • 我会使用可爱的`rx`表单,这样你就不必记住那个糟糕的正则表达式语法.(你必须记住rx自己的语法,但它更具可读性.)`(rx"/twiki.corp"eos)` (5认同)
  • 这是确保你在'.java'之后什么都没有.否则像'somefile.java.not.really'这样的东西也会匹配.如果你的文件名中有换行符,这比'$'更好,这是不寻常但可能的.例如,像'bob.java \nsomething else'这样的文件名可能是某些恶意攻击的载体(虽然我不知道攻击是什么). (3认同)
  • 如果你的文件名中有换行符,你应该得到任何奇怪的错误. (2认同)