Como você listar os modos menores ativos no emacs?
-
19-09-2019 - |
Pergunta
Como você listar os modos menores ativos no emacs?
Solução
C-h m
ou M-x describe-mode
mostra todos os modos activas menores (e modo maior) e uma breve descrição de cada um.
Outras dicas
A lista de todos os comandos do modo menor é armazenado na variável minor-mode-list
. Descobrir se eles estão ativos ou geralmente não é feito verificando a variável de mesmo nome. Assim você pode fazer algo como isto:
(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:. Isso só funciona para o buffer atual (porque os modos de menores só poderia ser ativado em determinados buffers)
describe-mode
pode de alguma forma chegar a uma lista de modos de menores habilitados, por que não poderia? Então, depois de ler o seu código fonte, percebi que ele recebe a lista de modos menores ativos de ambos minor-mode-list
e minor-mode-alist
. Usando 3-parte dash.el
biblioteca lista manipulação eu vim com este código:
(--filter (and (boundp it) (symbol-value it)) minor-mode-list)
Assim, por exemplo, para desativar todos os modos menores, use -each
:
(--each (--filter (and (boundp it) (symbol-value it)) minor-mode-list)
(funcall it -1))
Não se esqueça de salvar a lista de modos de menores em uma variável, caso contrário, você teria que reiniciar Emacs ou permitir-lhes pela memória.
Aqui é uma alternativa simples fragmento semelhante a alguns dos métodos que já foram abordadas em outras respostas:
(delq nil
(mapcar
(lambda (x)
(let ((car-x (car x)))
(when (and (symbolp car-x) (symbol-value car-x))
x)))
minor-mode-alist))
Se você quiser programação fazer algo com todos os buffers que têm um certo modo ativo, então o melhor, mais minimalista, limpo, built-in solução é a seguinte:
(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))))
Ele faz o seguinte:
- Recuperar uma lista de todos os buffers via
buffer-list
, com o tampão atividade no momento na cabeça da lista (por isso é tratado em primeiro lugar, geralmente o que você quer, mas deixar de fora o parâmetrocurrent-buffer
se você não se importa). - loop através da lista tampão e atribuir o nome de cada tampão ao
$buf
variável. - Use
with-current-buffer $buf
para dizer Emacs que todo o código dentro do corpo deve ser executado como se estivesse rodando dentro tampão$buf
em vez de qualquer tampão que você está realmente exibindo na tela. -
when <some mode variable>
é a maneira correta para verificar se um modo é habilitado; você também pode usarif
e outros tais métodos. De qualquer maneira, o objetivo é verificar se um menor ou principal variável modo do major-mode está definido no buffer. Quase todos os modos de definir uma variável via "definir" um modo, que automaticamente faz com que eles para criar uma variável tampão-local nomeado após o modo, que é como isso funciona. E se eles não têm uma variável standard, olhar para o seu próprio código fonte para ver como o seu código "toggle" determina como para alternar-los ligado e desligado. 99% deles usam a existência de variável do seu modename (e se não o fizerem, eu sugiro reporte isso como um bug ao autor do modo). Por exemplo, para verificar se um buffer tem espaço em branco de modo ativo, você diriawhen whitespace-mode
. - Depois disso, ele apenas emite uma mensagem às mensagens tampão, com um "x" e o nome do buffer que teve o modo ativo. Isso é onde você colocar o seu próprio código, para fazer o que queria fazer com o tampão descoberto.
Divirta-se! Avante a maior e lisp código mais limpo!