awesome-tab 1.0 发布, 开箱即用的Emacs标签插件

对 ,我之前大概也是这个思路,有可能存在的问题是 switch buffer 做的操作不能太重 比如说 获取当前buffer 所属的组,这种最好能缓存到buffer local 变量里,想用的时候直接用,不用现计算 ,不过这种可以慢慢优化, 主要是需要先验证这种思路可不可行

现在已经缓存了

现在在陪老婆逛街,我一会下午回家写几行代码试一下

1 个赞

最新版已经实现了这个功能, 更新即可.

更新后, awesome-tab 的交互逻辑如下:

  1. 新标签在当前标签右边打开
  2. 如果想要切换的标签在当前标签两边, 直接用 awesome-tab-backward-tab/awesome-tab-forward-tab 进行左右切换
  3. 如果想要切换的标签离当前标签距离比较远, 可以直接用 helm/ivy 进行搜索, 搜索后的标签如果和当前标签在相同分组的情况下, 在切换到新标签后, Awesome-Tab 会把当前标签放到新标签的旁边, 方便下次快速切换回去.

为什么要添加这个功能?

我们先看一个场景

Web项目一般都是混合多种不同模式的文件的, 比如HTML模板, JavaScript, CSS, 在同一个Web项目中, Awesome-Tab 只会根据文件打开的时间来进行先后排序 (一般都是乱序), 这样就会导致在修改同一个页面的html/js/css文件的时候, 要经常用到 helm/ivy 这种搜索工具, 在标签是乱序的情况下, 会导致大部分情况都在频繁使用搜索, 文件切换效率变低.

新的补丁的作用是, 当分析你切换的标签离当前标签很远的时候, 就会认为你很有可能需要在这两个距离很远的标签之间反复切换, 这时候 Awesome-Tab 会强制把这两个离的很远的标签黏在一起, 这样就会大大增加同一个页面中不同 html/js/css 文件的切换效率, 因为相关的文件就在左右两边.

根据最新补丁的算法, 最后的结果是, 随着你切换标签的行为, 功能相关的标签会聚合在一起, 用的时间越长切换标签的效率越高.

5 个赞

几个小问题 一些小问题 · Issue #18 · manateelazycat/awesome-tab · GitHub

emacs 27上报找不到insert-after这个函数,怀疑是笔误,你想用 awesome-tab-insert-after吧?

已经修复了, 昨天晚上写完了以后没有复查, 感谢反馈

还有一点跟我想的不太一样的是, 比如说我依次打开这几个buffer A B C D E F B,我希望的排序是 A C D E F B ,因为 我按最近访问的是 B F E D ,我更希望的是 当最终当前buffer是B的时候, 我可以快速访问到 前一个F ,以及前前一个E 可否提供这种排序方式供用户选择

你其实就是希望当前组按照访问时间依次排序, 这种大范围跳跃的方式你不会晕吗?

还好吧 ,按访问顺序排, 这样找最近访问的buffer 才是最快的啊

要想一想, 想清楚再写代码.

如果你等不及, 可以参考我最近的补丁, 你自己感受下, 如果体验好, 欢迎发送PR

好的, 看现在的实现,应该比较好改动了, 下午有时间我会试试。

其实就是 post-command-hook 跟一个函数, 然后你在函数中先获取当前的组的buffer list和tab list, 顺序算法实现后, 重新更新一下 awesome-tab 的 buffer list 就可以自定义排序了.

最好别用post-command-hook吧,里面东西太多有卡的风险

post-command-hook 只要不要挂那些重度计算的还好, 而且前面加了很多条件过滤, 大部分情况都不会触发.

1 个赞

我的这次改动其实跟之前没太大差别, 之前是把previous-tab 移到 current-tab旁边 现在是把current-tab 移到previous-tab 之后, 你看看能接受这种跳转吗 ? 如果能接受就直接合, 不能接受 我就做成 defcustom的方式供用户选择 @manateelazycat

你这个逻辑没问题, 但是统一放后面会导致标签的位置非常奇怪, 比如切换到标签组第一个标签, 结果居然是第一个标签跑到当前标签的后面去了, 给用户会非常困惑的感觉.

目前的逻辑是, 先计算用户切换标签的方向, 先切换到新标签位置, 然后在新标签反方向相邻的位置放置前一个标签, 这样从视觉上是符合用户的心理预期的.

Anyway, 我加了一个自定义函数 df9f413 , 你不喜欢默认的方式, 按照你自己喜欢的方式自定义规则吧.

你们对 kill一个buffer后, 默认选中前一个tab 还是后一个tab ? 我看现在的处理方式是优先选中前一个tab,我更倾向于选中前一个,通常情况下 前一个是我上次访问过的buffer 或者可配置成去掉这个hook恢复默认选项(自动选中上次访问过的buffer) 又或者把 awesome-tab-buffer-track-killed 也做成可自定义的吧,

另外https://github.com/manateelazycat/awesome-tab/blob/master/awesome-tab.el#L1695 最好能加一个 (buffer-live-p awesome-tab-last-focus-buffer)的判断

  (unless (buffer-live-p awesome-tab-last-focus-buffer);;加这两行
    (setq awesome-tab-last-focus-buffer (current-buffer)))
  (when (and (not (eq (current-buffer) awesome-tab-last-focus-buffer))
             (buffer-live-p awesome-tab-last-focus-buffer) ;加这一行
             (not (minibufferp)))

buffer-list函数获得的buffer必然是活的

这是记到一个变量上的, 当这个buffer被kill掉之后,它就不是活的了,但这个变量依然记着它

最后这种情况, 你是怎么玩会报错的?