Emacs 如何将配对列表转换为自动模式?

Emacs 如何将配对列表转换为自动模式?,emacs,elisp,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$" . rub

我有一长串的文件和文件扩展名,我想让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))
这对我来说似乎是重复的。是否有一种方法可以定义一次配对列表,然后将其循环或直接转换到
自动模式列表
?我试过了

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

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

cons
获取一个项目和一个列表,并返回一个新列表,其中该项目位于标题处。(例如
(cons1'(23))
给出
(1233)

您要做的是获取一个列表和一个列表,然后
将它们附加在一起

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

您只需要一个regexp(以及
自动模式下的条目)来匹配所有这些选项,并且您可以让
regexp opt
为您构建它

(let*((ruby文件“(.rake.thor”“Gemfile”“Rakefile”“Crushfile”“Capfile”))
(ruby regexp(concat(regexp opt ruby files t)“\\\”))
(添加到列表“自动模式列表”(cons ruby regexp“ruby模式”))
如果您特别想要单个条目,可以执行以下操作:

(mapc)
(lambda(文件)
(添加到“自动模式”列表中)
(cons(concat(regexp报价文件)“\\'”)“ruby模式”))
(.rake.thor.Gemfile.Rakefile.Crushfile.Capfile)
我最喜欢的是

(push '("\\(\\.\\(rake\\|thor\\)\\|\\(Gem\\|Rake\\|Crush\\|Cap\\)file\\)\\'" . ruby-mode) auto-mode-alist)

您应该调整示例,以便将
append
的返回值实际分配给
auto mode alist
@MoritzBunkus我的示例是按照原始帖子建模的(他没有分配cons的结果)。好吧,他不能使用
append
的结果作为他的
添加到列表的参数,所以你的论点对我来说没有多大意义。为什么不提供一个完全有效的示例?没有那么多工作了,谢谢!一个问题,“let”和“let*”之间有什么区别?使用
let*
,每个本地绑定表达式都可以看到列表中以前的表达式生成的本地绑定。在本例中,我需要查看
ruby文件
,以便设置
ruby regexp
。请参阅:
C-hflet*RET
vs
C-hflet-RET
。我要补充的是,
rx
也可以用于方便地为第一种方法生成regexp:
(rx(或.rake.thor“Gemfile”“Rakefile”“Crushfile”“Capfile”)eos)