mode-line – ¿Cómo personalizar el formato de línea de modo?

Pregunta:

Quiero personalizar el mode-line-format usando if o cond , etc., para que muestre texto diferente condicionalmente.

Aquí hay una demostración que probé:

(setq-default
 mode-line-format
 (quote
  (
   (:eval
    (cond
     (buffer-read-only
      (propertize " ⚑ "
                  'face (:foreground "red" :weight 'bold)
                  'help-echo "buffer is read-only!!!"))
     ;; (overwrite-mode
     ;;  (propertize "??"))
     (buffer-modified-p
      (propertize " ☡ "
                  'face (:foreground "orange")
                  'help-echo "buffer modified."))
     ))

   (:eval (if (or (eq (buffer-local-value 'major-mode (current-buffer)) 'ruby-mode)
                 (eq (buffer-local-value 'major-mode (current-buffer)) 'enh-ruby-mode))
              (:propertize "Ruby"
                           face (:foreground "green"))
            (:propertize "Not Ruby"
                         face (:foreground "orange"))))
   )))

Pero no muestra nada, no sé dónde está mal. Necesitas ayuda.

POR CIERTO:

Busqué en Google esto y obtuve dos buenos resultados:

Y vi dos códigos diferentes:

(setq-default
 mode-line-format
 '(
   (:propertize var
                'face (:foreground "green"))
   ))

(setq-default
 mode-line-format
 (list
   '(:eval (if ...))
   ))

No sé cuál es la diferencia.

—————- ACTUALIZAR ———————

Descubrí que no puedo poner múltiples (propertize ...) en uno (progn ...) . ¿Existe alguna solución para solucionar esto?

(setq-default
 mode-line-format
'(
  (:eval
    (if (memq (buffer-local-value 'major-mode (current-buffer))
              '(ruby-mode enh-ruby-mode))
        (progn
          (propertize " ("
                      'face '(:foreground "#444444"))
          (propertize "Ruby: "
                      'face '(:family "Segoe Print"
                                      :height 80
                                      :foreground "red2"))
          (propertize (rbenv--active-ruby-version) ; `rbenv--modestring'
                      'face '(:foreground "cyan")
                      'help-echo '(concat "\nCurrent Ruby version: " (rbenv--active-ruby-version)
                                          "\nmouse-1: switch Ruby version menu")
                      ;; 'local-map
                      )
          (propertize ")"
                      'face '(:foreground "#444444"))
          )
      ;; (propertize "Not Ruby"
      ;;             'face '(:foreground "red2"))
      ))
))

Esto está resuelto, use (list (propertize ...) (propertize ...) .

Respuesta:

Si desea algo que cambie de acuerdo con las condiciones, entonces necesita usar :eval , como en el segundo fragmento de código prestado.

Hay varios problemas con su código. buffer-modified-p es una función, no una variable; olvidó citar algunas cosas; etc. Pruebe esto y luego compárelo cuidadosamente con su código:

(setq-default mode-line-format
              '((:eval
                 (cond
                   (buffer-read-only
                    (propertize " ⚑ "
                                'face '(:foreground "red" :weight 'bold)
                                'help-echo "buffer is read-only!!!"))
                   ((buffer-modified-p)
                    (propertize " ☡ "
                                'face '(:foreground "orange")
                                'help-echo "buffer modified."))))
                (:eval (if (memq (buffer-local-value 'major-mode (current-buffer))
                                 '(ruby-mode enh-ruby-mode))
                           (propertize "Ruby" 'face '(:foreground "green"))
                         (propertize "Not Ruby" 'face '(:foreground "orange")))))) 

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım