我有一长串文件和文件扩展名,我希望Emacs在ruby模式下自动打开。使用Google,最基本的解决方案是:
(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)
但这似乎不起作用。有什么建议吗?
答案 0 :(得分: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)))
如果您特别想要个人参赛作品,可以这样做:
(mapc
(lambda (file)
(add-to-list 'auto-mode-alist
(cons (concat (regexp-quote file) "\\'") 'ruby-mode)))
'(".rake" ".thor" "Gemfile" "Rakefile" "Crushfile" "Capfile"))
答案 1 :(得分:1)
cons
获取一个项目和一个列表,并返回一个包含该项目的新列表。 (例如(cons 1 '(2 3))
给出'(1 2 3)
)
您要做的是获取列表和列表,并append
将它们放在一起
(setq auto-mode-alist
(append '(("\\.rake" . ruby-mode)
("\\.thor" . ruby-mode))
auto-mode-alist))
答案 2 :(得分:1)
我最喜欢的是
(push '("\\(\\.\\(rake\\|thor\\)\\|\\(Gem\\|Rake\\|Crush\\|Cap\\)file\\)\\'" . ruby-mode) auto-mode-alist)