发现没有人提到过 emacs 内置的 Tab Bar.
最近有打开多个 project 的需求,一直在看怎么管理起来比较方便。 经过一些简单的尝试发现使用 tab 管理打开的多个 project 是个不错的方案。
关于 Tab Bar, 最近所了解的
- 从 27 开始内置,性能良好
- 每个 tab 下可以打开一组 window,互相不影响
- 每个 frame 全局一个,每个 tab 会关联到一个 frame
- 自带的命令丰富,和同为内置的 project 天然集成
- 支持鼠标,左中右键,拖动(体验一般),滚动都支持
- 可以使用支持内置的 desktop-save/read 直接保存和在下次打开 emacs 时恢复
- 支持分组批量管理(似乎用途不大)
- 关闭 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-buffer
和 project-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-format
和 mode-line-format
一样可以定制,不一定只显示 tab.
比如下图我把 project 名称和 vc 信息放在了右侧。
相关的配置见这里