使用tmux?

摘要

为什么使用tmux? 我也不知道

tmux比screen有更多的功能,能够保持你的工作环境连续性。例如tmux解决如下的问题:

1)下班后,你需要断开ssh或关闭电脑,你的ssh连接将丢失;
2)在公司打开的ssh,在家里也需要访问;

https://blog.csdn.net/simple_the_best/article/details/51360778
https://blog.csdn.net/robertbaker/article/details/42172203
https://www.cnblogs.com/chjbbs/p/5689011.html

tmux架构图

img

tmux使用C/S模型构建,主要包括以下单元模块

一个tmux命令执行后启动一个tmux服务
一个tmux服务可以拥有多个session,一个session可以看作是tmux管理下的伪终端的一个集合
一个session可能会有多个window与之关联,每个window都是一个伪终端,会占据整个屏幕
一个window可以被分割成多个pane

tmux的配置

~/.tmux.conf (以下主要的作用:修改tmux命令激活按键为ctrl+a,)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
set-option -g base-index 1
set-option -g display-time 5000
set-option -g repeat-time 1000
set-option -g status-keys vi
set-option -g status-right "#(date +%H:%M' ')"
set-option -g status-right-length 10
#set-option -g status-utf8 on
#set-window-option -g utf8 on


# 解除默认前缀
unbind-key C-b
#unbind C-b
# 设置自定义前缀
bind-key C-a send-prefix
set-option -g prefix C-a
#set -g prefix C-a
# 采用vim的操作方式
set-window-option -g mode-keys vi
#setw -g mode-keys vi
# 窗口序号从1开始计数
#set -g base-index 1
set-window-option -g pane-base-index 1
set-window-option -g main-pane-width 100 # 设置主Pane宽度
set-window-option -g main-pane-height 80 # 设置主Pane高度
# 开启鼠标模式
set-option -g mouse on

# 通过前缀+KJHL快速切换pane
#up
bind-key k select-pane -U
#down
bind-key j select-pane -D
#left
bind-key h select-pane -L
#right
bind-key l select-pane -R

# panes 分割线颜色
set -g pane-border-bg colour236
set -g pane-border-fg colour236
set -g pane-active-border-bg colour232
set -g pane-active-border-fg colour232

bind-key z kill-session
bind-key h select-layout even-horizontal
bind-key v select-layout even-vertical

# invoke reattach-to-user-namespace every time a new window/pane opens
#set-option -g default-command "reattach-to-user-namespace -l zsh"
# start selecting text typing 'v' key (once you are in copy mode)
#bind-key -t vi-copy v begin-selection
# copy selected text to the system's clipboard
#bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"


# if exists('$TMUX')
# set term=screen-256color
# endif

# 状态栏
# 颜色
set -g status-bg black
set -g status-fg white

# 对齐方式
set-option -g status-justify centre

# 左下角
set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'
set-option -g status-left-length 20

# 窗口列表
setw -g automatic-rename on
set-window-option -g window-status-format '#[dim]#I:#[default]#W#[fg=grey,dim]'
set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'

# 右下角
set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]'

tmux的使用问题

使用putty连接到远程的机器是,需要设置windows->Translation->Remote characters set 为UTF-8, 否则tmux的windows中pane的间隔线显示有问题。

在修改tmux的conf后,需要重启tmux服务, 此时需要ctrl+c / : kill-server。

在多个panes的时候拷贝粘贴是个问题,需要ctrl+c / [ 进入复制模式。

tmux的常用按键

1
2
3
4
5
6
7
8
9
10
11
12
13
tmux #开启tmux
tmux ls #列出会话
tmux attach -t session #进入某个会话

tmux -r 连接上次断开的session
C-c d 临时断开session 断开以后,还可以连上的哟:)

C-c c 创建一个新的window
C-c 数字 直接跳到你按的数字所在的window
C-c " 在下边分割出来一个pane
C-c % 在右边分割出来一个pane
C-c o 在多个panes中切换
C-c x 关闭当前光标处的pane

更多的快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Ctrl+c  #激活控制台;此时以下按键生效   
系统操作
? #列出所有快捷键;按q返回
d #脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
D #选择要脱离的会话;在同时开启了多个会话时使用
Ctrl+z #挂起当前会话
r #强制重绘未脱离的会话
s #选择并切换会话;在同时开启了多个会话时使用
: #进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器
[ #进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出
~ #列出提示信息缓存;其中包含了之前tmux返回的各种提示信息
窗口操作
c #创建新窗口
& #关闭当前窗口
数字键 #切换至指定窗口
p #切换至上一窗口
n #切换至下一窗口
l #在前后两个窗口间互相切换
w #通过窗口列表切换窗口
, #重命名当前窗口;这样便于识别
. #修改当前窗口编号;相当于窗口重新排序
f #在所有窗口中查找指定文本
面板操作
” #将当前面板平分为上下两块
% #将当前面板平分为左右两块
x #关闭当前面板
! #将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板
Ctrl+方向键 #以1个单元格为单位移动边缘以调整当前面板大小
Alt+方向键 #以5个单元格为单位移动边缘以调整当前面板大小
Space #在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled
q #显示面板编号
o #在当前窗口中选择下一面板
方向键 #移动光标以选择面板
{ #向前置换当前面板
} #向后置换当前面板
Alt+o #逆时针旋转当前窗口的面板
Ctrl+o #顺时针旋转当前窗口的面板

Ctrl-b t 很酷的一个时钟。

tmux 批量操作面板

前置键后,键入“:”,然后通过命令:

1
2
3
set synchronize-panes
set synchronize-panes on
set synchronize-panes off

来控制是否批量控制当前窗口所有的面板。

tmuxinator

https://github.com/tmuxinator/tmuxinator

config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
name: sample
root: ~/

windows:
- stats:
- ssh stats@example.com
- tail -f /var/log/stats.log
- logs:
layout: main-vertical
panes:
- logs:
- ssh logs@example.com
- cd /var/logs
- tail -f development.log

commands

1
2
3
4
5
6
7
8
9
tmuxinator start [project] -n [name] -p [project-config]
tmuxinator copy [existing] [new]
tmuxinator list
tmuxinator delete [project]
tmuxinator implode
tmuxinator doctor
tmuxinator help
tmuxinator debug [project]
tmuxinator version

Oh My Tmux

https://github.com/gpakosz/.tmux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
绑定
可以通过使用前缀密钥的密钥组合,然后是命令密钥,从附加的客户端控制tmux。此配置C-a用作辅助前缀,同时保留C-b为默认前缀。在以下键绑定列表中:

<prefix>意味着您必须按Ctrl+ a或Ctrl+b
<prefix> c意味着你必须按Ctrl+ a或Ctrl+ b后跟c
<prefix> C-c意味着你必须按Ctrl+ a或Ctrl+ b后跟Ctrl+c
此配置使用以下绑定:

<prefix> e~/.tmux.conf.local使用$EDITOR环境变量定义的编辑器 打开(默认为vim空时)

<prefix> r 重新加载配置

C-l 清除屏幕和tmux历史记录

<prefix> C-c 创建一个新会话

<prefix> C-f 允许您按名称切换到另一个会话

<prefix> C-h并<prefix> C-l让你导航窗口(默认 <prefix> n和<prefix> p未绑定)

<prefix> Tab 带您进入最后一个活动窗口

<prefix> - 垂直拆分当前窗格

<prefix> _ 水平分割当前窗格

<prefix> h,<prefix> j,<prefix> k并<prefix> l让您导航窗格ALA的Vim

<prefix> H,<prefix> J,<prefix> K,<prefix> L让你调整窗格

<prefix> <并<prefix> >让你交换窗格

<prefix> + 将当前窗格最大化为新窗口

<prefix> m 打开或关闭鼠标模式

<prefix> U 启动Urlview(如果有)

<prefix> F 推出Facebook PathPicker(如果有)

<prefix> Enter 进入复制模式

<prefix> b 列出粘贴缓冲区

<prefix> p 从顶部粘贴缓冲区粘贴

<prefix> P 让您选择要粘贴的粘贴缓冲区

另外,copy-mode-vi匹配我自己的Vim配置

绑定copy-mode-vi:

v 开始选择/视觉模式
C-v 在块状视觉模式和视觉模式之间切换
H 跳到线的开头
L 跳到行尾
y 将选择复制到顶部粘贴缓冲区
Escape 取消当前操作




配置状态行
与此相反配置的第一个迭代,现在你对内容和顺序总量控制status-left和status-right。

编辑~/.tmux.conf.local文件(<prefix> e)并根据您自己的喜好调整 tmux_conf_theme_status_left和tmux_conf_theme_status_right变量。

此配置支持以下内置变量:

#{battery_bar}:水平电池充电棒
#{battery_percentage}: 电池百分比
#{battery_status}:是电池充电还是放电?
#{battery_vbar}:垂直电池充电棒
#{circled_session_name}:圈出的会话号码,最多20个
#{hostname}:SSH / Mosh意识到主机名信息
#{hostname_ssh}:SSH / Mosh感知主机名信息,未通过SSH / Mosh连接到远程服务器时为空白
#{loadavg}:平均负载
#{pairing}:会话是否附加到多个客户端?
#{prefix}:前缀是否被压抑?
#{root}:是当前用户root?
#{synchronized}:窗格是否同步?
#{uptime_d}:正常运行时间
#{uptime_h}:正常运行时间
#{uptime_m}:正常运行时间
#{uptime_s}:正常运行时间秒
#{username}:SSH / Mosh知道用户名信息
#{username_ssh}:SSH感知用户名信息,未通过SSH / Mosh连接到远程服务器时为空白
除了上面提到的自定义变量之外,tmux_conf_theme_status_left和 tmux_conf_theme_status_right变量支持通常的tmux语法,例如使用 #()调用插入wttr.in提供的天气信息的外部命令 :

tmux_conf_theme_status_right='#{prefix}#{pairing}#{synchronized} #(curl wttr.in?format=3) , %R , %d %b | #{username}#{root} | #{hostname} '