tmux非常好用,但是跟vim一样,也是建立在配置纯熟的前提下。
当然即使配好了,还是有很多痛点……
比如内联使用就是其中一个。

所谓内联,就是:

1、首先在本机运行了tmux,切分出一个面板
2、在这个面板里ssh到远程主机,又进入远程主机的tmux环境
3、这时候远程tmux就傻眼了,因为所有命令都被本地主机上的tmux响应
4、那么如何在本地和远程tmux之间来回切换操作对象呢?

在用tmux自身方式解决这个问题之前,只能开两个终端,在另一终端去ssh,一般的终端软件都支持tab功能,用快捷键切换tab,也还能接受。缺点是难以把两个不同主机的shell拼在一屏里显示,而且经常在本地终端习惯性的就敲ssh了,强制分离总是不便

后来实在忍受不了,在google上到处搜索尝试,终于找到了tmux自身解决之道,原理很简单:

给本地tmux配置两套key-table,切换到远程tmux时,使用新的key-table,并将prefix设为None,这样一来,所有基于原prefix的操作指令都不再被本地tmux拦截,而是发到远程处理。同时,也要给新的key-table设置退出键,以便恢复到本机模式。

下面是配置的关键部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#按F12切换到内嵌tmux,在macos里需要系统设置中取消F12占用
#1. prefix为None,不再拦截快捷键
#2. key-table为off,下面再绑定off下的F12,使之能退出内嵌模式
#3. 改变statusbar颜色,以便知道已进入内嵌模式
#4. 如果处于特殊模式,退出
unbind -T root F12
bind -T root F12 \
set prefix None \;\
set key-table off \;\
set status-style bg=colour235 \;\
if -F '#{pane_in_mode}' 'send-keys -X cancel' \;\
refresh-client -S

#在off表里绑定F12,恢复之前的设置,以退出该模式
bind -T off F12 \
set -u prefix \;\
set -u key-table \;\
set -u status-style \;\
refresh-client -S