如果我没理解错的话,tab-bar-mode 主要就是处理你描述的这个需求设计的,每个 tab 下维持各自的窗口布局,这和 tmux 几乎是一样的。你可以用 desktop-mode 来保存这个布局,类似的在 tmux 里可以用 tmux-resurrect 插件来实现。
(tmux 里只有 session, window, pane 的概念,因此我理解你说的"标签" 应该是指 tmux 里的 window, 而我理解这三个概念对应 emacs 里比较接近的分别是 frame, tab 和 window. tmux 没有 buffer, 而 emacs 里的 buffer 是个共享的对象,可以同时显示在不同的 window/tab 里,形成不同的组合视图,这更加灵活,如果用 tab-line-mode, 每个 window 上还可以挂一串 buffer ,但还没发现怎么能用好 tab-line)
如果你一般只有固定数量的 tab, 比如四个, 可以用以下方式设置按键:
(tab-bar-mode 1)
(setq tab-bar-tab-hints t)
(defun switch-to-tab-with-number (num)
(interactive)
(let ((current-prefix-arg num)) ;; emulate C-u num
(call-interactively 'tab-select)))
(general-define-key
:keymaps 'general-override-mode-map
"M-1" '(lambda () (interactive) (switch-to-tab-with-number 1))
"M-2" '(lambda () (interactive) (switch-to-tab-with-number 2))
"M-3" '(lambda () (interactive) (switch-to-tab-with-number 3))
"M-4" '(lambda () (interactive) (switch-to-tab-with-number 4)))
这里用 Meta-数字 直接切换 tab, 和 chrome 切换 tab 的按键是一样的,同时可以在 tmux 上把切换 window 也绑定成一样。emacs 里 Meta-数字默认是 digital universal-argument, 用 c-u + 数字 就可以替代,因此不怎么用。
另外这种绑定方式下就不要在 tmux 里嵌套 emacs 了,避免冲突,或者修改成别的按键。
如果工作布局都是固定的,例如第一个就是左右分屏,第二个就是上下分屏,那么 (setq tab-bar-show nil) (customize-set-variable 'tab-bar-show nil) 隐藏掉 tab-bar ,要切换用快捷键,或者 tab-list 函数切换。
以下代码创建 tab
(defun tab-create (target-tab-name)
"Create the NAME tab if it doesn't exist already or switch to that tab."
(let ((current-tab-name (alist-get 'name (tab-bar--current-tab)))
(tablist (mapcar #'cdadr (tab-bar-tabs))))
(unless (member target-tab-name tablist)
(tab-new)
(tab-bar-rename-tab target-tab-name))
(tab-bar-select-tab-by-name target-tab-name)))
比如以下新建的四个 tab, 以布局命名
(progn (tab-create "left-right")
(tab-create "golden-ratio")
(tab-create "vscode-layout")
(tab-create "misc"))
可以开 (desktop-save-mode 1) 自动保存和恢复