Як правильно вирівняти деякі елементи в моделіні?


9

З огляду на таку модельну конфігурацію:

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

Я хотів би, щоб останній елемент відображався праворуч.


1
Ось посилання на відповідну тему: stackoverflow.com/q/16775855/2112489
lawlist

1
Оскільки ви попросили конкретний, mode-line-formatце не є правильною відповіддю, але smart-mode-lineвирівняє право mode-line-misc-infoза замовчуванням, і ви можете вирівняти список мінорних режимів, встановивши sml/mode-widthна 'right.
Малабарба

Відповіді:


11

Як і відповідь у коментарях, ви можете зробити це самостійно, написавши код, щоб повернути добре розташований рядок.

Ось простий спосіб, який підтримує лише вирівняний лівий і правий текст, застосований до ваших специфікацій.

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

все виглядає так: введіть тут опис зображення

Також зауважте, я використовував ваші аргументи у форматному рядку, як ви вказали, але я вважаю, що ви використовуєте% i неправильно, який друкує розмір байта буфера, а не кількість рядків. Ви можете використовувати щось на зразок, (line-number-at-pos (point-max))щоб отримати кількість рядків у буфері.


Одне доповнення - вам потрібно використовувати window-total-widthдля обчислення також linum та окантовку додаткових прокладок.
сандрик

У цій відповіді є помилка, у якій повернувся рядок режиму знову буде оцінено як рядок режиму. Значення %символів спробують відформатувати двічі. Зважаючи на це у моїй відповіді, emacs.stackexchange.com/a/37270/2418 - також використовуйте window-total-width(спасибі!)
ideaman42

Вирішено помилку у цій відповіді: emacs.stackexchange.com/a/37270/2418
ideaman42

2

Щоб розширити відповідь на @ jordon-biondo та усунути помилку %.

Цей приклад показує, як змінні рядка в режимі режиму можна використовувати з вирівнюванням - що знадобилося мені певний час.

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

Приклад виводу:

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


0

Це не підтримується нестандартно, але smart-mode-lineпакет підтримує це. Ви можете або використовувати цей пакет, або якщо він робить більше, ніж ви хочете, витягніть лише біти, що реалізують функцію, про яку ви просите.


Оскільки оп не продовжив свою діяльність, я перетворив коментар @ Малабарби на відповідь. Таким чином, питання не відповідає без відповіді, і цей пакет може бути таким, який хотіли б використовувати інші користувачі, які мають те саме питання.
Тарсій

Це я закінчив, smart-mode-lineвитягнувши відповідну функціональність і додавши її до своїх dotemacs. Це вимагає від мене зрозуміти, скільки місця я хочу праворуч, але це краще, ніж нічого. Якщо хтось не опублікує спосіб позбутися ручного підрахунку знаків, я не прийму відповіді.
mkaito

0

Хоча можна зробити "правильне" вирівнювання ліворуч / праворуч, додавши альтернативний метод, оскільки повноцінна оцінка лівого та правого лише для вирівнювання є дещо важкою, коли є більш проста альтернатива.

Якщо ви знаєте, що потрібно лише фіксовану кількість місця праворуч, ви можете заповнити всі символи, крім N , це працює до тих пір, поки потрібний розмір має фіксовану довжину.

Форматування рядків %12sта подібне можуть бути використані для того, щоб уникнути зміни розміру рядка.

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

Наприклад:

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

Зауважте, що це добре працює лише в тому випадку, якщо ви хочете відобразити кілька елементів праворуч, як у цьому прикладі - рядок / стовпчик / відсоток. Показати всі незначні режими, наприклад, не буде добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.