如何让mode-line根据window宽度选择性显示信息?

在一些时候window宽度太小,我想要筛选一些信息显示出来,有什么办法吗?

这里举个例子, 可以把 :eval 后面换成任意表达式

(setq mode-line-format
      '(:eval
        (if (>= (window-width) 100)
            '("%e"
              mode-line-buffer-identification
              mode-line-position
              mode-line-modes
              mode-line-misc-info
              mode-line-end-spaces)
          '("%e"
            mode-line-buffer-identification
            mode-line-position
            ;; mode-line-modes
            ;; mode-line-misc-info
            ;; mode-line-end-spaces
            ))))
1 个赞

可以弄得更复杂一点,给各个部件设置优先级,用一个函数计算modeline长度,和窗口宽度对比。宽度不够的话就根据优先度去除部件。最后返回。

怎么计算长度?

看看powerline的代码

举个例子, mode line 太长的时候, 不显示中间的

(defun compute-mode-line ()
  (let* ((left '("%e" mode-line-buffer-identification mode-line-position))
         (center '("%e" mode-line-modes mode-line-misc-info global-mode-string))
         (right default-directory)
         (width (string-width (format-mode-line (list left center right)))))
    (if (> width (window-width))
        (list left right)
      (list left center right))))

(setq mode-line-format '(:eval (compute-mode-line)))
3 个赞

:grin: 太棒了