整理了一下最近总结的一套项目管理和窗口管理流程,分享一下
首先需要说明的是,在 Emacs 中,有两个「tab」
-
tab-line
:是 window-local 的,类似 VS Code 里面的 tab 栏,可以更改一个 window 里所显示的 buffer -
tab-bar
:是全局的(或者说 frame-local),贴近于一个窗口布局(window-configuration)的管理工具
我的工作流分成了三层:persp-mode > tab-bar > window
:
-
persp
对应工作区的概念,我一般习惯一个项目放在一个工作区中。工作区中所打开的 buffer,设置的 tabs,窗口布局信息都可以保存和恢复,方便继续工作;- 例如我将
.emacs.d
配置放在一个工作区里,这个工作区还有help
信息,list colors
的 buffer 等; - 我也将 elfeed 放在一个单独的工作区,包括它打开的
eww
等,放置污染其他工作区 - 此外,Git 仓库/笔记/博客我也会设置单独的工作区
- 工作区的列表显示在
tab-bar
上,用C-c p n
/C-c p p
或者persp-switch
切换 - 平时用
persp-switch-to-buffer
切换
- 例如我将
-
tab
对应窗口布局,一般应对这样的场景:开两三个窗口编辑文件的时候,突然想看另一个文件的信息,但是不想打乱当前的布局,就新开一个 tab,对应一组新的 window-configuration- 类似在一个项目中的多个工作模式
-
tab
上标注数字,方便用super(cmd) + <digit>
切换
-
window
这里值得一说的是我习惯用popper
这个包控制那些临时 buffer,使用下面这个 hack 可以在弹出这些临时 buffers 的时候用C-g
直接关掉- 我在窗口的
mode-line
上面放置了数字,可以用meta(alt, options) + <digit>
切换
- 我在窗口的
;; HACK: close popper window with `C-g'
(defun +popper-close-window-hack (&rest _)
"Close popper window via `C-g'."
(when (and (called-interactively-p 'interactive)
(not (region-active-p))
popper-open-popup-alist)
(let ((window (caar popper-open-popup-alist)))
(when (window-live-p window)
(delete-window window)))))
(advice-add #'keyboard-quit :before #'+popper-close-window-hack)
由于 tab-bar
和 mode-line
都是高度可定制的,因此我把一些信息直接放上面了:
当然,让 persp-mode
和 tab-bar
协同工作需要一些 hack,感兴趣的话可以看我的具体的配置(给 doom-emacs 交过 hack 的 PR,doom 用户不需要考虑)