2009-10-02 10 views

Respuesta

91

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

17

Una lista de todos los comandos de 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. Así que usted puede 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 sólo funciona para el búfer en uso (debido a que los modos menores podrían estar sólo disponible en determinados tampones).

+0

complemento a lista dentro de un mapa? complejo. – jrockway

+1

@jrockway No es mi momento de ceceo más orgulloso. –

3

describe-mode de alguna manera puede venir con 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 tanto de minor-mode-list como de minor-mode-alist. El uso de 3 ª parte dash.el biblioteca de listas manipulación Vine con este código:

(--filter (and (boundp it) (symbol-value it)) minor-mode-list) 

Así, por ejemplo, para desactivar todos los modos menores, utilizar -each:

(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list) 
     (funcall it -1)) 

No se olvide de guardar la lista de modos menores en una variable, de lo contrario tendrías que reiniciar Emacs o habilitarlos por memoria.

0

Si desea programación hacer algo con todos los tampones que tienen un cierto modo activo, entonces el mejor limpia solución, más minimalista,, 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)))) 

lo hace el siguiente:

  1. recuperar una lista de todos los buffers a través buffer-list, con el tampón activa en ese momento a la cabeza de la lista (por lo que se trata en primer lugar, por lo general lo que quiere, pero dejar de lado el parámetro current-buffer si no lo hace cuidado).
  2. Pasa por la lista de búfers 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 búfer $buf en lugar del búfer que realmente visualiza en la pantalla.
  4. when <some mode variable> es la forma correcta de comprobar si un modo está habilitado; también puede 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, 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.

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

1

Aquí es un simple fragmento alternativa similar a algunos de los métodos que ya han sido abordadas 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)) 
Cuestiones relacionadas