Як я "групую" гачки?


14

Існують певні речі, такі як відображення пробілу пробілу, відображення меж буфера, розмежувачі кольорів веселки та багато іншого, що я б хотів увімкнути в більшості режимів, а точніше, всіх програм, пов'язаних з програмуванням та текстом (тому що відображення пробілів у задніх місцях, скажімо ediff-mode, зіткнеться з основним режимом) замість використання глобалізованого другорядного режиму з винятками правил. Оскільки більшість режимів є похідними prog-modeабо text-modeдодають відповідну функцію до обох prog-mode-hookі text-mode-hookпрацюють, однак є достатньо режимів, які не відповідають цій специфікації, наприклад, css-modeабо LaTeX-mode.

Я хотів би визначити гак, який охоплює всі ці режими, щоб додати функції лише до одного гака. Назвемо його non-special-mode-hook(щоб його відрізнити special-mode-hook). Як мені вдасться створити такий гачок, який виконується для всіх основних режимів, для яких він створений?


Відповіді:


19

Просто згрупуйте ці налаштування разом у функцію та додайте цю функцію до всіх відповідних функцій гака:

(defun my-non-special-mode-setup ()
  (setq show-trailing-whitespace t)
  ...)
(dolist (hook '(prog-mode-hook text-mode-hook css-mode-hook ...))
  (add-hook hook 'my-non-special-mode-setup))

Жоден інший спосіб зробити це не буде більш стислим: що б не трапилося, десь у вас буде або білий список, або чорний список режимів. На практиці ви знайдете лише декілька режимів, які потрібно додати до списку, тому я б запропонував просто прості речі.

В моїй власній конфігурації я використовую саме цей трюк для уніфікації конфігурації кількох режимів, орієнтованих на Lisp.


Дякую, я думаю, що я адаптую це рішення і для інших корисних груп (наприклад, таких, як ліписті).
wasamasa

1
Це саме те, що я роблю сам: github.com/purcell/emacs.d/blob/…
sanityinc

1
Чудово, ви можете, можливо, додати URL у свою відповідь? Я вважаю, що виділений фрагмент не тільки дуже добре пояснює фактичне використання, але й демонструє подальше використання, наприклад, використання "гачка", пов'язаного з Emacs Lisp, як підмножину більшого "гака", і як автоматично створювати назви гаків із існуючих основних режимів з derived-mode-hook-name.
wasamasa

Мені це подобається більше, ніж моє, тільки для (dolist ...)vs (add-hook ...)<repeat>. Я б дотримуватися тільки з родовищем при збереженні режиму змін , специфічних для окремого (файл-в-режимі use-package, el-get). Обидва - це рішення в одному місці, але з різних точок зору.
Джонатан Ліч-Пепін

Майте на увазі, що якщо ви не наводите тут APPENDаргумент без нуля, add-hookто гачки будуть викликатись у зворотному порядку зі списку, який ви надаєте. Нічого поганого в цьому; просто пам’ятайте про це, у випадку, якщо порядок має значення.
Дрю

5

Ви можете додати функцію after-change-major-mode-hook, яка перевіряє, чи цікавий новий режим (можливо, наскрізь (not (derived-mode-p 'special-mode))), і чи так він працює non-special-mode-hook.


Це звучить досить вишукано (як тільки вияснили всі "неспеціальні" режими, оскільки є декілька, які просто використовують fundamental-mode, але роблять більше, ніж просто показ тексту), але трохи занадто магічно на мій смак. Звідси виступ.
wasamasa

4

Я часто виявляв, що за допомогою схеми @ sanityinc я обертаю мої налаштування та незначні активації режиму під час замикання та прокручує гачки, щоб викликати це, але мені хотілося більш чіткого підходу, тому я написав цей макрос:

(defmacro hook-modes (modes &rest body)
  (declare (indent 1))
  `(--each ,modes
     (add-hook (intern (format "%s-hook" it))
               (lambda () ,@body))))

Примітка: Я dash.elза чистоту, але його можна легко пристосувати до використання (dolist).

Потім ви можете визначити згруповані режими як змінні списку і використовувати його так:

(defvar progish-modes
  '(prog-mode css-mode sgml-mode))

(hook-modes progish-modes
  (highlight-symbol-mode)
  (highlight-symbol-nav-mode))

1
Зауважте, що тут ви можете використовувати derived-mode-hook-nameназву змінної гака режиму, тим самим уникаючи internхитрості.
sanityinc

@sanityinc TIL derived-mode-hook-name. приємна порада!
waymondo

1

Замість того, щоб визначити новий гачок, який працює для всіх цих невихідних режимів, ви можете зробити наступне.

(defun run-my-hooks ()
  "Run all the following functions in the hook"
  (smartparens-mode 1)
  (whitespace-mode 1)
  (my-needed-mode 1)
  ...)

(add-hook 'specific-mode-hook 'run-my-hooks)
(add-hook 'another-mode-hook 'run-my-hooks)

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


-2

Можливо, ви можете спробувати це:

(setq lisp-dialects-mode-hook '(lisp-mode-hook
                            lisp-interaction-mode-hook
                            emacs-lisp-mode-hook
                            ;; common-lisp-mode-hook
                            scheme-mode-hook
                            clojure-mode-hook
                            cider-repl-mode-hook
                            ))

(add-hook 'lisp-dialects-mode-hook 'func)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.