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


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

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

Также обратите внимание, что я использовал ваши аргументы 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)


0

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


Поскольку операция не последовала, я превратил комментарий @ 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%

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.