tmux — 会话保存、终端复用工具

优点是连接远端服务器开启 tmux 服务就可以在一个终端内启用多个控制台
并且在下次进入 ssh 服务器时会话还能通过 tmux 还原
在远端服务器上:不要轻易 按 ctrl+d, ctrl+z,输入 exit,不要 kill 任何进程,不要 rm 任何文件,不要执行你不确定的命令。

tmux 可以用 socket 隔离,默认使用 default
其中一个 socket 中有且仅有一个 tmux 服务进程和一些 session 进程(客户端)


tmux参数:
usage: tmux [-28lquvV] [-c shell-command] [-f file] [-L socket-name]
[-S socket-path] [command [flags]]
tmux ls 查看session列表(list-session),不同socket之间还要加-L参数
tmux attach [-t sessionname]重新进入 session(默认自然数)(attach可简写成a、at)。
tmux new-session -s session-name 创建一个命名session(可简写成new)
tmux kill-server
tmux kill-session -t sessionname
tmux show -g prefix 查看全局设置

默认前置键:C-b ,
s 选择一个会话
$ 重命名当前会话

c 新建window
重命名当前window
. 移动window
& 关闭当前window(提示)
f 搜索window
w 选择window ,n(下一个),p(上一个),l 最后一个选择窗口(切换)

" 新开水平面板
% 新开垂直面板
x 删除当前面板(提示)
q 面板显示数字,接着按数字切换
z 临时全屏化面板
方向键 切换面板(o切换)
C-方向键 改变面板大小
{ / }左右pane交换
空格 切换面板布局

? 查看绑定键
! 移动当前面板到新window
d 分离当前会话(detached,回到tmux外面)

[ 进入选择模式
空格开始复制
回车结束复制
] 粘贴
= 选择buffer粘贴
键入 y 复制 buffer 中最新的内容到系统剪贴板。

: 命令模式,运行的命令对所有session生效,如:
kill-session 关闭当前 session(exit、ctrl+d最后一个面板会关闭会话),所有快捷键通过命令显示
对于linux,可以使用xclip,配置(.tmux.conf)如下:
bind y run-shell "tmux show-buffer | xclip -sel clip -i" \; display-message "Copied tmux buffer to system clipboard"

自定义前置键:
unbind C-b
set -g prefix M-q
bind M-q send-prefix
set-option -g display-time 5000 #提示信息的持续时间;设置足够的时间以避免看不清提示,单位为毫秒

自动生成布局

新建一个文件 ~/.tmux/mylayout:
selectp -t 0 #选中第0个窗格
splitw -h -p 50 #将其分成左右两个
selectp -t 1 #选中第一个,也就是右边那个
splitw -v -p 50 #将右边那个分成上下两个
selectp -t 0 #选中第一个
然后在 .tmux.conf 后面添加:
bind D source-file ~/.tmux/mylayout
这样,每次当我们启动 tmux 后, 可以使用 ctrl-b + D 来生成布局

脚本化:
# auto tmux open
tmuxpath=$(which tmux) # tmux path
sessionname="mantou" # session name
if [ -z $tmuxpath ]; then
echo "You need to install tmux."
fi
$tmuxpath has -t $sessionname 2> /dev/null # 有没有这个会话,没有就会执行下面的if
if [ $? != 0 ] && [ "${TMUX_OPENED}" == "" ]; then
$tmuxpath new -d -n herweb -s $sessionname "cd ~/her-web && node app" #w1
$tmuxpath splitw -h "cd ~/her-web && gulp watch"
$tmuxpath splitw -v "cd ~/her-web"
$tmuxpath neww -n heradmin "cd ~/her-admin && node app" #w2
$tmuxpath splitw -h "cd ~/her-admin && gulp watch"
$tmuxpath splitw -v "cd ~/her-admin"
$tmuxpath neww -n ssh "ssh dev -t 'tmux a -t mt'" #3
$tmuxpath neww -n local "cd ~ && node www" #4
$tmuxpath neww -n ngrok "cd ~/下载/ittun_linux64 && ./bin/ngrok -config ./bin/ngrok.cfg start web web3 web2 ssh" #5
$tmuxpath splitw -h "cd ~/下载/ngrok && ./ngrok -config ./ngrok.cfg start ssh"
$tmuxpath neww -n bash #6
$tmuxpath selectw -t $sessionname:6
$tmuxpath selectp -t 1
export TMUX_OPENED=1
fi
$tmuxpath a -t $sessionname # 新开的面板这里会在执行一次,所以有嵌套提示