Come posso "raggruppare" i ganci?


14

Ci sono alcune cose come la visualizzazione degli spazi vuoti finali, la visualizzazione dei limiti del buffer, i delimitatori color arcobaleno e molti altri che vorrei abilitare nella maggior parte delle modalità o meglio, tutti quelli relativi alla programmazione e al testo (perché visualizzare gli spazi finali in, dire ediff-mode, si scontrerebbe con la modalità principale) invece di utilizzare una modalità secondaria globalizzata con regole di eccezione. Poiché la maggior parte delle modalità derivano da una prog-modeo dall'altra text-mode, aggiungendo la funzione in questione ad entrambe prog-mode-hooke text-mode-hookfunziona, tuttavia ci sono abbastanza modalità che non seguono questa specifica, come css-modeo LaTeX-mode.

Vorrei definire un hook che racchiuda per ora tutte queste modalità per aggiungere solo funzioni a un hook. Chiamiamolo non-special-mode-hook(per distinguerlo da special-mode-hook). Come sarei in grado di creare un tale hook che viene eseguito per tutte le principali modalità per cui è realizzato?


Risposte:


19

Raggruppa semplicemente quelle impostazioni in una funzione e aggiungi quella funzione a tutte le funzioni hook rilevanti:

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

Nessun altro modo per farlo sarebbe più conciso: qualunque cosa accada, da qualche parte avrai una whitelist o una lista nera di modalità. In pratica, troverai solo alcune modalità che devono essere aggiunte all'elenco, quindi suggerirei di mantenere le cose semplici.

Nella mia configurazione, uso esattamente questo trucco per unificare la configurazione di diverse modalità orientate ai lisp.


Grazie, penso che adatterò questa soluzione anche ad altri gruppi utili (come quelli lispy).
wasamasa,

1
Questo è esattamente quello che faccio io stesso: github.com/purcell/emacs.d/blob/…
sanityinc

1
Eccellente, potresti forse aggiungere l'URL alla tua risposta? Credo che lo snippet evidenziato non solo spieghi molto bene l'uso effettivo, ma dimostri anche un ulteriore utilizzo, come l'uso di un "hook" correlato a Emacs Lisp come sottoinsieme di un "hook" più grande e come si creerebbero automaticamente i nomi degli hook dalle modalità principali esistenti con derived-mode-hook-name.
wasamasa,

Mi piace questo più che la mia, solo per il (dolist ...)vs (add-hook ...)<ripetizione>. Mi piacerebbe restare solo con la mia quando mantenendo la modalità-specifici cambia separato (file-per-mode, use-package, el-get). Entrambe sono soluzioni all-in-one-place, ma da diversi punti di vista.
Jonathan Leech-Pepin,

Tieni presente che se non fornisci un APPENDargomento diverso da zero add-hookqui, gli hook verranno invocati in ordine inverso rispetto all'elenco che fornisci. Niente di sbagliato in questo; basta essere consapevoli di ciò, nel caso l'ordine sia importante.
Drew

5

È possibile aggiungere una funzione a after-change-major-mode-hook, che controlla se la nuova modalità è interessante (possibilmente attraverso (not (derived-mode-p 'special-mode))), e se funziona non-special-mode-hook.


Sembra abbastanza elegante (una volta che uno ha capito tutte le modalità "non speciali" poiché ce ne sono alcune che usano solo fundamental-mode, ma fanno molto di più che mostrare semplicemente il testo), ma un po 'troppo magico per i miei gusti. Da qui il voto.
wasamasa,

4

Mi sono ritrovato spesso a fare il modello di @ sanityinc di avvolgere le mie impostazioni e le attivazioni della modalità minore in una defun e di fare un giro tra i ganci per chiamarlo, ma volevo un approccio più pulito, quindi ho scritto questa macro:

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

Nota: sono dash.elper la pulizia, ma potrebbe essere facilmente adattato per l'uso (dolist).

Quindi puoi definire le modalità raggruppate come variabili di elenco e usarlo in questo modo:

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

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

1
Nota che qui puoi usare derived-mode-hook-nameper ottenere il nome della variabile hook di una modalità, evitando così il interntrucco.
sanityinc

@sanityinc TIL derived-mode-hook-name. bel consiglio!
Waymondo

1

Invece di definire un nuovo hook che funzioni per tutte queste modalità non derivate , puoi fare quanto segue.

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

Dovrai comunque aggiungerlo a tutte le modalità, ma definendo la tua funzione per includere tutte le modalità dovrai solo cambiare una definizione quando aggiungi / rimuovi funzionalità aggiuntive.


-2

Forse puoi provare questo:

(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)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.