如何在Modeline中正确对齐某些项目?


9

给定以下modeline配置:

(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 2014年

1
由于您要求的是特定mode-line-format答案,因此这不是一个正确的答案,但是默认情况下smart-mode-line将其右对齐mode-line-misc-info,并且可以通过将设置sml/mode-width为来将次要模式列表右对齐'right
马拉巴巴

Answers:


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 args,但我相信您使用的%i错误,打印了缓冲区的字节大小,而不是行数。您可以使用类似的方法(line-number-at-pos (point-max))来获取缓冲区中的行数。


一种补充-您还需要使用window-total-widthlinum和流水线计算其他填充。
sandric '16

这个答案有一个错误,就是那里返回的模式行将再次作为模式行进行评估。含义%字符将尝试被格式化两次。在我的答案emacs.stackexchange.com/a/372​​70/2418中对此进行了说明 -也使用window-total-width(谢谢!)
ideaman42 '18

解决了此答案中的错误:emacs.stackexchange.com/a/372​​70/2418
ideaman42 '19

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不支持此功能,但软件包确实支持此功能。您可以使用该程序包,或者如果它做得比您想做的要多,请仅提取实现所需功能的位。


由于操作没有跟进,因此我已将@Malabarba的评论变成了答案。这样,问题就不会“无法回答”,而这个软件包很可能就是其他有相同问题的用户想要使用的软件包。
tarsius

这就是我要做的,从中提取相关功能smart-mode-line并将其添加到dotemacs中。它需要我弄清楚我想要多少空间,但是总比没有好。除非有人发布一种摆脱手动字符计数的方法,否则我不会接受答案。
mkaito 2015年

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%

请注意,这仅在您要在右侧显示一些项目的情况下才有效,例如本示例-行/列/百分比。显示所有次要模式,例如,效果不佳。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.