¿Cómo alinear correctamente algunos elementos en la línea de modelo?

9

Dada la siguiente configuración de modeline:

(setq-default mode-line-format
   (list
    ;; Current buffer name
    "%b "
    ;; Major mode
    "[%m] "
    ;; Modified status
    "[%*] "
    ;; Cursor position
    "Line: %l/%i Column: %c"))

Me gustaría que el último elemento aparezca alineado a la derecha.

mkaito
fuente
1
Aquí hay un enlace a un hilo relacionado: stackoverflow.com/q/16775855/2112489
lawlist
1
Dado que solicitó un específico, mode-line-formatesta no es una respuesta adecuada, pero smart-mode-linealinea a la derecha mode-line-misc-infode manera predeterminada, y puede alinear a la derecha la lista de modos menores configurando sml/mode-widtha 'right.
Malabarba

Respuestas:

11

Al igual que la respuesta en los comentarios, puede hacerlo usted mismo escribiendo código para devolver una cadena bien espaciada.

Aquí hay una manera simple que solo admite texto alineado a izquierda y derecha aplicado a sus especificaciones.

;; write a function to do the spacing
(defun simple-mode-line-render (left right)
  "Return a string of `window-width' length containing LEFT, and RIGHT
 aligned respectively."
  (let* ((available-width (- (window-width) (length left) 2)))
    (format (format " %%s %%%ds " available-width) left right)))


;; use the function in conjunction with :eval and format-mode-line in your mode-line-format
(setq mode-line-format
      '((:eval (simple-mode-line-render
                ;; left
                (format-mode-line "%b [%m] [%*]")
                ;; right
                (format-mode-line "Line: %l/%i Column: %c")))))

termina luciendo así: ingrese la descripción de la imagen aquí

También tenga en cuenta que usé sus argumentos de formato de línea de modo como especificó, pero creo que está usando% i incorrectamente, que imprime el tamaño de bytes del búfer, no el número de líneas. Puede usar algo como (line-number-at-pos (point-max))obtener el número de líneas en su búfer.

Jordon Biondo
fuente
Una adición: debe usar window-total-widthpara calcular también linum y flecos rellenos adicionales.
sandric
Esta respuesta tiene un error en el que la línea de modo devuelta se evaluará nuevamente como una línea de modo. Los %caracteres significantes intentarán formatearse dos veces. Tomé en cuenta esto en mi respuesta, emacs.stackexchange.com/a/37270/2418 - también uso window-total-width(¡gracias!)
ideasman42
Se resolvió el error en esta respuesta: emacs.stackexchange.com/a/37270/2418
ideasman42
2

Para ampliar la respuesta de @ jordon-biondo y resolver un error que muestra %.

Este ejemplo muestra cómo las variables de línea de modo de modo se pueden usar con la alineación, lo que me llevó un tiempo descubrir.

(defun simple-mode-line-render (left right)
  "Return a string of `window-width' length containing LEFT, and RIGHT aligned respectively."
  (let* ((available-width (- (window-total-width) (+ (length (format-mode-line left)) (length (format-mode-line right))))))
    (append left (list (format (format "%%%ds" available-width) "")) right)
    )
  )

(setq-default
  mode-line-format
  '
  (
    (:eval
      (simple-mode-line-render
        ;; left
        (quote ("%e " mode-line-buffer-identification " %l : %c" evil-mode-line-tag "[%*]"))
        ;; right
        (quote ("%p " mode-line-frame-identification mode-line-modes mode-line-misc-info))
        )
      )
    )
  )
)

Salida de ejemplo:

init.el 1 : 0 <N> [-] Top -F1 (Emacs-Lisp WK ivy drag AC GitGutter)

ideasman42
fuente
0

Esto no es compatible de fábrica, pero el smart-mode-linepaquete sí lo admite. Puede usar ese paquete o, si hace más de lo que desea, extraer solo los bits que implementan la función que está solicitando.

tarsius
fuente
Como la operación no dio seguimiento, he convertido el comentario de @ Malabarba en una respuesta. De esta manera, la pregunta no está "sin respuesta" y este paquete podría ser lo que otros usuarios que tengan la misma pregunta desearían usar.
tarsius
Eso es lo que terminé haciendo, extrayendo la funcionalidad relevante smart-mode-liney agregándola a mis dotemacs. Requiere que averigüe cuánto espacio quiero a la derecha, pero es mejor que nada. Sin embargo, a menos que alguien publique una manera de deshacerse del conteo manual de caracteres, no aceptaré una respuesta.
mkaito
0

Si bien es posible hacer una alineación 'correcta' izquierda / derecha agregando un método alternativo porque evaluar completamente la izquierda y la derecha solo para la alineación es un poco pesado, cuando hay una alternativa más simple.

Si sabe que solo necesita una cantidad fija de espacio a la derecha, puede completar todos menos N caracteres, esto funciona siempre que el tamaño correcto sea una longitud fija.

El formato de cadena %12sy similares se pueden usar para garantizar que la cadena no cambie de tamaño.

(defun mode-line-fill (face reserve)
  "Return empty space using FACE and leaving RESERVE space on the right."
  (when
    (and window-system (eq 'right (get-scroll-bar-mode)))
    (setq reserve (- reserve 3)))
  (propertize " "
    'display
    `((space :align-to (- (+ right right-fringe right-margin) ,reserve)))
    'face face
    )
  )

(setq-default
  mode-line-format
  (list
    ;; left align
    "%e %b [%*]"
    ;; right align
    (mode-line-fill 'mode-line 18)
    "%6l, %4c, %8p"
    )
  )
)

P.ej:

CMakeLists.txt [-] 1590, 0, 94%

Tenga en cuenta que esto solo funciona bien si desea mostrar algunos elementos en el lado derecho, como en este ejemplo: línea / columna / porcentaje. Mostrar todos los modos menores, por ejemplo, no funcionaría bien.

ideasman42
fuente