web-dev-qa-db-fra.com

Comment listez-vous les modes mineurs actifs dans emacs?

Comment listez-vous les modes mineurs actifs dans emacs?

102
Readonly

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

117
Phil

Une liste de toutes les commandes en mode mineur est stockée dans la variable minor-mode-list . Découvrir si elles sont actives 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).

20
Trey Jackson

describe-mode peut en quelque sorte proposer une liste des modes mineurs activés, pourquoi pas? Donc, après avoir lu son code source, j'ai réalisé qu'il obtient la liste des modes mineurs actifs des deux minor-mode-list et minor-mode-alist. Utilisation de tiers dash.el bibliothèque de manipulation de liste 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 la mémoire.

3
Mirzhan Irkegulov

Voici un simple extrait alternatif similaire à certaines des méthodes qui ont déjà été traité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))
2
lawlist

Si vous voulez par programme faire quelque chose 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 sans le current-buffer paramètre si vous ne vous en souciez pas).
  2. Parcourez la liste des tampons et affectez chaque nom de tampon à la variable $buf.
  3. Utilisation with-current-buffer $buf pour indiquer à Emacs que tout le code dans le corps doit s'exécuter comme s'il s'exécutait dans le tampon $buf au lieu du tampon que vous affichez vraiment à l'écran.
  4. when <some mode variable> est la bonne façon de vérifier si un mode est activé; vous pouvez également utiliser if et d'autres méthodes de ce type. Quoi qu'il en soit, l'objectif 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 via la "définition" d'un mode, ce qui automatiquement les oblige à créer une variable tampon locale nommée d'après le mode, c'est ainsi que cela 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èle (et s'ils ne le font pas, je suggère de signaler cela comme un bug à l'auteur du mode). Par exemple, pour vérifier si le mode espace blanc est activé dans un tampon, vous diriez when whitespace-mode.
  5. Après cela, il sort simplement un message dans le tampon 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! En avant vers un code LISP plus grand et plus propre!

1
gw0