Comment listez-vous les modes mineurs actifs dans emacs?
Comment listez-vous les modes mineurs actifs dans emacs?
Réponses:
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).
boundp
place de symbolp
vous pouvez vous débarrasser du fichier condition-case
.
describe-mode
peut 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-list
et minor-mode-alist
. En utilisant la dash.el
bibliothè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.
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:
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-buffer
paramètre si vous ne vous en souciez pas).$buf
.with-current-buffer $buf
pour dire à Emacs que tout le code dans le corps doit fonctionner comme s'il s'exécutait à l'intérieur du tampon $buf
au lieu du tampon que vous affichez réellement à 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. 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
.Prendre plaisir! Vers un code lisp plus grand et plus propre!
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))