¿Cómo enumera los modos menores activos en emacs?

Respuestas:

125

C-h mo M-x describe-modemuestra todos los modos menores activos (y el modo mayor) y una breve descripción de cada uno.

Phil
fuente
21

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

Trey Jackson
fuente
añadir a la lista dentro del mapa? complejo.
Jrockway
4
@jrockway No es mi momento de ceceo más orgulloso.
Trey Jackson
Usando en boundplugar de symbolpusted puede deshacerse del condition-case.
Lassi
4

describe-modede 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-listy minor-mode-alist. Usando la dash.elbiblioteca 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.

Mirzhan Irkegulov
fuente
3

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:

  1. Recupere una lista de todos los búferes a través de 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-bufferparámetro si no le importa).
  2. Recorra la lista de búfer y asigne cada nombre de búfer a la variable $buf.
  3. Úselo with-current-buffer $bufpara decirle a Emacs que todo el código dentro del cuerpo debe ejecutarse como si se estuviera ejecutando dentro del búfer en $buflugar de cualquier búfer que esté mostrando en la pantalla.
  4. when <some mode variable>es la forma correcta de comprobar si un modo está habilitado; también puede utilizar ify 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.
  5. Después de eso, solo envía 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ía su propio código, para hacer lo que quisiera hacer con el búfer descubierto.

¡Disfrutar! ¡Adelante a un código lisp mayor y más limpio!

gw0
fuente
2

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))
lista de abogados
fuente