Tmux

基本操作

1
2
3
4
tmux new -s SESSION_NAME  # 新建会话
tmux new -s SESSION_NAME -d # 新建会话并放入后台
tmux ls # 列出所有会话
tmux attach -t SESSION_NAME # 进入某会话

命令列表

默认情况下,tmux的前导命令开关是Ctrl+b,按了Ctrl+b后再按下面的命令,即执行相应操作:

会话类

键位 操作描述
? 显示所有快捷键,按q退出
d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
D 选择要脱离的会话;在同时开启了多个会话时使用
s 选择并切换会话;在同时开启了多个会话时使用
: 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器
[ 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出

窗口类

键位 操作描述
c 创建新窗口
& 关闭当前窗口
数字键 切换至指定窗口
p 切换至上一窗口
n 切换至下一窗口
l 在前后两个窗口间互相切换
w 通过窗口列表切换窗口
, 重命名当前窗口;这样便于识别
. 修改当前窗口编号;相当于窗口重新排序
! 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板

面板类

键位 操作描述
将当前面板平分为上下两块
% 将当前面板平分为左右两块
x 关闭当前面板
o 在当前窗口中选择下一面板
q 显示面板编号

其他

如果不想使用默认tmux server,或者同一用户想起多个tmux实例,可以使用-S参数指定不同的unix socket:

1
tmux -S /path/to/another/unix/socket-file

在tmux里使用zsh有时会导致窗口名称会不断变化,这需要修改下~/.zshrc文件:

1
DISABLE_AUTO_TITLE=true

可编程

tmux最强大的地方还在于他的可编程性,用tmux list-commands可以看到tmux所有支持的命令。以我自己常执行的一个脚本为例,我开机后常常需要启动一系列服务便于开发, 但当我不开发时开电脑又不需要启动,所以放到开机自启动脚本里是不合适的,所以这里用tmux来批量起最合适了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/zsh
# start tmux
session=MAC
tmux new -s "$session" -d
tmux rename-window -t "$session:0" daemon
# start redis-server
tmux send -t "$session:daemon" 'redis-server' Enter
tmux split-window -h -t "$session:daemon"
# start mongo
tmux send -t "$session:daemon" 'mongod --dbpath /Users/jason/local/var/mongodb-data' Enter
# start nginx
tmux split-window  -t "$session:daemon" '/Users/jason/local/nginx/sbin/nginx'
tmux select-pane -L -t "$session:daemon"
tmux split-window -t "$session:daemon"
# start firefox with pentadactyl
tmux send -t "$session:daemon" '/Applications/Firefox.app/Contents/MacOS/firefox -pentadactyl +u NONE' Enter
tmux select-pane -R -t "$session:daemon"

# for develop project
tmux neww -a -n dev -t "$session"
tmux send -t "$session:dev" 'cd /Users/jason/repository/backend' Enter
tmux split-window -t "$session:dev"
tmux send -t "$session:dev" 'cd /Users/jason/repository/frontend' Enter

这个脚本启动一个名为MAC的tmux session,并新建了两个窗口,在第一个窗口里开了4个面板,分别启动了nginx, redis, mongo, firefox。其中,开启窗口/面板时同时执行命令,该窗口/面板会在命令执行结束后自动关闭,所以第一个窗口最后实际只有3个面板;第二个窗口启动并切换到我正则开发的工程。

具体命令的使用可以参照该示例和man手册理解。

enjoy tmux!

Comments