@@ -3,17 +3,24 @@ title: 优雅地使用命令行:Tmux 终端复用
3
3
tags : Bash GNU Linux Node.js Session Tmux Vim 快捷键
4
4
---
5
5
6
- 你是否曾经开过一大堆的Terminal?有没有把它们都保存下来的冲动?Tmux 的Session就是做这件事情的!你可以随时退出或者进入任何一个Session。每个Session有若干个Window,每个Window又可以分成多个窗格(Pane)。
6
+ 你是否曾经开过一大堆的 Terminal?有没有把它们都保存下来的冲动?[ Tmux] [ tmux ] 的Session就是做这件事情的!
7
+ 你可以随时退出或者进入任何一个 Session。每个 Session 有若干个 Window,每个 Window 又可以分成多个窗格(Pane)。
8
+ 极大地满足 Terminal 用户的需求。
7
9
8
- > 即使iTerm /Terminal/Konsole意外关闭也没关系。Session可以完全恢复!但是关机就不可以了,不过你可以写脚本来恢复!
9
-
10
- Tmux是一个终端复用软件,BSD协议发布。一般用于在一个命令行窗口中访问多个命令行会话,或者在一个命令行终端中同时使用多个程序。Tmux用起来是怎样的呢?看图:
10
+ 此外即使 iTerm /Terminal/Konsole 意外关闭也没关系,因为 Session 完全保存在 Tmux Server 中。
11
+ 再次打开 Terminal 时只需 ` tmux attach ` 便可回到你的工作区,就像从未退出过一样。
12
+ 如果希望重启电脑后仍然生效,你可能需要 [ 动手写脚本 ] ( /2016/09/23/tmux-workspace-setup.html ) 或者 [ 使用插件 ] ( /2017/11/24/tmux-workspace-plugin.html ) 。
11
13
12
14
<!-- more-->
13
15
16
+ # 什么是 Tmux
17
+
18
+ [ Tmux] [ tmux ] 是一个 BSD 协议发布的终端复用软件,用来在服务器端托管同时运行的 Shell。那么 Tmux 用起来是怎样的呢?看图:
19
+
14
20
![ tmux screen shot] [ tmux-shot ]
15
21
16
- > Tmux 最经典的使用场景便是用 Tmux+Vim 来做一个IDE,其中Vim部分的配置过程记录在了[ 这里] [ vim-ide ] ,本文介绍Tmux的配置和使用。
22
+ Tmux 最经典的使用场景便是用 Tmux+Vim 来做一个IDE,其中Vim部分的配置过程记录在了[ 这里] [ vim-ide ] 。
23
+ 本文介绍Tmux的安装配置,以及常见问题的解决方式。
17
24
18
25
## iTerm 的窗格和 Tmux 有什么区别?
19
26
@@ -28,24 +35,17 @@ iTerm是一个GUI软件,它的窗格只是窗格而已!而Tmux是终端复
28
35
这两个都是做终端复用的,我在阿里云 ECS 上 [ 搭建Node.js API服务器] [ node-web ] 时用过 ` screen ` ,它是 GNU 软件,而 Tmux 是 BSD 的协议。
29
36
它们最主要的区别是 Tmux 支持 Vi/Emacs 风格的键盘映射,更好的接口和文档,以及更好的脚本控制。所以建议使用 Tmux!
30
37
31
- # 安装Tmux
38
+ # 安装使用
32
39
33
- ## OSX
34
-
35
- ``` bash
36
- brew install tmux
37
- ```
38
-
39
- ## Linux
40
+ 首先进行安装:
40
41
41
42
``` bash
43
+ brew install tmux # OSX
42
44
pacman -S tmux # archlinux
43
45
apt-get install tmux # Ubuntu
44
46
yum install tmux # Centos
45
47
```
46
48
47
- # 基本使用
48
-
49
49
安装好后就可以启用一个Tmux Session了:(通过 ` tmux new -s myname ` 可以指定Session名)
50
50
51
51
tmux
@@ -67,41 +67,24 @@ yum install tmux # Centos
67
67
unbind ^b
68
68
set -g prefix 'C-a'
69
69
70
+ ## 载入配置
71
+
70
72
为了能让Tmux动态载入配置而不是重启,我们设一个快捷键` <prefix>r ` 来重新载入配置:
71
73
72
74
bind r source-file ~/.tmux.conf \; display-message "Config reloaded"
73
75
74
76
> 注意,通过` <prefix>r ` 重新载入配置并不等同于重启,只是增量地执行了配置文件中的所有命令而已。如果配置未生效,可以通过` tmux kill-server ` 来强行关闭Tmux。
75
77
78
+ ## 导出配置
79
+
76
80
如果你想知道当前tmux的设置,可通过` tmux show -g ` 来查看(该命令需要tmux正在运行)。
77
81
你可能会需要把这些设置导出为文件:
78
82
79
83
``` bash
80
84
tmux show -g >> current.tmux.conf
81
85
```
82
86
83
- # 窗格切换
84
-
85
- 可以把` hjkl ` 设置为切换窗格的快捷键:
86
-
87
- bind h select-pane -L
88
- bind j select-pane -D
89
- bind k select-pane -U
90
- bind l select-pane -R
91
-
92
- 再给调整窗格大小设置快捷键:
93
-
94
- bind L resize-pane -L 10 # 向左扩展
95
- bind R resize-pane -R 10 # 向右扩展
96
- bind K resize-pane -U 5 # 向上扩展
97
- bind J resize-pane -D 5 # 向下扩展
98
-
99
- 我们发现当打开新窗格时Shell仍然在Home目录,可以设置为当前目录:
100
-
101
- bind '"' split-window -c '#{pane_current_path}'
102
- bind '%' split-window -h -c '#{pane_current_path}'
103
-
104
- # 拷贝
87
+ # 拷贝粘贴
105
88
106
89
在Tmux中通过` [ ` 进入拷贝模式,按下` <space> ` 开始拷贝。然后用Vim/Emacs快捷键选择文本,按下` <Enter> ` 拷贝所选内容。然后通过` ] ` 进行粘贴。
107
90
@@ -121,6 +104,53 @@ tmux show -g >> current.tmux.conf
121
104
122
105
> 旧版本中开始选择和复制选中快捷键绑定方式不同,请参考 < https://github.com/tmux/tmux/issues/592 >
123
106
107
+ # 快捷键
108
+
109
+ 下面列出了在 Tmux 中经常使用的快捷键,在下面给出的按键之前需要先按下 ` <prefix> ` ,
110
+ 如果你没有设置过它,默认是 ` Ctrl+b ` 。
111
+
112
+ ```
113
+ :new<CR> # 创建新的 Session,其中 : 是进入 Tmux 命令行的快捷键
114
+ s # 列出所有 Session,可通过 j, k, 回车切换
115
+ $ # 为当前 Session 命名
116
+ c # 创建 Window
117
+ <n> # 切换到第 n 个 Window
118
+ , # 为当前 Window 命名
119
+ % # 垂直切分 Pane
120
+ " # 水平切分 Pane
121
+ <space> # 切换 Pane 布局
122
+ d # detach,退出 Tmux Session,回到父级 Shell
123
+ t # 显示一个时钟,:)
124
+ ? # 快捷键帮助列表
125
+ ```
126
+
127
+ 在 Pane 之间切换,或者改变 Pane 大小,建议自己配置快捷键。比如把它配置成 Vim 风格:
128
+
129
+ ```
130
+ bind h select-pane -L # 切换到左边的 Pane
131
+ bind j select-pane -D # 切换到下边的 Pane
132
+ bind k select-pane -U # 切换到上边的 Pane
133
+ bind l select-pane -R # 切换到右边的 Pane
134
+ bind L resize-pane -L 10 # 向左扩展
135
+ bind R resize-pane -R 10 # 向右扩展
136
+ bind K resize-pane -U 5 # 向上扩展
137
+ bind J resize-pane -D 5 # 向下扩展
138
+ ```
139
+
140
+ > 完整的快捷键列表可以参考: < https://gist.github.com/MohamedAlaa/2961058 >
141
+
142
+ # Unicode 显示问题
143
+
144
+ Tmux 通过 ` LC_ALL ` , ` LC_CTYPE ` , ` LANG ` 环境变量来判断是否终端支持 UTF-8。
145
+ 这样的判断有时是不准确的,导致 Tmux 中无法显示 Unicode。解决思路有两个:
146
+
147
+ * 在启动 ` tmux ` 或 ` tmux attach ` 所在的 Shell 中添加 ` LC_ALL ` 环境变量。
148
+ * 启动 Tmux 时增加 ` -u ` 参数可以显式地通知 tmux 终端支持 UTF-8(` man tmux ` )。
149
+
150
+ ``` bash
151
+ tmux -u
152
+ ```
153
+
124
154
# 启用鼠标
125
155
126
156
Tmux 和 Vim 风格非常像,也可以设置鼠标模式。下面的设置开启了所有鼠标功能:
@@ -132,31 +162,30 @@ Tmux 和 Vim 风格非常像,也可以设置鼠标模式。下面的设置开
132
162
> 等4 个选项来开启所有鼠标功能,现在只需要设置 ` mouse` 选项了。
133
163
> 使用 ` tmux -V` 可以查看当前安装的 tmux 版本,版本更新日志见 [Tmux Changelog][changelog]。
134
164
135
- # 恢复用户空间
165
+ # Attach 到用户空间
136
166
137
- Tmux 中的 Shell 没有运行在 Mac 的 GUI Session 中,因此需要访问 GUI Session 内容时就会出错。
138
-
139
- 例如 ` open ` , ` sudo ` 等命令会有错误如下:
167
+ 有写童鞋会发现在 Tmux 中执行 ` open` , ` sudo` 等命令会有错误如下:
140
168
141
169
```
142
170
The window server could not be contacted. open must be run with a user logged in at the console, either as that user or as root.
143
171
```
144
172
145
- Vim [ 匿名寄存器] [ vim-registers ] 访问不到系统剪切板,粘贴时有错误如下 :
173
+ 或者 Vim [匿名寄存器][vim-registers] 也访问不到系统剪切板,比如粘贴时报错 :
146
174
147
175
```
148
176
Nothing in register *
149
177
```
150
178
151
- 为了解决这些问题,可以使用 ChrisJohnsen 提供的 [ ` reattach-to-user-namespace ` ] [ reattach ] 工具,
152
- 在 Tmux 中启动 Shell 时立即挂载到 GUI Session 中。首先安装这一工具:
179
+ 这是因为 Tmux 中的 Shell 没有运行在 Mac 的 GUI Session 中,
180
+ 可以使用 [`reattach-to-user-namespace`][reattach] 工具来进行 Attach。
181
+ 首先安装这一工具:
153
182
154
183
```bash
155
184
brew update
156
- brew upgrade reattach-to-user-namespace
185
+ brew install reattach-to-user-namespace
157
186
```
158
187
159
- 然后在` .tmux.conf ` 中添加启动命令 :
188
+ 然后在 ` .tmux.conf ` 中配置默认命令 :
160
189
161
190
```
162
191
set -g default-command "reattach-to-user-namespace -l /usr/local/bin/zsh"
@@ -165,68 +194,23 @@ set -g default-command "reattach-to-user-namespace -l /usr/local/bin/zsh"
165
194
> 这里的 ` /usr/local/bin/zsh ` 要对应于你的默认 Shell 的路径,如果你没做过手脚的话,应该在` /usr/bin/bash ` 。
166
195
> 可以通过 ` echo $SHELL ` 查看当前 Shell 的路径。
167
196
168
- # 快捷键
169
-
170
- ## Sessions
171
-
172
- :new<CR> new session
173
- s list sessions
174
- $ name session
175
-
176
- > ` :new -s <session-name> ` 可以指定新 Session 的名字。
177
-
178
- ## Windows (tabs)
179
-
180
- c create window
181
- w list windows
182
- n next window
183
- p previous window
184
- f find window
185
- , name window
186
- & kill window
187
-
188
- ## Panes (splits)
189
-
190
- % vertical split
191
- " horizontal split
192
-
193
- o swap panes
194
- q show pane numbers
195
- x kill pane
196
- + break pane into window (e.g. to select text by mouse to copy)
197
- - restore pane from window
198
- ⍽ space - toggle between layouts
199
- <prefix> q (Show pane numbers, when the numbers show up type the key to goto that pane)
200
- <prefix> { (Move the current pane left)
201
- <prefix> } (Move the current pane right)
202
- <prefix> z toggle pane zoom
203
-
204
- ## Misc
205
-
206
- d detach
207
- t big clock
208
- ? list shortcuts
209
- : prompt
210
-
211
- # Unicode 显示问题
212
-
213
- Tmux 通过 ` LC_ALL ` , ` LC_CTYPE ` , ` LANG ` 环境变量来判断是否终端支持 UTF-8。
214
- 这样的判断有时是不准确的,导致 Tmux 中无法显示 Unicode。解决思路有两个:
215
-
216
- * 在启动 ` tmux ` 或 ` tmux attach ` 所在的 Shell 中添加 ` LC_ALL ` 环境变量。
217
- * 启动 Tmux 时增加 ` -u ` 参数可以显式地通知 tmux 终端支持 UTF-8(` man tmux ` )。
218
-
219
- ``` bash
220
- tmux -u
221
- ```
222
-
223
- # Session 丢失问题
197
+ # Session 偶尔丢失
224
198
225
199
Tmux 中 Session 或 Window 丢失可能的原因有很多,需要仔细排查。检查 ` tmux ` 日志,以及检查 [ Shell 的各级配置] [ shell ] 。
226
200
227
201
* 比如 Shell 的 ` TMOUT ` 环境变量会让超时后的 Shell 自动退出,最终导致 Session 关闭。
228
202
* 比如临时文件夹被清空导致 socket 丢失,参考:< https://community.webfaction.com/questions/9462/tmux-session-lost-in-unknown-pts-cause-and-possible-solution >
229
203
204
+ ## 新 Shell 的工作目录
205
+
206
+ 我们发现当打开新窗格时 Shell 仍然在Home目录。
207
+ 这是 Tmux 的默认行为,可以在配置文件中设置为当前 Shell 所在目录:
208
+
209
+ ```
210
+ bind '"' split-window -c '#{pane_current_path}'
211
+ bind '%' split-window -h -c '#{pane_current_path}'
212
+ ```
213
+
230
214
# 扩展阅读
231
215
232
216
* TMUX 与 Screen 的区别:< http://unix.stackexchange.com/questions/549/tmux-vs-gnu-screen >
@@ -244,3 +228,4 @@ Tmux 中 Session 或 Window 丢失可能的原因有很多,需要仔细排查
244
228
[ vim-registers ] : /2016/07/25/vim-registers.html
245
229
[ reattach ] : https://github.com/ChrisJohnsen/tmux-MacOSX-pasteboard
246
230
[ shell ] : /2016/06/08/shell-config-files.html
231
+ [ tmux ] : https://wiki.archlinux.org/index.php/tmux
0 commit comments