Come vengono elencati i modi minori attivi in emacs?
Come vengono elencati i modi minori attivi in emacs?
Risposte:
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).
boundp
invece di symbolp
te puoi sbarazzarti del file condition-case
.
describe-mode
posso 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-list
e minor-mode-alist
. Utilizzando la dash.el
libreria 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.
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:
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-buffer
parametro se non ti interessa).$buf
.with-current-buffer $buf
per dire a Emacs che tutto il codice all'interno del corpo dovrebbe essere eseguito come se fosse in esecuzione all'interno del buffer $buf
invece del buffer che si sta realmente visualizzando sullo schermo.when <some mode variable>
è il modo corretto per verificare se una modalità è abilitata; puoi anche usare if
e 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
.Godere! Avanti per un codice lisp più grande e più pulito!