Wie kann ich einige Elemente in der Modellreihe richtig ausrichten?

9

Bei folgender Modellkonfiguration:

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

Ich möchte, dass das letzte Element rechtsbündig angezeigt wird.

mkaito
quelle
1
Hier ist ein Link zu einem verwandten Thread: stackoverflow.com/q/16775855/2112489
lawlist
1
Da Sie für eine bestimmte gefragt mode-line-formatist dies keine richtige Antwort, aber smart-mode-linerichtig ausrichtet die mode-line-misc-infostandardmäßig aktiviert und es kann durch Einstellung der Liste von untergeordneter-Modi rechts ausrichten sml/mode-widthzu 'right.
Malabarba

Antworten:

11

Wie die Antwort in den Kommentaren können Sie dies selbst tun, indem Sie Code schreiben, um eine schön verteilte Zeichenfolge zurückzugeben.

Hier ist eine einfache Methode, die nur links und rechts ausgerichteten Text unterstützt, der auf Ihre Spezifikationen angewendet wird.

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

es sieht am Ende so aus: Geben Sie hier die Bildbeschreibung ein

Beachten Sie auch, dass ich Ihre Argumente im Modus-Zeilenformat wie von Ihnen angegeben verwendet habe, aber ich glaube, dass Sie% i falsch verwenden, wodurch die Bytegröße des Puffers und nicht die Anzahl der Zeilen gedruckt wird. Sie können so etwas wie verwenden (line-number-at-pos (point-max)), um die Anzahl der Zeilen in Ihrem Puffer zu erhalten.

Jordon Biondo
quelle
Eine Ergänzung - Sie müssen verwenden window-total-width, um auch Linum und Fransen zusätzliche Polsterungen zu berechnen.
Sandric
Diese Antwort hat einen Fehler, bei dem die zurückgegebene Moduszeile erneut als Moduszeile ausgewertet wird. Bedeutungszeichen %werden zweimal formatiert. Berücksichtigt dies in meiner Antwort, emacs.stackexchange.com/a/37270/2418 - verwenden Sie auch window-total-width(danke!)
ideasman42
Der Fehler in dieser Antwort wurde behoben
ideasman42
2

Um die Antwort von @ jordon-biondo zu erweitern und einen angezeigten Fehler zu beheben %.

Dieses Beispiel zeigt, wie Linienvariablen im Modusmodus mit der Ausrichtung verwendet werden können - was eine Weile gedauert hat, bis ich es herausgefunden habe.

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

Beispielausgabe:

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

ideasman42
quelle
0

Dies wird nicht sofort unterstützt, aber das smart-mode-linePaket unterstützt dies. Sie können dieses Paket entweder verwenden oder, wenn es mehr als das tut, was Sie wollen, nur die Bits extrahieren, die die gewünschte Funktion implementieren.

Tarsius
quelle
Da die Operation nicht weiterverfolgt wurde, habe ich aus @ Malabarbas Kommentar eine Antwort gemacht. Auf diese Weise ist die Frage nicht "unbeantwortet" und dieses Paket könnte sehr gut das sein, was andere Benutzer mit derselben Frage verwenden möchten.
Tarsius
Am Ende habe ich die relevanten Funktionen extrahiert smart-mode-lineund zu meinen Dotemacs hinzugefügt. Ich muss herausfinden, wie viel Platz ich rechts haben möchte, aber es ist besser als nichts. Ich akzeptiere jedoch keine Antwort, es sei denn, jemand veröffentlicht einen Weg, um die manuelle Zeichenzählung loszuwerden.
Mkaito
0

Es ist zwar möglich, die Ausrichtung von links nach rechts zu korrigieren, indem eine alternative Methode hinzugefügt wird, da die vollständige Bewertung von links und rechts nur für die Ausrichtung etwas schwierig ist, wenn es eine einfachere Alternative gibt.

Wenn Sie wissen, dass Sie rechts nur einen festen Platz benötigen, können Sie alle bis auf N Zeichen eingeben. Dies funktioniert, solange die richtige Größe eine feste Länge hat.

Die Formatierung von Zeichenfolgen %12sund ähnliches kann verwendet werden, um sicherzustellen, dass die Größe der Zeichenfolge nicht geändert wird.

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

Z.B:

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

Beachten Sie, dass dies nur dann gut funktioniert, wenn Sie einige Elemente auf der rechten Seite anzeigen möchten, wie in diesem Beispiel - Zeile / Spalte / Prozentsatz. Das Anzeigen aller Nebenmodi für z. B. würde nicht gut funktionieren.

ideasman42
quelle