Ocultar lista de modos menores en la línea de modo


22

Uso bastantes modos menores y generalmente sé qué modo menor está habilitado en cada modo principal. Si realmente quiero ver la lista completa, puedo correr C-h v minor-mode-list.

Al mismo tiempo, mi línea de modo se obstruye realmente, así que cuando divido verticalmente el cuadro, a veces no puedo leer el final de la línea de modo.

Pregunta real: ¿cómo deshabilitar la visualización de la lista de modos menores en la línea de modo? Por ejemplo, ahora puede verse así:

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

Quiero que se vea más conciso:

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


2
También puede buscar en el modo de minoría rica .
Kaushal Modi

Respuestas:


15

El modo de disminución (disponible en Melpa) hará esto.

(diminish 'projectile-mode)

2
Si solo quiere acortar el nombre del modo menor en lugar de ocultarlo por completo, puede usarlo(diminish 'projectile-mode "p")
erikstokes

55
Tenga en cuenta también que el uso real de disminuir es (eval-after-load "filladapt" '(diminish 'filladapt-mode))(usando el ejemplo de la Wiki de Emacs) y no solo (diminish 'filladapt-mode)como lo sugiere la respuesta. Puede solamente utilizar la versión corta si se garantiza el modo de estar ya cargado.
PHILS

15

Como comentó mbork, puede usar delight.el para modificar o deshabilitar selectivamente el texto de modo menor (y de hecho mayor) en la línea de modo.

Una de las ventajas es que se encarga de eval-after-load(que necesita escribir manualmente con diminish.el en la mayoría de los casos de uso), lo que hace que la configuración sea más limpia. Todavía necesita la misma información, el nombre del modo y la biblioteca que lo implementa (que Emacs le dirá si le pregunta sobre el modo), pero puede resumirlo todo en una sola forma:

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

(O siga el enlace de arriba para ver algunos ejemplos de uso real).

Recomendaría adoptar este enfoque, porque incluso si no desea la mayoría de los textos más ligeros en modo menor, existe una buena posibilidad de que encuentre algunos de ellos útiles (y aún puede modificarlos para que sean más cortos).

Si realmente desea eliminar todo el texto más ligero del modo menor (y nuevamente, no lo recomiendo), puede modificar la mode-line-modesvariable. Las variables de línea de modo cambiaron hace un tiempo, por lo que es posible que desee usar M-x find-variable RET mode-line-modes RETy luego adaptar manualmente su definición predeterminada, editando la sección correspondiente minor-modes-alist.

Por supuesto, necesitaría mantenerlo, lo que no es tan rápido, por lo que podría preferir reemplazar el minor-mode-alistsímbolo dentro del valor existente. Lo siguiente es algo específico de la implementación, pero ciertamente es mejor que configurarlo mode-line-modesen su totalidad, y puede activarlo y desactivarlo.

(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)

Bueno, es triste que no haya un paquete de "deleite".
Mark Karpov

2
Con Emacs siendo viejo y package.el como nuevo, hay un montón de bibliotecas útiles que no tienen paquetes. Si va a limitarse de esa manera, le sugiero que busque en el-get, que actuará como administrador (actualización incluida) para una gran variedad de otros tipos de fuentes de biblioteca.
phils

1
@Drew, sé sobre load-pathy require. Solía ​​'instalar' todos los paquetes de Emacs de esta manera cuando comencé a usarlo hace un año.
Mark Karpov

3
Acabo de agregar delighta MELPA.
sanityinc

1
nb delightestá en GNU ELPA estos días, y no en MELPA (mencionado en caso de que alguien se confunda con los comentarios anteriores).
phils

8

Use Rich-minority con config:

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

También tengo el pensamiento como tú, pero acorto la línea de modo más paranoica :

  • Eliminar todos los espacios no deseados
  • Elimine todos los espacios y el "ancho mínimo" del campo de información de posición del búfer.
;; 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"))))))
      )

Ahora, siempre puedo ver la notificación del modo Twittering y el temporizador del modo Org: D


5

Esto es lo que funcionó para mí:

(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)

Gracias al comentario de Drew , he mejorado la realización de esta solución. Ahora usa los beneficios de las listas de asociación y debería ser un poco más eficiente ;-)


FWIW, no capturará modos menores previamente descargados que se habilitan manualmente, ni modos que actualicen dinámicamente su texto más claro (no es que las otras bibliotecas hagan lo último tampoco). Pero por lo demás parece un enfoque razonablemente práctico.
phils

1
El punto de minor-mode-alistser una lista es que las entradas pueden agregarse y eliminarse en la cabeza para sombrear y quitar la sombra de las entradas más abajo en la lista que tienen la misma clave. Si desea hacer el tipo de cosas que está haciendo, simplemente cambie la primera entrada (encontrada usando assoc, cambiada usando, setcaretc.) para cada tecla, para que no pierda esta característica útil e intencionada.
Dibujó el

@Drew, tienes razón, mira mi mejoró mi solución.
Mark Karpov

Sip; a eso me refería.
Dibujó el

3

También arrojaré mi solución a esto en el ring:

(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-lighterle permite configurar el encendedor de un modo menor para cualquier cadena que desee. modeline-remove-lighterle permite eliminar completamente el encendedor de un modo menor.

Luego, al final de mi archivo de inicio, solo llamo a estas funciones para los modos menores cuyos encendedores quiero 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

También puede eliminar sin rodeos todos los modos menores, de la siguiente manera:

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

Esto también funciona para los modos menores definidos en el futuro, ya que elimina por completo simplemente el uso de minor-mode-alistde la mode-line-format.


1

Vale la pena señalar que los use-package apoyos disminuyen y deleitan . Si lo usa para administrar sus paquetes, puede ocultar los modos menores en la línea de modo agregando las palabras clave: disminuir o: deleitar.

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

0

No veo el punto de instalar extensiones con nombre elegantes para algo tan simple como:

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

Por ejemplo:

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

Puedes hacer cualquier tipo de cosas de esta manera. Reemplazar texto es obvio por lo anterior. Además, por ejemplo, para poner el modo flymake al comienzo de la lista:

(let ((mode (assq #'flymake-mode minor-mode-alist)))
  (setq minor-mode-alist (cons mode (remq mode minor-mode-alist))))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.