Как я могу применить хук к нескольким режимам Emacs одновременно? - PullRequest
9 голосов
/ 13 сентября 2011

Я читал статью о хорошо отформатированных коммитах Git , и мне было интересно, как я могу применить некоторые правила к режиму журнала Magit.

Кажется, что используются 3 основных режима одновременно: Magit, Log, Edit.

Так как же заставить эти режимы, при совместном использовании, автоматически переносить 72 символа?

Ответы [ 5 ]

8 голосов
/ 13 сентября 2011

В ответ на первоначально поставленный вопрос, если у вас есть одна функция для добавления к многочисленным переменным хука, вы можете сделать это следующим образом:

(defun my-add-to-multiple-hooks (function hooks)
  (mapc (lambda (hook)
          (add-hook hook function))
        hooks))

(defun my-turn-on-auto-fill ()
  (setq fill-column 72)
  (turn-on-auto-fill))

(my-add-to-multiple-hooks
 'my-turn-on-auto-fill
 '(text-mode-hook
   magit-log-edit-mode-hook
   change-log-mode-hook))

Возможно, это не самый лучший пример, но у меня есть кое-что похожее для некоторых распространенных поведений, которые я хочу включить в режимах программирования, из которых есть еще очень много, чтобы перечислить.

4 голосов
/ 13 сентября 2011

Режимы Emacs имеют «базовые режимы», то есть режимы бейда.Например, python-mode extends prog-mode, который сам расширяет fundamental-mode.Все режимы расширяются fundamental-mode.Таким образом, чтобы зацепить python-mode плюс c-mode, но не text-mode, вы можете зацепить prog-mode.

4 голосов
/ 13 сентября 2011

В буфере Emacs может быть только один основной режим (если вы не используете что-то вроде MMM или MuMaMo ).В вашем случае это один из основных режимов magit-log-edit-mode, имя которого состоит из трех слов («Magit Log Edit»).Вы можете просто добавить к нему любой желаемый крючок:

(defun my-turn-on-auto-fill ()
  (setq fill-column 72)
  (turn-on-auto-fill))

(add-hook 'magit-log-edit-mode-hook 'my-turn-on-auto-fill)
2 голосов
/ 13 сентября 2011

В общем, вы можете определить свою собственную функцию, скажем, my-common-hook и добавить ее во все основные режимы, например:

(defun my-common-hook ()
   ... do stuff ...
   )
(add-hook 'one-mode-hook 'my-common-hook)
(add-hook 'another-mode-hook 'my-common-hook)
(add-hook 'a-third-mode-hook 'my-common-hook)
1 голос
/ 09 апреля 2016

Просто вижу это сейчас, но вот что я сделал.Конечным результатом является то, что я хочу сделать следующее: (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).

...