¿Cómo enumera los modos menores activos en emacs?
¿Cómo enumera los modos menores activos en emacs?
Respuestas:
En la variable se almacena una lista de todos los comandos del modo menor minor-mode-list
. Averiguar si están activos o no se suele hacer comprobando la variable del mismo nombre. Entonces puedes hacer algo como esto:
(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)))
Nota: esto solo funciona para el búfer actual (porque los modos menores pueden estar habilitados solo en ciertos búferes).
boundp
lugar de symbolp
usted puede deshacerse del condition-case
.
describe-mode
de alguna manera puedo crear una lista de modos menores habilitados, ¿por qué no podría? Entonces, después de leer su código fuente, me di cuenta de que obtiene la lista de modos menores activos de ambos minor-mode-list
y minor-mode-alist
. Usando la dash.el
biblioteca de manipulación de listas de terceros , vine con este código:
(--filter (and (boundp it) (symbol-value it)) minor-mode-list)
Entonces, por ejemplo, para deshabilitar todos los modos menores, use -each
:
(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
(funcall it -1))
No olvide guardar la lista de modos menores en una variable, de lo contrario tendría que reiniciar Emacs o habilitarlos por memoria.
Si desea hacer algo mediante programación con todos los búferes que tienen un determinado modo activo, entonces la mejor solución integrada, la más minimalista y más limpia es la siguiente:
(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))))
Hace lo siguiente:
buffer-list
, con el búfer actualmente activo al principio de la lista (para que se trate primero, generalmente lo que desea, pero omita el current-buffer
parámetro si no le importa).$buf
.with-current-buffer $buf
para decirle a Emacs que todo el código dentro del cuerpo debe ejecutarse como si se estuviera ejecutando dentro del búfer en $buf
lugar de cualquier búfer que esté mostrando en la pantalla.when <some mode variable>
es la forma correcta de comprobar si un modo está habilitado; también puede utilizar if
y otros métodos similares. De cualquier manera, el objetivo es verificar si una variable de modo principal de modo menor o mayor está configurada en el búfer. Casi todos los modos definen una variable a través de "definir" un modo, lo que hace que automáticamente creen una variable local de búfer con el nombre del modo, que es como funciona esto. Y si no tienen una variable estándar, mire su propio código fuente para ver cómo su código de "alternancia" determina cómo activarlas y desactivarlas. El 99% de ellos usan la existencia de la variable de su nombre de modo (y si no lo hacen, sugiero informarlo como un error al autor del modo). Por ejemplo, para comprobar si un búfer tiene el modo de espacios en blanco activo, diría when whitespace-mode
.¡Disfrutar! ¡Adelante a un código lisp mayor y más limpio!
Aquí hay un fragmento alternativo simple similar a algunos de los métodos que ya se han abordado en otras respuestas:
(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))