emacs目前是否支持特定frame的modeline

如题,我经常开着多个frame作为不同的emacs应用,现在想在几个frame中设置不同mode-line信息,找了一圈搜索引擎似乎没有答案,来论坛问问。

mode-lline 好像是和window绑定的,也许你可以写判断函数,给不同的frame显示不同的额外信息?

这个需求比较奇怪,因为 mode-line 是 buffer-local 的——mode-line 字面意义就是 mode 相关的信息。按 Emacs 原本的设想,frame 信息可以放到 frame title 里。

但是我们毕竟是 Emacs,你非要这么做也不是不能做到。

简述一下思路:

  1. frame-parameter 把 mode-line 与 frame 关联起来。
  2. 把所有 buffer 的 mode-line 设为「读取本 frame 的 mode-line」。参见 mode-line-format 的 :eval

思路在这里了,想要进一步打磨就靠你自己了,比如如果 frame-parameter 里没有 mode-line 时取一个全局的默认值什么的。


贴一下代码:

;; 默认 mode-line
(add-to-list 'default-frame-alist
             '(mode-line . 原来的mode-line-format))

;; 置当前 frame mode-line 为默认 mode-line
(set-frame-parameter nil 'mode-line (cdr (assoc 'mode-line default-frame-alist)))

;; 置所有 buffer 默认 buffer mode-line 为「取 frame mode-line」
(setq-default mode-line-format '((:eval (frame-parameter nil 'mode-line))))

不过你大概只是想在 mode-line 上加一些 frame-specific 的信息?其实完全可以不替换掉整个 mode-line,把信息加到 mode-line-format 里就行了。mode-line 本身也有 mode-line-frame-identification,可以从这里入手看起。

6 个赞

可以 这个方法不错