平铺窗口管理器为了提升显示空间的利用率,一般都有工作区( workspace )的功能,比如 i3wm 和 qtile 默认定义了10个工作区。工作区可以隔离不同的应用,让我们专注当前的工作区,避免无关应用的干扰。
但如果某个程序需要在多个工作区之间共享使用,这种隔离反而变成了一种负担,导致我们需要频繁地在不同工作区之间切换,比如在只有浏览器的 i3wm 工作区开一个 Emacs 窗口来记笔记的时候。
想了一下,这种情况有几种解决办法:
- 在工作区之间移动应用
- 把应用放到 scratchpad 中,这样在所有的工作区都能够通过下拉 scratchpad 把应用找出来
- 如果应用支持多窗口,在任意工作区按需创建新的窗口
第一种方法相对来说过于繁琐,后两种方法里,我更习惯用第三种方法。那么如何实现呢?
我们都知道, Emacs 中可以通过命令 M-x make-frame-command (C-x 5 2)
来分出一个新的窗口,那有没有办法在没有 Emacs 窗口的工作区中触发执行这个命令呢?
好在 Emacs 有一种本机的 C/S 机制, Emacs 打开 server 功能之后, emacsclient 客户端就可以连接进来。
基于此,再结合 i3wm 的绑定按键功能,我们就可以实现快速创建 Emacs 窗口,具体做法是:
- 在 Emacs 配置中开启 server 功能:
(server-start)
- i3wm 绑定按键来执行命令:
bindsym $mod+e exec --no-startup-id emacsclient --eval '(make-frame-command)'
,注意必须指定--no-startup-id
选项才比较可靠
然后重启 Emacs (或者直接 eval (server-start)
)且重新加载 i3wm 的配置,就可以通过 mod+e 按键来快速地创建 Emacs 窗口了: