Come vengono elencati i modi minori attivi in ​​emacs?


Risposte:


125

C-h mo M-x describe-modemostra tutte le modalità minori attive (e le modalità principali) e una breve descrizione di ciascuna.


21

Nella variabile è memorizzato un elenco di tutti i comandi della modalità secondaria minor-mode-list. Per scoprire se sono attivi o meno, di solito si controlla 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: funziona solo per il buffer corrente (perché le modalità secondarie potrebbero essere abilitate solo in determinati buffer).


aggiungere alla lista all'interno della mappa? contorto.
Jrockway

4
@jrockway Non è il mio momento più orgoglioso.
Trey Jackson il

Usando boundpinvece di symbolpte puoi sbarazzarti del file condition-case.
Lassi

4

describe-modeposso in qualche modo inventare un elenco di modalità secondarie abilitate, perché non potrei? Quindi, dopo aver letto il suo codice sorgente, mi sono reso conto che ottiene l'elenco delle modalità secondarie attive da entrambi minor-mode-liste minor-mode-alist. Utilizzando la dash.ellibreria di manipolazione degli elenchi di terze parti, ho fornito questo codice:

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

Quindi, ad esempio, per disabilitare tutte le modalità minori, usa -each:

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

Non dimenticare di salvare l'elenco delle modalità minori in una variabile, altrimenti dovresti riavviare Emacs o abilitarle dalla memoria.


3

Se si vuole programmazione fare qualcosa con tutti i buffer che hanno una certa modalità attiva, quindi la migliore, più minimalista, pulito, built-in soluzione è 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))))

Fa quanto segue:

  1. Recupera un elenco di tutti i buffer tramite buffer-list, con il buffer attualmente attivo all'inizio dell'elenco (quindi viene trattato per primo, di solito quello che vuoi, ma lascia fuori il current-bufferparametro se non ti interessa).
  2. Scorrere l'elenco dei buffer e assegnare ogni nome di buffer alla variabile $buf.
  3. Usare with-current-buffer $bufper dire a Emacs che tutto il codice all'interno del corpo dovrebbe essere eseguito come se fosse in esecuzione all'interno del buffer $bufinvece del buffer che si sta realmente visualizzando sullo schermo.
  4. when <some mode variable>è il modo corretto per verificare se una modalità è abilitata; puoi anche usare ife altri metodi simili. In ogni caso, l'obiettivo è controllare se la variabile della modalità principale di una modalità minore o maggiore è impostata nel buffer. Quasi tutte le modalità definiscono una variabile tramite "definendo" una modalità, che automaticamente li porta a creare una variabile buffer locale dal nome della modalità, che è come funziona. E se non hanno una variabile standard, guarda il loro codice sorgente per vedere come il loro codice "toggle" determina come attivarle e disattivarle. Il 99% di loro utilizza l'esistenza della variabile del proprio nome (e se non lo fanno, suggerisco di segnalarlo come un bug all'autore della modalità). Ad esempio, per verificare se un buffer ha la modalità spazi bianchi attiva, diresti when whitespace-mode.
  5. Dopodiché, invia semplicemente un messaggio al buffer dei messaggi, con una "x" e il nome del buffer che aveva la modalità attiva. È lì che mettevi il tuo codice, per fare tutto ciò che volevi fare con il buffer scoperto.

Godere! Avanti per un codice lisp più grande e più pulito!


2

Ecco un semplice snippet alternativo 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))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.