协助我构造一种新的 tabline+modeline layout

众所周知,emacs里有frame,每个frame里有n个window。

同时,有两个mode,tab-line-mode和tab-bar-mode,tab-line-mode在每个window里显示多个buffer,tab-bar-mode在每个frame里显示tab-group,每个tab-group包含一套window layout。

但是我不喜欢这种默认的样式。

一来,每个window上面一个tabline下面一个modeline,如果垂直堆叠的话,两个窗口之间就会隔两道line,占空间又不好看。

二来,每个window的tabline只展示同一组buffer的tab,这种设计令人感到迷惑。如果每个group只包含特定种类的buffer,那就不能把所有buffer尽收眼底;如果让每个group包含所有buffer,那么所有的window就会拥有重复的tabline,重复意味着空间的浪费。

至于tab-bar,也就是frame顶部的bar呢?我觉得一般人用不到那么多窗口layout,最多也就开两三个,这样的话,tab-bar右边又会空出很多空间。

针对第一点,我们能不能把tabline和modeline都删掉?我觉得不妥。因为这样,当我们想跳转窗口时,没有tabline和modeline的辨识,我们就只能根据buffer的内容判断这个窗口是什么buffer,这加重了思维的负担。经过一系列考虑,我觉得将modeline精简一些,放到窗口headline的位置是比较好的选择,因为桌面环境使我们习惯于看窗口时先看窗口顶部。

针对第二点,如何避免tabline的重复,避免空间的浪费,同时尽量显示更多的东西?我们可以从neovim的最新的各种主流配置中找到灵感:把所有tab啊buffer啊放到frame的顶部。具体来说,frame顶部的bar左边堆一堆buffer,这些buffer可以按组括起来,右边则放几个数字代表窗口layout。怎么知道每个窗口对应哪个buffer呢?在每个窗口的modeline里加一个窗口编号,在这个窗口对应的buffer的tab处标明这个编号,同时辅助以不同的颜色区分。对于正在focus的窗口,高亮它的buffer。

我画了个示意图表达我的想法

还算直观吧?这样还有一个好处,你可以用一个keybinding从某一组buffer中switch到另一组buffer。

目前的进度: 我实现了将modeline放到window上方。这一点很简单,拿doom-modeline举例,只需要在doom-modeline加载完后

        (setq-default header-line-format mode-line-format)
        (setq-default mode-line-format nil)

或者也可以用nano-modeline,一步到位

但是最顶上的那个bar该怎么实现呢?

那个bar本来应该是留给tab-bar-mode的。然而,tab-bar的tab不是buffer。为此,我正在查找wiki和源码,看看能不能让tab-bar显示buffer。我虽然配置了很多自己的emacs,但是大多是做一些胶水工作,缺乏写一个完整plugin的经验。所以在我学习这些东西的时候,也来找论坛帮忙。

tab-bar 用习惯了数量很容易上去,还可以配合一些插件实现一个 tab 就是一个工作区。对于右边的空白,可以配置 tab-bar-format ,用 tab-bar-format-align-right 把一些信息显示在右边。

我目前的方案就是每个 tab 就是一个工作区,方便快速切换,右边的空白用来显示和当前 buffer 无关的一些全局信息(如歌词等),buffer 相关的信息显示在 modeline 上。

5 个赞

感谢你!原来需要配置的东西是tab-bar-format

以我个人来说的话,如果工作区更多,我会开新的frame放到wm的别的workspace。不过我也在考虑单frame工作区太多的话该怎么办,或许工作区可以放底部或侧边栏?

tab 的名字可以用 tab-bar-tab-name-functiontab-bar-tab-name-format-function 定义。

我目前用 persp-mode 实现工作区管理,tab 实现 layout 管理

1 个赞

太酷了!!! 用 emacs 听歌么? 这是什么方案?

主要是 emms + lyrics-fetcher + consult-emms + 自己瞎糊点功能(显示滚动歌词,歌词校准,歌词跳转,歌词打轴等)。

大致的效果: https://i.imgur.com/Yh4akcW.mp4

1 个赞

我用doom-modeline + tabspaces,已经足够了

1 个赞

正当我吭哧吭哧的阅读tab-bar.el的源码的时候,我突然发现猫大的sort-tab正好就符合我的这个需求:它可以在整个frame的顶部显示一个全局tab-line。。。那我也不需要hack tab-bar mode来解决这个问题了

我的需求已经实现80%了,但剩下的20%也不是那么容易,主要是不仅要让正在focus的window对应的buffer tab高亮,还要让其他inactive window的编号显示在对应的buffer tab旁边

1 个赞