如何将自动模式列表中的对列表包含在内?

bit*_*ops 4 emacs elisp

我有一长串文件和文件扩展名,我希望Emacs在ruby模式下自动打开.从使用谷歌,最基本的解决方案是:

(setq auto-mode-alist (cons '("\.rake$"    . ruby-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("\.thor$"    . ruby-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("Gemfile$"   . ruby-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("Rakefile$"  . ruby-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("Crushfile$" . ruby-mode) auto-mode-alist))
(setq auto-mode-alist (cons '("Capfile$"   . ruby-mode) auto-mode-alist))
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是重复的.有没有办法我可以定义一次对的列表,并将其循环或直接收集到auto-mode-alist?我试过了

(cons '(("\\.rake" . ruby-mode)
         ("\\.thor" . ruby-mode)) auto-mode-alist)
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.有什么建议?

phi*_*ils 6

您只需要一个正则表达式(因此可以输入auto-mode-alist)来匹配所有这些选项,您可以让它regexp-opt为您构建它.

(let* ((ruby-files '(".rake" ".thor" "Gemfile" "Rakefile" "Crushfile" "Capfile"))
       (ruby-regexp (concat (regexp-opt ruby-files t) "\\'")))
  (add-to-list 'auto-mode-alist (cons ruby-regexp 'ruby-mode)))
Run Code Online (Sandbox Code Playgroud)

如果您特别想要个人条目,您可能会这样做:

(mapc
 (lambda (file)
   (add-to-list 'auto-mode-alist
                (cons (concat (regexp-quote file) "\\'") 'ruby-mode)))
 '(".rake" ".thor" "Gemfile" "Rakefile" "Crushfile" "Capfile"))
Run Code Online (Sandbox Code Playgroud)