¿Cómo “agrupo” los ganchos?


14

Hay ciertas cosas como la visualización del espacio en blanco al final, la visualización de los límites del búfer, los delimitadores de colores del arco iris y muchos más que me gustaría habilitar en la mayoría de los modos o más bien, todos los relacionados con la programación y el texto (porque mostrar espacios al final, digamos ediff-mode, entraría en conflicto con el modo mayor) en lugar de usar un modo menor globalizado con reglas de excepción. Dado que la mayoría de los modos se derivan de cualquiera prog-modeo text-mode, agregar la función en cuestión a ambos prog-mode-hooky text-mode-hookfunciona, sin embargo, hay suficientes modos que no siguen esta especificación, como css-modeo LaTeX-mode.

Me gustaría definir un gancho que abarque todos estos modos por el momento para agregar solo funciones a un gancho. Llamémoslo non-special-mode-hook(para distinguirlo de special-mode-hook). ¿Cómo podría crear un gancho que se ejecute para todos los modos principales para los que está hecho?


Respuestas:


19

Solo agrupe esas configuraciones en una función y agregue esa función a todas las funciones de enlace relevantes:

(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))

Ninguna otra forma de hacerlo sería más conciso: pase lo que pase, en algún lugar tendrá una lista blanca o una lista negra de modos. En la práctica, solo encontrará algunos modos que deben agregarse a la lista, por lo que sugeriría que las cosas sean simples.

En mi propia configuración, uso exactamente este truco para unificar la configuración de varios modos orientados a lisp.


Gracias, creo que también adaptaré esta solución para otros grupos útiles (como los lispy).
wasamasa

1
Eso es exactamente lo que hago yo mismo: github.com/purcell/emacs.d/blob/…
sanityinc

1
Excelente, ¿podrías agregar la URL a tu respuesta? Creo que el fragmento resaltado no solo explica muy bien el uso real, sino que también demuestra un uso posterior, como el uso de un "gancho" relacionado con Emacs Lisp como subconjunto de un "gancho" más grande y cómo se crearían automáticamente nombres de gancho a partir de los modos principales existentes con derived-mode-hook-name.
wasamasa

Esto me gusta más que el mío, solo para el (dolist ...)vs (add-hook ...)<repeat>. Sólo había quedo con la mía cuando se mantiene el modo específico cambia independiente (archivo-por-modo, use-package, el-get). Ambas son soluciones integrales, pero desde diferentes puntos de vista.
Jonathan Leech-Pepin

Tenga en cuenta que si no proporciona un APPENDargumento no nulo add-hookaquí, los ganchos se invocarán en el orden inverso al orden de la lista que proporcione. Nada de malo con eso; solo tenlo en cuenta, en caso de que el orden sea importante.
Drew

5

Podría agregar una función a after-change-major-mode-hook, que verifique si el nuevo modo es interesante (posiblemente a través de (not (derived-mode-p 'special-mode))), y si es así, se ejecuta non-special-mode-hook.


Esto suena bastante ingenioso (una vez que uno ha descubierto todos los modos "no especiales" ya que hay algunos que simplemente usan fundamental-mode, pero hacen más que solo mostrar texto), pero un poco demasiado mágico para mi gusto. De ahí el voto a favor.
wasamasa

4

Me encontré a menudo haciendo el patrón de @ sanityinc de envolver mis configuraciones y activaciones de modo menores en un defun y recorrer los ganchos para llamarlo, pero quería un enfoque más limpio, así que escribí esta macro:

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

Nota: Estoy a dash.elfavor de la limpieza, pero podría adaptarse fácilmente para usar (dolist).

Luego puede definir modos agrupados como variables de lista y usarlo así:

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

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

1
Tenga en cuenta que aquí puede usar derived-mode-hook-namepara obtener el nombre de la variable de enlace de un modo, evitando así el interntruco.
sanityinc

@sanityinc TIL derived-mode-hook-name. buen consejo!
waymondo

1

En lugar de definir un nuevo enlace que funcione para todos estos modos no derivados , puede hacer lo siguiente.

(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)

Aún necesitará agregarlo a todos los modos, pero al definir su función para incluir todos los modos, solo tendrá que cambiar una definición al agregar / eliminar funciones adicionales.


-2

Quizás puedas probar esto:

(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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.