tmux使用参考
2013-05-09 12:26:14

tmux源于OpenBSD,用于替代GNU的screen,tmux=terminal multiplexer。即使非正常掉线也能保证当前的任务运行,这一点对于远程SSH访问特别有用,网络不好的情况下仍然能保证工作现场不丢失。

tmux使用C/S模型构建,主要包括以下单元模块:
server:服务器:输入tmux命令时就开启了一个服务器。
session:会话:一个服务器可以包含多个会话。
window:窗口:一个会话可以包含多个窗口。
pane:面板:一个窗口可以包含多个面板。



tmux命令启动一个服务
一个服务可以有多个session
一个session有以多个窗口
一个窗口有多个pane

tmux的结构包括会话(session)、窗口(window)、窗格(pane)三部分,会话实质是伪终端的集合,每个窗格表示一个伪终端,多个窗格展现在一个屏幕上,这一屏幕就叫窗口。基本的操作无非就是对会话、窗口、窗格进行管理,包括创建、关闭、重命名、连接、分离、选择等等。一般使用命令和快捷键进行操作,可在系统shell终端和tmux命令模式(类似vim的命令模式)下使用命令,或者在tmux终端使用快捷键。tmux默认的快捷键前缀是ctrl+b(下文用prefix指代),按下前缀组合键后松开,再按下命令键进行快捷操作,比如使用prefix d分离会话(应该写作prefix d而不是prefix+d,因为d键不需要与prefix同时按下)。



tmux命令都具有一个前缀命令(PREFIX),默认的是ctrl+b,可以自行修改;如想改为ctrl+a,可 在~/.tmux.conf中加入如下行,没有~/.tmux.conf文件自己建立一个即可。
set -g prefix C-b
unbind C-b

此时并没有生效,重启tmux或者在命令模式(按PREFIX:)输入

source-file ~/.tmux.conf
任何命令前都需要ctrl+a,然后再按其他的键发出具体的操作命令,更多命令请看tmux参考手册

主要的快捷键就是ctrl+b 了,最常用的功能总结如下:

tmux attach #恢复
tmux -2 # 以256终端运行
C-b d  # 返回主 shell,tmux 依旧在后台运行,里面的命令也保持运行状态
tmux ls # 显示已有tmux会话(C-b s)
tmux attach-session -t 数字 # 选择tmux
tmux new-session -s session-name
tmux kill-session -t session-name
tmux attach -t session #进入某个会话

更多功能:
C-b ? // 显示快捷键帮助
C-b C-o //调换窗口位置
C-b 空格键 //采用下一个内置布局
C-b ! // 把当前窗口变为新窗口
C-b " // 模向分隔窗口
C-b % // 纵向分隔窗口
C-b q // 显示分隔窗口的编号
C-b o // 跳到下一个分隔窗口
C-b 上下键 // 上一个及下一个分隔窗口
C-b C-方向键 //调整分隔窗口大小
C-b & // 确认后退出 tmux
C-b c // 创建新窗口
C-b 0~9 //选择几号窗口
C-b c // 创建新窗口
C-b n // 选择下一个窗口
C-b l // 最后使用的窗口
C-b p // 选择前一个窗口
C-b w // 以菜单方式显示及选择窗口
C-b s // 以菜单方式显示和选择会话
C-b t //显示时钟
C-b [ //复制(空格开始)
C-b ] //粘贴(回车结束)
C-b , //给当前窗口改名
C-b d //挂起,临时断开会话
c-b x 关闭当前光标处的小窗口
c-b s 选择attach的会话

查看历史记录
因为一些命令执行的时候,显示结果总会超过一屏,可以使用以下指令向上翻页以看到前面的东西:
C-b pageup/pagedown

分割/切割视窗
 C-b Ctrl按着 + 上下左右, 可以调整视窗大小
 C-b s 横切
 C-b v 直切 (或 C-b %)
 C-b C-o 调换 切割视窗 的 位置
 C-b 上下左右 跳到上下左右的分割视窗,切割视窗有些 Default Layout 可以用, 假设我已经切了四个分割视窗.
 C-b Esc 1 直的切割视窗排列 (M-1)
 C-b Esc 2 横的切割视窗排列 (M-2)
 C-b Esc 3 上面一个大的横视窗 + 下面直的三个直视窗 (M-3)
 C-b Esc 4 左面一个大的横视窗 + 右面直的三个直视窗 (M-4)
 C-b Esc 5 四个视窗各 1/4 (M-5)

多人共同操作界面:screen 有多人可以一起登入看同一个画面的功能,用法:不需要做任何事情,只要每个人登入后,直接 tmux attach 进去,就是多人共同看到的界面,大家都可以操作同一界面。当然也可对tmux进行定制,可将相关的设置定义保存到其配置文件中,这样就不用每次使用时对其配置了。

将其放在用户主目录下'~/.tmux.conf'。
#设置PREFIX为Ctrl-a
set -g prefix C-a
#解除Ctrl-b与PREFIX的对应关系
unbind C-b
#copy-mode将快捷键设置为vi模式
setw -g mode-keys vi
#将r键设置为加载配置文件,并显示"reloaded!"信息
bind r source-file ~/.tmux.conf \; display "Reloaded!"
#设置终端颜色为256色
set -g default-terminal "screen-256color"
#开启status-bar uft-8支持
set -g status-utf8 on

#按键绑定
#选择分割的窗格,像vim那样操作
bind k selectp -U #选择上窗格
bind j selectp -D #选择下窗格
bind h selectp -L #选择左窗格
bind l selectp -R #选择右窗格

#重新调整窗格的大小
bind ^k resizep -U 10
bind ^j resizep -D 10
bind ^h resizep -L 10
bind ^l resizep -R 10

#交换两个窗格
bind ^u swapp -U
bind ^d swapp -D
bind ^a last
bind q killp

#设置pan前景色
set -g pane-border-fg green
#设置pane背景色
set -g pane-border-bg black
#设置活跃pane前景色
set -g pane-active-border-fg white
#设置活跃pane背景色
set -g pane-active-border-bg yellow
#设置消息前景色
set -g message-fg white
#设置消息背景色
set -g message-bg black
#设置消息高亮显示
set -g message-attr bright
#设置status-bar颜色
set -g status-fg white
set -g status-bg black

#设置窗口列表颜色
setw -g window-status-fg cyan
setw -g window-status-bg default
setw -g window-status-attr dim

#设置当前窗口在status bar中的颜色
setw -g window-status-current-fg white
setw -g window-status-current-bg red
setw -g window-status-current-attr bright

#设置状态行(status bar)格式
set -g status-left-length 40
set -g status-left "#[fg=green]Session: #S #[fg=yellow]#I #[fg=cyan]#P"
#set -g status-right "#[fg=cyan]%d %b %R"
set -g status-right "#[fg=yellow,bright][ #[fg=cyan]#W #[fg=yellow]]#[default] #[fg=yellow,bright]- %Y.%m.%d #[fg=green]%H:%M #[default]"
set -g status-right-attr bright
set -g status-interval 60
set -g status-justify centre

#开启window事件提示
setw -g monitor-activity on
set -g visual-activity on


面板-pane

如果用过vim,命令sp / vsp一定用的顺手吧,没事就把窗口切成多块。tmux的pane做类似的事情,可以试试下面的命令:
**ctrl+b+其它键:先按ctrl+b一下,然后再按其它键 **
":水平分割
%:竖直分割
x:关闭面板
方向键:选择面板
ctrl+方向键:1个单元格调整面板大小
Alt+方向键:5个单元格调整面板大小
q:显示面板编号

窗口

还记得痛苦的不停开ssh客户端做不同事情吗?干嘛不用窗口呢。所谓窗口就是tab啦,浏览器的tab,vim的tab,很熟悉吧。

c:创建新窗口
&:关闭窗口
,:改变窗口名字
数字键:选择窗口
w:按窗口列表选择窗口
f:在所有窗口中查找指定文本

会话-session

session是一个什么概念了,可以认为是一个工作环境的上下文。官方概念是窗口就是一个伪终端,而session就是一组窗口(伪终端)。

session的好处是:
1.如果客户端掉线了,session仍然保持着
2.多个客户端可以连到同一个session

如果你还对其它的2、3、4记忆犹新的话,那么session就派上用场了:
tmux new -s session-id  #建立session
tmux ls  #列出session  
tmux attach -t session-d  #attach session
ctrl+b+d  #detach session

对问题4来说,开个session,然后告诉别人session-id。他人attach一下session-id,这样你所做的任何操作,他人都可以看到了。


会话管理

常用命令
tmux new:创建默认名称的会话(在tmux命令模式使用new命令可实现同样的功能,其他命令同理,后文不再列出tmux终端命令)
tmux new -s freeoasession:创建名为freeoasession的会话
tmux ls:显示会话列表
tmux a:连接上一个会话
tmux a -t freeoasession:连接指定会话
tmux rename -t s1 s2:重命名会话s1为s2
tmux kill-session:关闭上次打开的会话
tmux kill-session -t s1:关闭会话s1
tmux kill-session -a -t s1:关闭除s1外的所有会话
tmux kill-server:关闭所有会话

常用快捷键
prefix s:列出会话,可进行切换
prefix $:重命名会话
prefix d:分离当前会话
prefix D:分离指定会话

窗口管理
prefix c:创建一个新窗口
prefix ,:重命名当前窗口
prefix w:列出所有窗口,可进行切换
prefix n:进入下一个窗口
prefix p:进入上一个窗口
prefix l:进入之前操作的窗口
prefix 0~9:选择编号0~9对应的窗口
prefix .:修改当前窗口索引编号
prefix ':切换至指定编号(可大于9)的窗口
prefix f:根据显示的内容搜索窗格
prefix &:关闭当前窗口

窗格管理
prefix %:水平方向创建窗格
prefix ":垂直方向创建窗格
prefix Up|Down|Left|Right:根据箭头方向切换窗格
prefix q:显示窗格编号
prefix o:顺时针切换窗格
prefix }:与下一个窗格交换位置
prefix {:与上一个窗格交换位置
prefix x:关闭当前窗格
prefix space(空格键):重新排列当前窗口下的所有窗格
prefix !:将当前窗格置于新窗口
prefix Ctrl+o:逆时针旋转当前窗口的窗格
prefix t:在当前窗格显示时间
prefix z:放大当前窗格(再次按下将还原)
prefix i:显示当前窗格信息

其他命令
tmux list-key:列出所有绑定的键,等同于prefix ?
tmux list-command:列出所有命令


参考链接:
使用tmux
Tmux Cheat Sheet