Come allineare correttamente alcuni elementi nella modeline?


9

Data la seguente configurazione di modeline:

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

Vorrei che l'ultimo elemento fosse allineato a destra.


1
Ecco un link ad una discussione correlato: stackoverflow.com/q/16775855/2112489
lawlist

1
Dal momento che hai chiesto una specifica, mode-line-formatquesta non è una risposta corretta, ma smart-mode-lineallinea mode-line-misc-infoper impostazione predefinita il diritto e può allineare a destra l'elenco delle modalità secondarie impostando sml/mode-widthsu 'right.
Malabarba,

Risposte:


11

Come la risposta nei commenti, puoi farlo tu stesso scrivendo il codice per restituire una stringa ben spaziata.

Ecco un modo semplice che supporta solo il testo allineato a sinistra e a destra applicato alle tue specifiche.

;; 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")))))

finisce per apparire così: inserisci qui la descrizione dell'immagine

Inoltre, ho usato i tuoi argomenti mode-line-format come hai specificato, ma credo che tu stia usando% i in modo errato, che stampa la dimensione in byte del buffer, non il numero di righe. È possibile utilizzare qualcosa di simile (line-number-at-pos (point-max))per ottenere il numero di righe nel buffer.


window-total-widthUn'aggiunta : è necessario utilizzare per calcolare anche imbottiture aggiuntive di lino e frange.
sandric,

Questa risposta ha un bug in cui la linea di modalità restituita verrà nuovamente valutata come linea di modalità. I %caratteri di significato tenteranno di essere formattati due volte. Considerato questo nella mia risposta, emacs.stackexchange.com/a/37270/2418 - usa anche window-total-width(grazie!)
ideasman42

Risolto il bug in questa risposta: emacs.stackexchange.com/a/37270/2418
ideasman42

2

Espandere la risposta di @ jordon-biondo e risolvere un bug che mostra %.

Questo esempio mostra come le variabili di riga della modalità modalità possono essere utilizzate con l'allineamento, il che mi ha richiesto del tempo per capire.

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

Esempio di output:

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


0

Questo non è supportato e pronto all'uso ma il smart-mode-linepacchetto lo supporta. È possibile utilizzare quel pacchetto o, se fa più di quello che si desidera, estrarre solo i bit che implementano la funzionalità richiesta.


Poiché l'operazione non ha dato seguito, ho trasformato il commento di Malabarba in una risposta. In questo modo la domanda non è "senza risposta" e questo pacchetto potrebbe benissimo essere quello che altri utenti con la stessa domanda vorrebbero usare.
tarsius

Questo è quello che ho finito per fare, estraendo le funzionalità pertinenti smart-mode-linee aggiungendole ai miei dotemacs. Mi richiede di capire quanto spazio voglio sulla destra, ma è meglio di niente. A meno che qualcuno non pubblichi un modo per sbarazzarsi del conteggio manuale dei caratteri, non accetterò una risposta.
mkaito,

0

Mentre è possibile fare l'allineamento sinistro / destro "corretto" aggiungendo un metodo alternativo perché valutare completamente sinistra e destra solo per l'allineamento è un po 'pesante, quando esiste un'alternativa più semplice.

Se sai che hai solo bisogno di una quantità fissa di spazio sulla destra, puoi riempire tutti tranne N caratteri, questo funziona fintanto che la giusta dimensione è una lunghezza fissa.

La formattazione della stringa %12se simili possono essere utilizzate per garantire che la stringa non venga ridimensionata.

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

Per esempio:

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

Si noti che funziona bene solo se si desidera visualizzare alcuni elementi sul lato destro, come in questo esempio: riga / colonna / percentuale. Mostrare tutte le modalità minori per es. Non funzionerebbe bene.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.