Wie listet man die aktiven Nebenmodi in Emacs auf?

105

Wie listet man die aktiven Nebenmodi in Emacs auf?

Schreibgeschützt
quelle

Antworten:

125

C-h moder M-x describe-modezeigt alle aktiven Nebenmodi (und Hauptmodi) und eine kurze Beschreibung von jedem.

Phil
quelle
21

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

Trey Jackson
quelle
Add-to-List innerhalb der Karte? verschlungen.
Jrockway
4
@ Rockway Nicht mein stolzester Lisp-Moment.
Trey Jackson
Verwenden Sie boundpanstelle von können symbolpSie die loswerden condition-case.
Lassi
4

describe-modekann 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-listund erhält minor-mode-alist. Unter Verwendung der dash.elListenmanipulationsbibliothek 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.

Mirzhan Irkegulov
quelle
2

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:

  1. Rufen Sie eine Liste aller Puffer über ab 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-bufferParameter weg, wenn Sie sich nicht darum kümmern).
  2. Durchlaufen Sie die Pufferliste und weisen Sie der Variablen jeden Puffernamen zu $buf.
  3. Verwenden with-current-buffer $bufSie diese Option, um Emacs mitzuteilen, dass der gesamte Code im Body so ausgeführt werden soll, als würde er im Puffer ausgeführt, $bufanstatt in dem Puffer, den Sie wirklich auf dem Bildschirm anzeigen.
  4. when <some mode variable>ist der richtige Weg, um zu überprüfen, ob ein Modus aktiviert ist; Sie können auch ifund 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.
  5. Danach wird nur eine Nachricht an den Nachrichtenpuffer ausgegeben, mit einem "x" und dem Namen des Puffers, in dem der Modus aktiv war. Dort würden Sie Ihren eigenen Code einfügen, um mit dem erkannten Puffer alles zu tun, was Sie wollten.

Genießen! Weiter zu größerem und saubererem Lisp-Code!

gw0
quelle
2

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))
Gesetzesliste
quelle