В форме:
(cons '("\\.rb$" . ruby-mode) ...
ruby-mode
является частью цитируемого списка.Это означает, что оно читается как имя символа, а не как переменная.Другими словами, Emacs видит его как символ ruby-mode
и принимает его как есть.
В форме:
(set-mode-for-filename-patterns
ruby-mode
'("\\.rb$"
"\\.rsel$"
...
ruby-mode
не заключено в кавычки и поэтому читается какаргумент функции.Аргументы функции оцениваются.Это означает, что Emacs читает ruby-mode
, распознает его как символ и пытается его оценить.Оценка символа означает поиск значения, на которое он указывает, которого в данном случае не существует.
РЕДАКТИРОВАТЬ:
Ваша функция по-прежнему не работает, есть другая проблема.Вы использовали цитируемый список внутри set-mode-for-filename-patterns
.Это прекрасно работает в вашем исходном коде:
(setq auto-mode-alist (cons '("\\.rb$" . ruby-mode) auto-mode-alist))
, поскольку вы вручную вводите значение для filename-pattern
и mode
.Внутри вашей функции эти символы должны быть оценены , чего не происходит, когда они заключаются в кавычки!В результате вместо добавления каждой отдельной строки из вашего списка в auto-mode-alist вместо этого вы получите символ filename-pattern
.
Чтобы это исправить, вы должны признать, что '(filename-pattern. mode) предназначен для создания cons-ячейки со значениями , равными filename-pattern
и mode
.Который мы можем производить (минусы имя файла-режим).Таким образом, исправленная функция будет:
(defun set-mode-for-filename-patterns (mode filename-pattern-list)
(mapcar
(lambda (filename-pattern)
(setq
auto-mode-alist
(cons (cons filename-pattern mode) auto-mode-alist)))
filename-pattern-list))
И вызов исправленной функции:
(set-mode-for-filename-patterns
'ruby-mode
'("\\.rb$"
"\\.rsel$"
"\\.rhtml$"
"\\.erb$"
"\\.prawn$"
"Rakefile$"
"Gemfile$"))