Domanda

Come elenchi le modalità minori attive in emacs?

È stato utile?

Soluzione

C-h m o M-x describe-mode mostra tutti i modi attivi minori (e modalità principale) ed una breve descrizione di ciascuno.

Altri suggerimenti

Nella variabile è memorizzato un elenco di tutti i comandi in modalità minore minor-mode-list.Scoprire se sono attivi o meno viene solitamente fatto controllando la variabile con lo stesso nome.Quindi puoi fare qualcosa del genere:

(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:questo funziona solo per il buffer corrente (perché le modalità minori potrebbero essere abilitate solo in determinati buffer).

describe-mode possa in qualche modo trovare una lista di modalità secondarie abilitati, perché non potrei? Così, dopo aver letto il suo codice sorgente mi sono reso conto che si ottiene l'elenco delle modalità secondarie attivi sia da minor-mode-list e minor-mode-alist. Utilizzando 3rd-party dash.el biblioteca lista di manipolazione sono venuto con questo codice:

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

Quindi, per esempio, per disabilitare tutte le modalità secondarie, utilizzare -each :

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

Non dimenticare di salvare la lista delle modalità secondarie in una variabile, altrimenti si sarebbe necessario riavviare Emacs o abilitare dalla memoria.

Ecco un semplice frammento di un'alternativa simile ad alcuni dei metodi che sono già stati affrontati in altre risposte:

  
(delq nil
  (mapcar
    (lambda (x)
      (let ((car-x (car x)))
        (when (and (symbolp car-x) (symbol-value car-x))
          x)))
    minor-mode-alist))

Se si desidera a livello di codice fare qualcosa con tutti i buffer che hanno una certa modalità attiva, poi il, più minimalista, pulito, migliore soluzione integrata è la seguente:

(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 fa il seguente:

  1. recuperare un elenco di tutti i buffer tramite buffer-list, con il buffer attualmente attivo a capo della lista (in modo che sia trattata prima, di solito quello che vuoi, ma lasciare fuori il parametro current-buffer se non vi interessa).
  2. Loop attraverso l'elenco di buffer e assegnare ciascuna buffer alla $buf variabile.
  3. Usa with-current-buffer $buf dire Emacs che tutto il codice all'interno del corpo deve essere eseguito come se fosse in esecuzione all'interno del buffer $buf al posto di qualsiasi buffer di sei veramente la visualizzazione sullo schermo.
  4. when <some mode variable> è il modo corretto per verificare se una modalità è abilitata; è possibile utilizzare anche if e altri tali metodi. In entrambi i casi, l'obiettivo è quello di verificare se un minore o variabile modalità principale del maggiore-MODE è impostato nel buffer. Quasi tutti i modi di definire una variabile tramite "definendo" una modalità, che automaticamente li induce a creare una variabile di buffer locale prende il nome la modalità, che è come funziona. E se non hanno una variabile standard, guardare la propria codice sorgente per vedere come il loro codice "toggle" determina il modo per passare li on e off. 99% di loro usa l'esistenza di variabili di loro modename (e se non lo fanno, vi suggerisco di segnalazione che come un bug all'autore della modalità). Per esempio, per verificare se un buffer ha spazio bianco-modalità attiva, si potrebbe dire when whitespace-mode.
  5. Dopo di che, solo emette un messaggio al buffer dei messaggi, con una "x" e il nome del buffer che ha avuto la modalità attiva. Ecco dove ci si mette il proprio codice, per fare quello che si voleva fare con il buffer scoperto.

Buon divertimento! Poi ad una maggiore e più pulito codice Lisp!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top