Просто вижу это сейчас, но вот что я сделал.Конечным результатом является то, что я хочу сделать следующее: (hook-up-modes my-lisps 'standard-lisp-environment)
.
Для этого я определяю следующие defvar
s.
(defvar my-lisps "clojure lisp emacs-lisp cider-repl")
(defun standard-lisp-environment ()
(paredit-mode 1)
(rainbow-delimiters-mode 1)
(eldoc-mode 1))
Я хочу добавить lisp-mode-hook к lisps, которые я использую, поэтому у меня есть следующее:
(defun append-suffix (suffix phrases)
"take SUFFIX and append it to each of the PHRASES."
(mapcar #'(lambda (phrase) (concat phrase suffix)) phrases))
, чтобы ("clojure" "lisp") => ("clojure-mode-hook" "lisp-mode-hook").
Теперь, когда мы могли бы легко получить их, нам нужны их символы считывателя, которые мы легко получаем из
(defun symbols-from-strings (strings)
"Given a list of strings, get their symbol values"
(mapcar #'intern strings))
И, наконец, у нас есть аналогичная форма, размещенная выше:
(defun multiple-mode-add-hook (modes hook)
"Given a list of x-mode-hook symbols in MODE, add the HOOK to them."
(mapc (lambda (mode) (add-hook mode hook)) modes))
Все они работают с типом, который имеет для них смысл, списком строк, списком символов blah-mode-hook и т. Д. Итак, теперь нам нужна приятная функция для работы с пользователем, с которой мы можем работать.
(defun hook-up-modes (strings hook)
(let ((modes (symbols-from-strings
(append-suffix "-mode-hook" (split-string strings)))))
(multiple-mode-add-hook modes hook)))
Теперь это должно быть довольно разборчиво: мы создаем наши режимы из списка строк, разделенных пробелами, и применяем к нему хук.Кроме того, так как я определил стандартную среду для lisp, все мои lisp ведут себя одинаково, и я могу легко удалить хук позже, если захочу.Тогда код, который действительно работает, это супер простая фраза (hook-up-modes my-lisps 'standard-lisp-environment)
.