更简洁的标签栏设计

Emacs编程流

在Emacs中,不同的使用场景有不同的使用方法,有些场景需要直觉操作,有些场景需要效率优先。

日常Emacs使用场景简单总结主要有以下几类:

  • 打开文件:通过find-file、dired或EAF文件管理器打开需要编辑的文件;
  • 常用文件跳转:看一下顶部标签栏快速切换到另外一个常用文件;
  • 文件模糊搜索:当打开文件过多时,通过标签栏找文件太费劲,更好的方式是通过搜索框架来模糊查找文件,比如Ivy、Helm和Snails;
  • 文件对比:Emacs最好的设计,快速分屏,快速切换不同窗口中的文件
  • 命令执行:通过M-x操作来执行一些复杂命令,这些命令平常不用,但是需要时往往想不起命令的名字,现在比较流行Smex

标签栏的优势

我们编程时,时间占用比最大的其实就是常用文件间的快速编辑和快速切换,社区常用的搜索框架都需要搜索一下关键字,特别是在专注思考编程问题时,频繁的关键字搜索对心智负担比较大,容易影响思考的流畅性。

当常用文件在10个以内时,标签栏的直觉化操作就非常方便,EmacsChina社区的一个道友还专门写了一篇文章Jump Between Buffers in a Slick Way来论述标签栏的优势。

更简洁的标签栏设计

今天花了几个小时写了一个新的标签栏插件Sort-Tab, 着重解决两个体验问题:

  1. 之前的Awesome-Tab虽然默认支持Project分组和自定义规则分组,但是这几年我使用的体验看,不管怎么分组都很麻烦,因为分组容易把两个经常编辑的文件分到两个不同的组(比如不如不同项目间借鉴代码、Web项目中不同编程语言的文件并列编辑等),导致我经常需要切换标签分组才能找到标签,很是麻烦;
  2. Emacser不喜欢标签栏的另外一个理由是分屏后标签栏占用太多的纵向空间,两个窗口之间有一条比较宽的分割线,看着不爽。

Sort-Tab相对于Awesome-Tab的优势主要有两个:标签分组策略和屏幕空间设计。

  1. 根据文件的使用频率来排序,这样使用的时间越长,相关的文件标签挨的越紧,基本上可以做到下意识的左右切换(借鉴了kinono的想法,很赞);
  2. 顶栏设计,抛弃了header-line和tab-line的设计, 所有窗口都共享一个标签栏,最大程度减少纵向空间的浪费,再配合Awesome-Tray,整体上可以实现非常简洁的视觉感官。

插件今天才写完,估计还有一些小问题,欢迎各位朋友试用反馈建议。:wink:

16 个赞

相关讨论:

@kinono 欢迎大佬一起来开发。 :grinning:

@manateelazycat 光标处所在的eldoc提示会有干扰。

先把 eldoc 给关闭了吧,我今天研究了 eldoc 的源码,这货会一直 rename current buffer, 我不知道作者为什么要这么做。

我最开始写了一个 advice 也没法避免 eldoc 的影响。

哈哈哈,我先找别的bug。

:rofl: 谢谢邀请,最近忙疯了,等咱有时间试用一下

简单试用了下,一个是前面那位说的 eldoc 的问题,另外还有就是如果执行 (other-window 1) 的话,会跳到 tab 里。

另外有没有可能支持不同 frame 拥有独立的 tab 组合呢?我之前是自己用 tab-line 简单糊了一个,就是手动创建 group 名,手动添加 buffer ,然后不同的 frame 和不同的 group 可以任意组合。问题就是①手动稍微有点麻烦②就像你说的,分组其实很难分准确。

1 个赞

(other-window 1) 不应该会进入tab window, 我已经防御了。 eldoc 的问题我今天看看,看看会不会解决。 现在应该默认就支持不同 frame 吧。

eldoc的兼容性问题已经修复了。

测试了一下,Emacs 27的buffer-list-update-hook感觉有bug, 经常产生很多不必要的 current-buffer.

Emacs 29.0.50 没问题

单独用一个window还作为标签栏我是没想到的,使用过程中发现例如 ace-window,winum-mode 这些对窗口进行操作的会把标签栏当作普通窗口对待,当然使用标签栏后可能也用不到这些插件了。

1 个赞

主要 minibuffer 没法彻底关闭,要不我就可以把 sort-tab 和 awesome-tray 合二为一了,目前的这种设计也很简洁。

在保留 tab 的功能的时候,避免每个窗口一个 tab-line 和 mode-line, 纵向空间利用率最大了。

简单统计了一下我打开的文件一般在五十个左右。。好像不太适合我。

对这个比较大的项目我一般用persp-mode单独管理window和buffer,使用lsp/rg跳转来打开文件,分成五六个window,通过ace-window管理。

没关系的,每个人有自己的喜好,这么多窗口你的屏幕一定很大咯?

在公司用的28寸的屏幕,差不多正好等分成六个window,lsp hierarchy和xref占两个。

1 个赞

发现blace-windows 会修改tab的大小。

这个想法很妙,我一直苦恼于没有标签不直观,有标签了却影响纵向面积。

awesome-tray能不能嵌到tab里,作为一个固定的右侧tab

考虑过,但是我觉得放到 awesome-tray 里面更好,因为 minibuffer 去不掉, minibuffer 右边那么多空白是更好的地方,节省标签的空间。

1 个赞