Wie listet man die aktiven Nebenmodi in Emacs auf?
Wie listet man die aktiven Nebenmodi in Emacs auf?
Antworten:
Eine Liste aller Befehle für den Nebenmodus wird in der Variablen gespeichert minor-mode-list
. Um herauszufinden, ob sie aktiv sind oder nicht, überprüfen Sie normalerweise die gleichnamige Variable. Sie können also so etwas tun:
(defun which-active-modes ()
"Give a message of which minor modes are enabled in the current buffer."
(interactive)
(let ((active-modes))
(mapc (lambda (mode) (condition-case nil
(if (and (symbolp mode) (symbol-value mode))
(add-to-list 'active-modes mode))
(error nil) ))
minor-mode-list)
(message "Active modes are %s" active-modes)))
Hinweis: Dies funktioniert nur für den aktuellen Puffer (da die Nebenmodi möglicherweise nur in bestimmten Puffern aktiviert sind).
boundp
anstelle von können symbolp
Sie die loswerden condition-case
.
describe-mode
kann irgendwie eine Liste der aktivierten Nebenmodi erstellen, warum konnte ich nicht? Nachdem ich den Quellcode gelesen hatte, stellte ich fest, dass er die Liste der aktiven Nebenmodi von minor-mode-list
und erhält minor-mode-alist
. Unter Verwendung der dash.el
Listenmanipulationsbibliothek eines Drittanbieters kam ich mit folgendem Code:
(--filter (and (boundp it) (symbol-value it)) minor-mode-list)
Um beispielsweise alle Nebenmodi zu deaktivieren, verwenden Sie -each
:
(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
(funcall it -1))
Vergessen Sie nicht, die Liste der Nebenmodi in einer Variablen zu speichern, da Sie sonst Emacs neu starten oder im Speicher aktivieren müssten.
Wenn Sie programmgesteuert etwas mit allen Puffern tun möchten , für die ein bestimmter Modus aktiv ist, lautet die beste, minimalistischste, sauberste und integrierte Lösung wie folgt:
(dolist ($buf (buffer-list (current-buffer)))
(with-current-buffer $buf
(when some-buffer-local-minor-or-major-mode-variable-you-want-to-find
(message "x %s" $buf))))
Es macht folgendes:
buffer-list
, wobei der aktuell aktive Puffer am Anfang der Liste steht (daher wird er zuerst behandelt, normalerweise das, was Sie möchten, aber lassen Sie den current-buffer
Parameter weg, wenn Sie sich nicht darum kümmern).$buf
.with-current-buffer $buf
Sie diese Option, um Emacs mitzuteilen, dass der gesamte Code im Body so ausgeführt werden soll, als würde er im Puffer ausgeführt, $buf
anstatt in dem Puffer, den Sie wirklich auf dem Bildschirm anzeigen.when <some mode variable>
ist der richtige Weg, um zu überprüfen, ob ein Modus aktiviert ist; Sie können auch if
und andere solche Methoden verwenden. In beiden Fällen besteht das Ziel darin, zu überprüfen, ob die Hauptmodusvariable eines Neben- oder Hauptmodus im Puffer festgelegt ist. Fast alle Modi definieren eine Variable über das "Definieren" eines Modus, wodurch sie automatisch eine pufferlokale Variable erstellen, die nach dem Modus benannt ist. So funktioniert das. Und wenn sie keine Standardvariable haben, sehen Sie sich ihren eigenen Quellcode an, um zu sehen, wie ihr "Umschalt" -Code bestimmt, wie sie ein- und ausgeschaltet werden. 99% von ihnen verwenden die Existenz der Variablen ihres Modenamens (und wenn nicht, schlage ich vor, dies dem Autor des Modus als Fehler zu melden). Um beispielsweise zu überprüfen, ob in einem Puffer der Leerzeichenmodus aktiv ist, würden Sie sagen when whitespace-mode
.Genießen! Weiter zu größerem und saubererem Lisp-Code!
Hier ist ein einfaches alternatives Snippet, das einigen Methoden ähnelt, die bereits in anderen Antworten behandelt wurden:
(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))