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 + SCtrl + 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

注:

  1. 如果意外连按两次 Ctrl + S 导致终端停止响应,可以按 Ctrl + Q 来恢复响应。

  2. 可以将上文中的两处 C-s 换为自己想要的引导键。

  3. 重启 tmux ,或执行 tmux source ~/.tmux.conf 以使新设置生效。

更换 screen 的引导键

~/.screenrc 中添加以下配置即可。

escape ^Ss