Comment listez-vous les modes mineurs actifs dans emacs?

105

Comment listez-vous les modes mineurs actifs dans emacs?

Lecture seulement
la source

Réponses:

125

C-h mou M-x describe-modeaffiche tous les modes mineurs actifs (et le mode majeur) et une brève description de chacun.

Phil
la source
21

Une liste de toutes les commandes du mode mineur est stockée dans la variable minor-mode-list. Savoir s'ils sont actifs ou non se fait généralement en vérifiant la variable du même nom. Vous pouvez donc faire quelque chose comme ceci:

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

Remarque: cela ne fonctionne que pour le tampon actuel (car les modes mineurs peuvent être activés uniquement dans certains tampons).

Trey Jackson
la source
ajouter à la liste à l'intérieur de la carte? convoluté.
jrockway
4
@jrockway Pas mon moment lisp le plus fier.
Trey Jackson
En utilisant à la boundpplace de symbolpvous pouvez vous débarrasser du fichier condition-case.
Lassi
4

describe-modepeut en quelque sorte proposer une liste des modes mineurs activés, pourquoi je ne pourrais pas? Donc, après avoir lu son code source, j'ai réalisé qu'il obtenait la liste des modes mineurs actifs à la fois minor-mode-listet minor-mode-alist. En utilisant la dash.elbibliothèque de manipulation de liste tierce , je suis venu avec ce code:

(--filter (and (boundp it) (symbol-value it)) minor-mode-list)

Ainsi, par exemple, pour désactiver tous les modes mineurs, utilisez -each:

(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
        (funcall it -1))

N'oubliez pas de sauvegarder la liste des modes mineurs dans une variable, sinon vous devrez redémarrer Emacs ou les activer par mémoire.

Mirzhan Irkegulov
la source
3

Si vous voulez faire quelque chose par programme avec tous les tampons qui ont un certain mode actif, alors la meilleure solution intégrée, la plus minimaliste, la plus propre est la suivante:

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

Il fait ce qui suit:

  1. Récupérez une liste de tous les tampons via buffer-list, avec le tampon actuellement actif en tête de la liste (il est donc traité en premier, généralement ce que vous voulez, mais laissez de côté le current-bufferparamètre si vous ne vous en souciez pas).
  2. Parcourez la liste des tampons et attribuez chaque nom de tampon à la variable $buf.
  3. Utilisez with-current-buffer $bufpour dire à Emacs que tout le code dans le corps doit fonctionner comme s'il s'exécutait à l'intérieur du tampon $bufau lieu du tampon que vous affichez réellement à l'écran.
  4. when <some mode variable>est la bonne façon de vérifier si un mode est activé; vous pouvez également utiliser ifet d'autres méthodes de ce type. Dans tous les cas, le but est de vérifier si une variable de mode principal d'un mode mineur ou majeur est définie dans le tampon. Presque tous les modes définissent une variable en "définissant" un mode, ce qui les amène automatiquement à créer une variable locale de tampon nommée d'après le mode, ce qui fonctionne. Et s'ils n'ont pas de variable standard, regardez leur propre code source pour voir comment leur code "bascule" détermine comment les activer et les désactiver. 99% d'entre eux utilisent l'existence de la variable de leur nom de mod (et s'ils ne le font pas, je suggère de signaler cela comme un bogue à l'auteur du mode). Par exemple, pour vérifier si un tampon a le mode espace blanc actif, vous diriez when whitespace-mode.
  5. Après cela, il sort juste un message dans le tampon de messages, avec un "x" et le nom du tampon qui avait le mode actif. C'est là que vous mettriez votre propre code, pour faire tout ce que vous vouliez faire avec le tampon découvert.

Prendre plaisir! Vers un code lisp plus grand et plus propre!

gw0
la source
2

Voici un extrait de code alternatif simple similaire à certaines des méthodes qui ont déjà été abordées dans d'autres réponses:

(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))
liste de lois
la source