Pergunta

Como você listar os modos menores ativos no emacs?

Foi útil?

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:

  1. 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âmetro current-buffer se você não se importa).
  2. loop através da lista tampão e atribuir o nome de cada tampão ao $buf variável.
  3. 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.
  4. when <some mode variable> é a maneira correta para verificar se um modo é habilitado; você também pode usar if 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ê diria when whitespace-mode.
  5. 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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top