Question

Comment avez-vous énumérer les modes mineurs actifs dans emacs?

Était-ce utile?

La solution

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

Autres conseils

Une liste de toutes les commandes de mode mineur est stockée dans la variable minor-mode-list . Savoir s'ils sont actifs ou non se fait habituellement en vérifiant la variable du même nom. Ainsi, vous pouvez 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)))

Note:. Cela ne fonctionne que pour le tampon courant (parce que les modes mineurs peuvent être activés que dans certains tampons)

describe-mode peut venir en quelque sorte avec une liste de modes mineurs a permis, pourquoi ne pourrais-je? Donc, après avoir lu son code source, j'ai réalisé qu'il obtient la liste des modes mineurs actifs à la fois minor-mode-list et minor-mode-alist. En utilisant 3ème partie 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))

Ne pas oublier d'enregistrer la liste des modes mineurs dans une variable, sinon vous devrez redémarrer Emacs ou les activer en mémoire.

Voici un simple extrait alternatif similaire à quelques-unes 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))

Si vous voulez programme faire quelque chose avec tous les tampons qui ont un certain mode actif, le meilleur, le plus minimaliste, plus propre, la solution intégrée 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 effectue les opérations suivantes:

  1. Récupérer une liste de tous les tampons via buffer-list, avec le tampon actuellement actif à la tête de la liste (il est d'abord traitée, généralement ce que vous voulez, mais laissez le paramètre current-buffer si vous ne vous inquiétez pas).
  2. Boucle dans la liste des tampons et attribuer à chaque nom de tampon à la $buf variable.
  3. Utilisez with-current-buffer $buf pour dire Emacs que tout le code dans le corps devrait fonctionner comme si elle était en cours d'exécution à l'intérieur de tampon $buf au lieu de tout tampon 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 toute façon, l'objectif est de vérifier si une personne mineure ou principale variable mode de grand-mode est défini dans la mémoire tampon. Presque tous les modes définissent une variable via « définir » un mode qui automatiquement les amène à créer une variable tampon locale du nom du mode, qui est de savoir comment cela fonctionne. Et si elles ne disposent pas d'une variable standard, regardez leur propre code source pour voir comment leur code « bascule » détermine comment les activer et désactiver. 99% d'entre eux utilisent l'existence de la variable de leur nom_mode (et si elles ne le font pas, je suggère que des rapports comme un bug à l'auteur du mode). Par exemple, pour vérifier si un tampon a des espaces en mode actif, vous diriez when whitespace-mode.
  5. Après cela, il émet juste un message à la mémoire 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, faire tout ce que vous vouliez faire avec le tampon découvert.

Amusez-vous! Onwards à une plus grande et plus propre code Lisp!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top