emacs多窗口多buffer多文件的使用方式问题

如果我没理解错的话,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) 自动保存和恢复

2 个赞

其实我这种用法类似workerspace,但实际上不是workerspace。就是想保留几个固定得layout,因为我经常需要同时对着好几个文件看。

我需要的功能就是如此。回头试一下。适应适应,如果感觉顺手,可以取代现在的用法。

虽然我绝大多数是在终端+tmux下用。不过现在的办法依赖tmux的window。如果什么时候只有emacs了,比如gui下面。就没办法按照这种习惯了。所以最好还是能在emacs中有完整的方法。

多谢各位。

多谢,我试了一下。这个效果就是我要的效果。

但是general-define-key 这块提示出错。我暂时不用这个快捷键了。用C - x t 来切换tab。

修改了之前回答里一些问题,隐藏 tab-bar 需要用 custom 方式, 另外 tab-create 也改了。

general-define-key 是 general 这个包提供的,用 global-set-key 试试。

多谢。刚才试了一下,还是不行。回头我再看看。