为 tmux / screen 选择一个合适的引导键
Tmux 与 screen 一样,是命令行下常用的终端复用工具,提供了诸如分屏、窗口管理等功能。当通过快捷键调用这些功能时,一般需要先按下一个前缀按键,或者说是引导键,以避免这些快捷键和当前终端本来所有的快捷键冲突。
- 在 screen 下,这个引导键默认为 Ctrl + A;
- 在 tmux 下,这个引导键默认为 Ctrl + B。
但是尽管使用了引导键,这个引导键本身有时还是会与其他命令行下的常用工具如 vim, bash 等冲突,导致在这些程序中使用这个快捷键本身变得麻烦。如
- Ctrl + A
- bash: 回到行首
- vim: 自增当前光标下或光标后的数字
- Ctrl + B
- bash: 光标后退一个字符
- vim: 后退一页
- less: 后退一屏
那么换成什么其他键比较好呢?我的选择是 Ctrl + S。
由于 Ctrl + S 是作为终端字符流控制的快捷键,用于停止屏幕输出,与其对应的还有 Ctrl + Q ,用于继续屏幕输出。因此这两个按键一般不会被其他命令行下的程序选作快捷键,而且现在我们用的都是终端模拟器,可以回滚屏幕,对于暂停屏幕输出其实并没有很强的需求,所以选用他们可以最小化对终端及其他程序快捷键的影响。另外选择 Ctrl + S 而不是 Ctrl + Q 的原因则是, Ctrl + S 处在 home row 上,经常按的话会显得更方便一些。
此外,同样通常不会被其他命令行下程序选为快捷键的还有 Ctrl + C, Ctrl + Z, Ctrl + \ 等。但是这些快捷键相比之前提到的 Ctrl + S 和 Ctrl + Q,对于终端本身往往很有用。
如
- Ctrl + C:
- 向进程发送 SIGINT 信号,常用于结束进程
- Ctrl + Z:
- 向进程发送 SIGTSTP 信号,常用于挂起进程
- Ctrl + \:
- 向进程发送 SIGQUIT 信号,常用于结束进程,并进行核心转储 (core dump)
因此,选择这些按键作为快捷键,有时也会造成一定的的麻烦。
另外关于本文没有提到的一些快捷键,还可参考 superuser 上的相关讨论:
hotkeys - What's the least conflicting prefix/escape sequence for screen or tmux? - Super User
更换 tmux 的引导键
选定了合适的 tmux 引导键后,要想更改 tmux 默认的引导键,可以在 tmux 的配置文件 ~/.tmux.conf
中添加以下配置:
# 取消默认引导键 Ctrl-B 的绑定
unbind C-b
# 设定新的引导键为 Ctrl-S
set -g prefix C-s
# 设置连按两下引导键来发送该按键本身
bind C-s send-prefix
注:
-
如果意外连按两次 Ctrl + S 导致终端停止响应,可以按 Ctrl + Q 来恢复响应。
-
可以将上文中的两处
C-s
换为自己想要的引导键。 -
重启 tmux ,或执行
tmux source ~/.tmux.conf
以使新设置生效。
更换 screen 的引导键
在 ~/.screenrc
中添加以下配置即可。
escape ^Ss