Ocultar lista de modos secundários na linha de modo


22

Eu uso vários modos secundários e geralmente sei qual modo secundário está ativado em todos os modos principais. Se eu realmente quiser ver a lista completa, posso correr C-h v minor-mode-list.

Ao mesmo tempo, minha linha de modo fica realmente entupida; portanto, quando eu divido verticalmente o quadro, às vezes não consigo ler o final da linha de modo.

Pergunta real: como desativar a exibição da lista de modos secundários na linha de modo? Por exemplo, agora pode ser assim:

-:--- main.c        All (7,12)     (C/l FlyC SScr Abbrev Fill) [main] 16:19 0.45

Quero que pareça mais conciso:

-:--- main.c        All (7,12)     (C/l) [main] 16:19


2
Você também pode olhar para o modo de minoria rica .
precisa

Respostas:


15

O modo Diminuir (disponível no Melpa) fará isso.

(diminish 'projectile-mode)

2
Se você quiser apenas para encurtar o nome do modo menor, em vez de escondê-lo totalmente você pode usar(diminish 'projectile-mode "p")
erikstokes

5
Observe também que o uso real de diminuir é (eval-after-load "filladapt" '(diminish 'filladapt-mode))(usando o exemplo do Wiki Emacs) e não apenas (diminish 'filladapt-mode)como sugerido pela resposta. Você pode usar a versão curta se o modo já estiver garantido.
Phs #

15

Como o mbork comentou, você pode usar delight.el para modificar ou desativar seletivamente o texto do modo secundário (e de fato o principal) na linha de modo.

Uma das vantagens é que ele cuida de eval-after-load(que você precisa escrever manualmente com diminish.el na maioria dos casos de uso), o que torna a configuração mais limpa. Você ainda precisa das mesmas informações - o nome do modo e a biblioteca que o implementa (o que o Emacs dirá se você perguntar sobre o modo) - mas você pode agrupar tudo em um único formulário:

 (require 'delight)
 (delight '((some-mode nil "some-library")
            (some-other-mode nil "some-other-library")))

(Ou siga o link acima para alguns exemplos de uso real.)

Eu recomendaria esta abordagem, porque mesmo que você não quer mais texto modo menor mais leve, há uma boa chance que você vai encontrar alguns deles útil (e você ainda pode modificar aquelas a ser mais curto).

Se você realmente deseja eliminar todo o texto menor do modo secundário (e novamente, eu não o recomendo), você pode modificar a mode-line-modesvariável. As variáveis ​​da linha de modo foram alteradas há algum tempo, portanto, você pode usar M-x find-variable RET mode-line-modes RETe adaptar manualmente sua definição padrão, editando a seção referente minor-modes-alist.

Obviamente, você precisaria mantê-lo, o que não é tão rápido, então você pode preferir substituir o minor-mode-alistsímbolo dentro do valor existente. A seguir, é um pouco específico da implementação, mas certamente melhor do que definir mode-line-modesna íntegra, e você pode ativar e desativar.

(define-minor-mode minor-mode-blackout-mode
  "Hides minor modes from the mode line."
  t)

(catch 'done
  (mapc (lambda (x)
          (when (and (consp x)
                     (equal (cadr x) '("" minor-mode-alist)))
            (let ((original (copy-sequence x)))
              (setcar x 'minor-mode-blackout-mode)
              (setcdr x (list "" original)))
            (throw 'done t)))
        mode-line-modes))

(global-set-key (kbd "C-c m") 'minor-mode-blackout-mode)

Bem, é triste que não exista pacote de "deleite".
Mark Karpov

2
Com o Emacs sendo antigo e o package.el sendo novo, há um monte de bibliotecas úteis que não possuem pacotes. Se você quiser se limitar dessa maneira, sugiro olhar para el-get, que atuará como gerente (atualização incluída) para uma grande variedade de outros tipos de fontes de biblioteca.
phils

1
@ Drew, eu sei sobre load-pathe require. Eu costumava 'instalar' todos os pacotes do Emacs dessa maneira quando comecei a usá-lo há um ano.
Mark Karpov

3
Acabei de adicionar delightao MELPA.
Sanityinc # 28/14

1
nb delightestá no GNU ELPA atualmente, e não no MELPA (mencionado no caso de alguém ficar confuso com os comentários anteriores).
phils

8

Use Minoria rica com config:

(require 'rich-minority)
(rich-minority-mode 1)
(setf rm-blacklist "")

Eu também tenho o pensamento como você, mas diminuo a linha de modo mais paranóica :

  • Remova todos os espaços indesejados
  • Remova todos os espaços e "largura mínima" do campo de informações da posição do buffer.
;; Remove all unwanted spaces
(setq-default mode-line-format
          '("%e" mode-line-front-space mode-line-mule-info mode-line-client mode-line-modified mode-line-remote mode-line-buffer-identification mode-line-position
        (vc-mode vc-mode) " "
        mode-line-modes mode-line-misc-info mode-line-end-spaces))
;; Remove all spaces and "min-width" of position info on mode-line
(setq mode-line-position
      `((1 ,(propertize
         " %p"
         'local-map mode-line-column-line-number-mode-map
         'mouse-face 'mode-line-highlight
         ;; XXX needs better description
         'help-echo "Size indication mode\n\
mouse-1: Display Line and Column Mode Menu"))
    (size-indication-mode
     (2 ,(propertize
          "/%I"
          'local-map mode-line-column-line-number-mode-map
          'mouse-face 'mode-line-highlight
          ;; XXX needs better description
          'help-echo "Size indication mode\n\
mouse-1: Display Line and Column Mode Menu")))
    (line-number-mode
     ((column-number-mode
       (1 ,(propertize
        "(%l,%c)"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Line number and Column number\n\
mouse-1: Display Line and Column Mode Menu"))
       (1 ,(propertize
        "L%l"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Line Number\n\
mouse-1: Display Line and Column Mode Menu"))))
     ((column-number-mode
       (1 ,(propertize
        "C%c"
        'local-map mode-line-column-line-number-mode-map
        'mouse-face 'mode-line-highlight
        'help-echo "Column number\n\
mouse-1: Display Line and Column Mode Menu"))))))
      )

Agora, sempre consigo ver a notificação no modo Twitter e o timer do modo Org: D


5

Aqui está o que funcionou para mim:

(defvar hidden-minor-modes ; example, write your own list of hidden
  '(abbrev-mode            ; minor modes
    auto-fill-function
    flycheck-mode
    flyspell-mode
    inf-haskell-mode
    haskell-indent-mode
    haskell-doc-mode
    smooth-scroll-mode))

(defun purge-minor-modes ()
  (interactive)
  (dolist (x hidden-minor-modes nil)
    (let ((trg (cdr (assoc x minor-mode-alist))))
      (when trg
        (setcar trg "")))))

(add-hook 'after-change-major-mode-hook 'purge-minor-modes)

Graças ao comentário de Drew , aprimorei a realização desta solução. Agora ele usa os benefícios das listas de associação e deve ser um pouco mais eficiente ;-)


FWIW, ele não capturará modos secundários não carregados anteriormente, que são ativados manualmente, nem modos que atualizam dinamicamente seu texto mais claro (não que as outras bibliotecas também o façam). Mas, caso contrário, parece uma abordagem razoavelmente prática.
phils

1
O objetivo de minor-mode-alistser um alista é que as entradas podem ser adicionadas e removidas na cabeça para sombrear e descompactar as entradas mais abaixo na lista que possuem a mesma chave. Se você quiser fazer o tipo de coisa que está fazendo, basta alterar a primeira entrada (encontrada usando assoc, alterada usando setcaretc.) para cada chave, para que você não perca esse recurso útil e pretendido.
Drew

@ Drew, você está certo, veja o meu melhorou a minha solução.
Mark Karpov

Sim; foi isso que eu quis dizer.
Drew

3

Vou jogar minha solução para isso no ringue também:

(defun modeline-set-lighter (minor-mode lighter)
  (when (assq minor-mode minor-mode-alist)
    (setcar (cdr (assq minor-mode minor-mode-alist)) lighter)))

(defun modeline-remove-lighter (minor-mode)
  (modeline-set-lighter minor-mode ""))

modeline-set-lighterpermite que você defina o modo mais leve de um modo menor para qualquer corda que desejar. modeline-remove-lighterpermite remover completamente o isqueiro de um modo menor.

Então, no final do meu arquivo init, chamo essas funções para os modos secundários cujos isqueiros eu quero modificar:

(modeline-remove-lighter 'auto-complete-mode)
(modeline-remove-lighter 'git-gutter+-mode)
(modeline-remove-lighter 'guide-key-mode)
(modeline-remove-lighter 'whitespace-mode)
(modeline-set-lighter 'abbrev-mode " Abbr")
(modeline-set-lighter 'auto-fill-function (string 32 #x23ce))

2

Você também pode remover sem rodeios todos os modos secundários, da seguinte maneira:

(setq mode-line-modes
      (mapcar (lambda (elem)
                (pcase elem
                  (`(:propertize (,_ minor-mode-alist . ,_) . ,_)
                   "")
                  (t elem)))
              mode-line-modes))

Isso também irá trabalhar para modos menores definidas no futuro, uma vez que remove apenas completamente o uso de minor-mode-alistdo mode-line-format.


1

Vale a pena notar que os use-package apoios diminuem e encantam . Se você o usar para gerenciar seus pacotes, poderá ocultar os modos secundários na linha de modo, adicionando as palavras-chave: diminish ou: delight.

(use-package abbrev
  :diminish abbrev-mode
  :config
  (if (file-exists-p abbrev-file-name)
     (quietly-read-abbrev-file)))

0

Não vejo o objetivo de instalar extensões nomeadas sofisticadas para algo tão simples quanto:

(setcar (alist-get minor-mode minor-mode-alist) "")

Por exemplo:

(dolist (mode '(projectile-mode
                whitespace-mode
                hs-minor-mode
                outline-minor-mode
                auto-fill-function))
  (setcar (alist-get mode minor-mode-alist) ""))

Você pode fazer qualquer tipo de coisa dessa maneira. A substituição do texto é óbvia a partir do acima. Além disso, por exemplo, para colocar o modo flymake no início da lista:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.