Jak wyrównać do prawej niektóre elementy w modelinie?

9

Biorąc pod uwagę następującą konfigurację modeliny:

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

Chciałbym, aby ostatni element pojawił się w wyrównaniu do prawej.

mkaito
źródło
1
Oto link do powiązanego wątku: stackoverflow.com/q/16775855/2112489
lista prawników
1
Ponieważ poprosiłeś o konkretny, mode-line-formatnie jest to poprawna odpowiedź, ale domyślnie smart-mode-linewyrównuje do mode-line-misc-infoprawej i może wyrównać listę drobnych trybów, ustawiając sml/mode-widthna 'right.
Malabarba,

Odpowiedzi:

11

Podobnie jak odpowiedź w komentarzach, możesz to zrobić sam, pisząc kod, aby zwrócić dobrze rozmieszczony ciąg znaków.

Oto prosty sposób, który obsługuje tylko wyrównany do lewej i prawej tekst zastosowany do specyfikacji.

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

wygląda to tak: wprowadź opis zdjęcia tutaj

Zauważ też, że użyłem twoich argumentów tryb-linia-format, jak określiłeś, ale uważam, że używasz% i niepoprawnie, co drukuje rozmiar bajtu bufora, a nie liczbę linii. Możesz użyć czegoś takiego, (line-number-at-pos (point-max))aby uzyskać liczbę wierszy w buforze.

Jordon Biondo
źródło
Jeden dodatek - musisz użyć, window-total-widthaby obliczyć również linum i frędzle dodatkowe wypełnienia.
sandric
Ta odpowiedź zawiera błąd polegający na tym, że zwrócona linia trybu zostanie ponownie oceniona jako linia trybu. %Znaki znaczące będą próbować sformatować dwukrotnie. Uwzględniłem to w mojej odpowiedzi, emacs.stackexchange.com/a/37270/2418 - również użyj window-total-width(dziękuję!)
ideasman42
Rozwiązany błąd w tej odpowiedzi: emacs.stackexchange.com/a/37270/2418
ideasman42
2

Aby rozwinąć odpowiedź @ jordon-biondo i rozwiązać problem z wyświetlaniem błędu %.

Ten przykład pokazuje, jak zmienne liniowe trybu trybu mogą być używane z wyrównaniem - co zajęło mi trochę czasu.

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

Przykładowe dane wyjściowe:

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

ideasman42
źródło
0

Nie jest to obsługiwane od razu po wyjęciu z pudełka, ale smart-mode-linepakiet to obsługuje. Możesz użyć tego pakietu lub jeśli robi więcej, niż chcesz, wyodrębnij tylko te bity, które implementują żądaną funkcję.

Tarsjusz
źródło
Ponieważ operacja nie była kontynuowana, zmieniłem komentarz @ Malabarba w odpowiedź. W ten sposób pytanie nie jest „bez odpowiedzi”, a pakiet ten może równie dobrze być tym, czego inni użytkownicy z tym samym pytaniem chcieliby użyć.
Tarsjusz
To właśnie skończyłem, wydobywając odpowiednią funkcjonalność smart-mode-linei dodając ją do moich dotemac. Wymaga to zastanowienia się, ile miejsca chcę po prawej stronie, ale to lepsze niż nic. Chyba że ktoś opublikuje sposób na pozbycie się ręcznego liczenia znaków, ale nie przyjmuję odpowiedzi.
mkaito
0

Podczas gdy możliwe jest „poprawne” wyrównanie do lewej / prawej strony, dodanie alternatywnej metody, ponieważ pełna ocena lewej i prawej tylko dla wyrównania jest nieco ciężka, gdy istnieje prostsza alternatywa.

Jeśli wiesz, że potrzebujesz tylko stałej ilości miejsca po prawej stronie, możesz wypełnić wszystkie znaki oprócz N , działa to tak długo, jak odpowiedni rozmiar ma stałą długość.

%12sMożna użyć formatowania łańcucha i tym podobnych, aby mieć pewność, że rozmiar łańcucha się nie zmieni.

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

Na przykład:

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

Zauważ, że działa to dobrze tylko wtedy, gdy chcesz wyświetlić kilka elementów po prawej stronie, jak w tym przykładzie - linia / kolumna / procent. Wyświetlanie wszystkich mniejszych trybów np. Nie działałoby dobrze.

ideasman42
źródło