Comment listez-vous les modes mineurs actifs dans emacs?
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.
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).
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.
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))
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:
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).$buf
.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.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
.Prendre plaisir! En avant vers un code LISP plus grand et plus propre!