Как правильно выровнять некоторые элементы в моделине?

9

Учитывая следующую конфигурацию моделин:

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

Я хотел бы, чтобы последний элемент отображался по правому краю.

mkaito
источник
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")))))

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

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

Джордон Биондо
источник
Одно дополнение - вам нужно использовать также window-total-widthдля расчета дополнительных отступов.
Сандрик
В этом ответе есть ошибка, при которой возвращенная строка режима будет снова оценена как строка режима. Значение %символов будет пытаться отформатировать дважды. Это учтено в моем ответе emacs.stackexchange.com/a/37270/2418 - также используйте window-total-width(спасибо!)
ideasman42
Устранена ошибка в этом ответе: emacs.stackexchange.com/a/37270/2418
ideasman42
2

Чтобы расширить ответ @ jordon-biondo и устранить ошибку, показываемую %.

В этом примере показано, как можно использовать линейные переменные режима mode с выравниванием, что потребовало времени на то, чтобы разобраться.

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

ideasman42
источник
0

Это не поддерживается "из коробки", но smart-mode-lineпакет поддерживает это. Вы можете использовать этот пакет или, если он делает больше, чем вы хотите, извлечь только те биты, которые реализуют запрашиваемую вами функцию.

Tarsius
источник
Поскольку операция не последовала, я превратил комментарий @ Malabarba в ответ. Таким образом, вопрос не остается без ответа, и этот пакет вполне может быть тем, что захотят использовать другие пользователи с таким же вопросом.
tarsius
Это то, чем я в конечном итоге занимался, извлекая соответствующие функциональные возможности 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%

Обратите внимание, что это хорошо работает, только если вы хотите отобразить несколько элементов справа, как в этом примере - строка / столбец / процент. Показывать все второстепенные режимы, например, не очень хорошо.

ideasman42
источник