使用 Tab Bar 管理打开的 project

发现没有人提到过 emacs 内置的 Tab Bar.

最近有打开多个 project 的需求,一直在看怎么管理起来比较方便。 经过一些简单的尝试发现使用 tab 管理打开的多个 project 是个不错的方案。

关于 Tab Bar, 最近所了解的

  1. 从 27 开始内置,性能良好
  2. 每个 tab 下可以打开一组 window,互相不影响
  3. 每个 frame 全局一个,每个 tab 会关联到一个 frame
  4. 自带的命令丰富,和同为内置的 project 天然集成
  5. 支持鼠标,左中右键,拖动(体验一般),滚动都支持
  6. 可以使用支持内置的 desktop-save/read 直接保存和在下次打开 emacs 时恢复
  7. 支持分组批量管理(似乎用途不大)
  8. 关闭 Tab 可以撤销

工作流大概是这样的 使用 C-x t p p 切换项目,之后为当前的 tab 重命名一下。

切换 Tab 的命令,默认好像都没有快捷键。

  • tab-bar-switch-to-tab
  • tab-bar-switch-to-prev-tab
  • tab-bar-switch-to-next-tab

把习惯性的切换 buffer 和打开文件的命令换成 project-switch-to-bufferproject-find-file.

对于我这种喜欢两个 buffer 之间来回切的,切到了其它的 project 下的 buffer 是比较麻烦的事。所以只能自己写个命令,因为 project 没有一个 recent buffer 之类的命令。

(require 'dash)

(defun +project-previous-buffer (arg)
  "Toggle to the previous buffer that belongs to current project."
  (interactive "P")
  (unless arg
    (if-let ((pr (project-current)))
      (switch-to-buffer
       (->> (project--buffer-list pr)
         (--remove (or (minibufferp it)
                       (get-buffer-window-list it)))
         (car))))))

这样常用的命令就不会离开当前的 project 了。

Tab Bar 的默认样式有点丑,但样式定制不复杂,大概只需要处理这三个 face 就可以有个还不错的样子。

`(tab-bar                        ((t (:inherit hl-line))))
`(tab-bar-tab                    ((t (:inverse-video t :bold t))))
`(tab-bar-tab-inactive           ((t (:inherit shadow))))

tab-bar-formatmode-line-format 一样可以定制,不一定只显示 tab. 比如下图我把 project 名称和 vc 信息放在了右侧。

相关的配置见这里

10 个赞

Spacemacs theme支持tab-bar。spacemacs用户不需要定制样式。

Tab-bar和vim的tab概念基本一致,对vimmer应该不陌生。

1 个赞

我用tab-bar很多年了,发现按照project管理最大的不方便是要来回切换project才能找到对应buffer。

也许跟我同时维护多个项目有关,修A插件的时候发现B插件有问题,最后发现要同时修复C和B插件,才能继续修复A插件。

最后发现啥分组都不要,按照频率排序标签最方便。

2 个赞

因为大量同名文件的原因,我还是要先切换 project。但也确实有不需要切换 project 就能直接定位的 buffer, 这样的情况还没有想好,让这个切换同时把 tab 也切换了,可能就更符合我的场景。

1 个赞

重名的问题可以通过 uniquify 插件来解决,我在 awesome-tab 已经做了相应的实现,重名时标签名会有相应的变化。

为啥我用这个配置,右侧的仓库和vc信息没有显示呢 :slightly_frowning_face:

因为我用的函数是自定义的,不是 emacs 自带的。。。在 init-uitl.el 里面

奇怪,自定义的函数应该就只有 +vc-branch-name 吧,我加上了这个过后还是没法显示捏?+tab-bar-right 这个函数是有返回的

我咋感觉这个 tab-bar 和 eyebrowse 比较像呢?每个 tab 下面保存的是一个 window configuration。新打开的 buffer 并不会加入到 tab 栏显示

(setq desktop-load-locked-desktop t) ; don't popup dialog ask user, load anyway
(setq desktop-restore-frames t)

(desktop-save-mode 1)

在使用 tab-bar-mode 创建多个工作区后,使用上面这段代码可以实现对多个工作区的自动保存和加载。

目前看到大多配置desktop中的 (setq desktop-restore-frames nil),这将导致只能恢复一个工作区而非全部。

1 个赞