emacs minor-mode

¿Cómo se enumeran los modos menores activos en emacs?



minor-mode (5)

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))

¿Cómo se enumeran los modos menores activos en emacs?


Si desea hacer algo programáticamente con todos los buffers que tienen un cierto modo activo, entonces la mejor solución, la más minimalista, la más limpia y la más incorporada 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:

  1. Recupere una lista de todos los almacenamientos intermedios a través de la lista de almacenamiento buffer-list , con el almacenamiento intermedio activo al principio de la lista (por lo tanto, se trata primero, generalmente lo que desea, pero omita el parámetro de current-buffer si no le importa).
  2. Pasa por la lista de búfer y asigna cada nombre de búfer a la variable $buf .
  3. Utilice with-current-buffer $buf para decirle a Emacs que todo el código dentro del cuerpo debería ejecutarse como si se estuviera ejecutando dentro del buffer $buf lugar del búfer que está realmente visualizando en la pantalla.
  4. when <some mode variable> es la forma correcta de verificar si un modo está habilitado; también puedes usar if y otros métodos similares. De cualquier manera, el objetivo es verificar si una variable de modo principal menor o principal está configurada en el búfer. Casi todos los modos definen una variable a través de "definir" un modo, lo que automáticamente hace que creen una variable local de buffer nombrada después del modo, que es cómo funciona esto. Y si no tienen una variable estándar, mira su propio código fuente para ver cómo su código "alternar" determina cómo activar y desactivar. El 99% de ellos usa la existencia de la variable de su nombre de modo (y si no lo hacen, sugiero informar eso como un error al autor del modo). Por ejemplo, para verificar si un búfer tiene el modo de espacio en blanco activo, diría when whitespace-mode .
  5. Después de eso, solo emite un mensaje al búfer de Mensajes, con una "x" y el nombre del búfer que tenía el modo activo. Ahí es donde pondrías tu propio código, para hacer lo que quisieras hacer con el buffer descubierto.

¡Disfrutar! ¡Hacia un código de lisp mayor y más limpio!


Una lista de todos los comandos del modo menor se almacena en la variable minor-mode-list . Averiguar si están activos o no se suele hacer mediante la comprobación de 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 en uso (porque los modos menores solo pueden estar habilitados en ciertos búferes).


Ch m Mx describe-mode Ch m o Mx describe-mode muestra todos los modos menores activos (y el modo principal) y una breve descripción de cada uno.


describe-mode alguna manera puede venir con una lista de modos menores habilitados, ¿por qué no podría? Así que después de leer su código fuente me di cuenta de que obtiene la lista de modos menores activos de minor-mode-list y minor-mode-alist . Usando la biblioteca de manipulación de la lista dash.el 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 olvides guardar la lista de modos secundarios en una variable, de lo contrario tendrías que reiniciar Emacs o habilitarlos por memoria.