4

我有一长串文件和文件扩展名,我想让 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))

这对我来说似乎是重复的。有没有一种方法可以定义对列表一次,然后循环或直接将其添加到auto-mode-alist?我试过了

(cons '(("\\.rake" . ruby-mode)
         ("\\.thor" . ruby-mode)) auto-mode-alist)

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

4

3 回答 3

6

You only need a single regexp (and hence entry in auto-mode-alist) to match all those options, and you can let regexp-opt do the work of building it for you.

(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)))

If you especially want individual entries, you might do something like this:

(mapc
 (lambda (file)
   (add-to-list 'auto-mode-alist
                (cons (concat (regexp-quote file) "\\'") 'ruby-mode)))
 '(".rake" ".thor" "Gemfile" "Rakefile" "Crushfile" "Capfile"))
于 2012-06-14T09:17:16.940 回答
1

我最喜欢的是

(push '("\\(\\.\\(rake\\|thor\\)\\|\\(Gem\\|Rake\\|Crush\\|Cap\\)file\\)\\'" . ruby-mode) auto-mode-alist)
于 2012-06-19T01:43:26.783 回答
1

cons接受一个项目和一个列表,并返回一个以该项目为开头的新列表。(例如(cons 1 '(2 3))给出'(1 2 3)

你想要做的是把一个列表和一个列表和append它们放在一起

(setq auto-mode-alist
  (append '(("\\.rake" . ruby-mode)
            ("\\.thor" . ruby-mode))
   auto-mode-alist))
于 2012-06-14T06:37:28.870 回答