Tmux是一个优秀的终端复用软件,使用它最直观的好处就是通过一个终端登录远程主机并运行tmux后,可以通过tmux开启多个控制台而无需再开多余的终端来连接这台远程主机。如下所示
另外使用tmux的一个主要原因是它提供了一个窗体组随时存储和恢复的功能,即使 iTerm/Terminal/Konsole 意外关闭也没关系,因为 Session 完全保存在 Tmux Server 中。这个功能适用于如下场景:比如服务器开了一堆vim和log打印窗口,结果到下班时间了,然后回家之后想要继续debug或者coding。那么请使用tmux。
假如说选择tmux还有另外一个原因的话,那就是tmux支持自定义配置。
1. 安装
本次tmux安装的环境为Ubuntu 16.04,采用如下命令即可完成安装。
$ sudo apt-get install tmux
使用tmux,输入tmux
即可使用。
2. 基本概念
下面来理解一下tmux的几个元素,tmux的主要元素分为三层:
- Session。一组window的集合,通常用来概括一个任务。session可以有自己的名字用于标识。
- Window。单个可见窗口,window有自己的编号。
- Pane。window又可以被划分成一个个小窗口,称为pane。
整个元素的框图如下所示
对应实际的情况如下所示(默认情况下,不修改任何配置)
- task1为该session的名字。
- 该session有3个window,分别编号0、1、2。*标注在当前正在使用的window。
- 当前的window又被分成了3个pane。
3. 基本操作
下文中的prefix是指前置操作,tmux默认的前置操作是ctrl +b
。例如想要断开当前session,先需要摁下ctrl+b
,松开之后再摁下d
。前置操作的快捷键可以通过修改配置文件来改变,下文将会提到。
3.1. 关于Session的操作
在terminal中输入的关于session的操作如下
功能 | 操作 |
---|---|
启动新的session | tmux [new -s 会话名 -n 窗口名] |
查看session,当前正常运作中的tmux server都会显示 | tmux ls |
重新连接session,这里的a是attach的意思。如果只有一个session的话,使用tmux a即可 | tmux a [-t 会话名] |
删除session | tmux kill-session -t 会话名 |
重命名session | tmux rename -t 旧会话名 新会话名 |
在tmux状态下关于session的操作如下
功能 | 操作 |
---|---|
重命名当前Session | prefix + $ |
断开一个session。这种方式断开会将session保存下来,之后可重新打开,有别于下面的"exit"方式 | prefix + d |
查看/切换session | prefix + s |
启动新会话 | prefix + :new(先进入命令行输入状态,再键入new) |
上述tmux状态是指输入
tmux
命令之后会进入的,terminal就是原生的终端。上面的那张示意图就是在tmux状态下。
3.2. 关于Window的操作
功能 | 操作 |
---|---|
创建一个新的window。最下面会多出window的编号。有*号所在的window就是当前正在操作的window | prefix + c |
在不同的window间切换。直接输入需要进入的window的数字编号即可 | prefix + 窗口号 |
后一个window | prefix + n |
前一个window | prefix + p |
关闭当前window | prefix + & |
重命名window | prefix + , (逗号) |
列出所有的窗口 | prefix + w |
切换到上一个活动的窗口 | prefix + space |
3.3. 关于Pane的操作
功能 | 操作 |
---|---|
水平分割pane | prefix + % |
竖直分割pane | prefix + " |
切换pane | prefix + o |
在pane之间switch,之后会有设置的方法来用鼠标选择pane | prefix + 上下左右的箭头 |
把光标所在的pane全屏显示。回到之前的多pane状态的话,只需要重复该操作即可。 | prefix + z |
改变pane size。与上面命令不同的是,prefix按完之后,不要松开ctrl,一直按着,然后再按箭头来调整。 | prefix + (ctrl)+上下左右箭头 |
显示每个pane的编号,当数字出现的时候按数字几就切换到第几个pane | prefix + q |
与上一个pane交换位置,如当前pane编号为2,那么将与1进行交换 | prefix + { |
与下一个pane交换位置 | prefix + } |
退出一个pane | shell里输入“exit”命令 |
让一个window中的pane进行同步 | prefix + :setw synchronize-panes(先进入命令行输入状态,在键入命令) |
上述的exit命令可以退出Pane。当window中只有一个pane的时候,键入
exit
命令退出该window。同理,当session中只有一个window,该window只有一个pane时,键入exit
将会退出session,该方式退出的session将不可恢复,因为你pane都exit完了。
Ctrl - d
效果是一样的。
3.4. 复制粘贴
- tmux模式中的复制粘贴
按下prefix+[
后光标所处的pane进入文本复制模式,可以使用方向键在屏幕中移动光标。默认情况下是使用emacs快捷键选择文本的,但是博主习惯性使用vim快捷键方式。所以先在tmux.conf文件中写入这样的配置
setw -g mode-keys vi # Vi风格选择文本
更新配置后,在文本复制模式下按下space
开始拷贝,通过方向键或者vim快捷键方式选择文本。按下Enter
键拷贝所选内容。然后通过prefix + ]
进行粘贴。在启用vi模式之后,可以辅助一些别的快捷键高效工作。整理如下:
功能 | vi操作 |
---|---|
反缩进 | ^ |
清除选定内容 | Escape |
复制选定内容 | Enter |
光标下移 | j |
光标左移 | h |
光标右移 | l |
光标移到尾行 | L |
光标移到中间行 | M |
光标移到首行 | H |
光标上移 | k |
删除整行 | d |
删除到行末 | D |
移到行尾 | $ |
前往指定行 | : |
向下滚动半屏 | C-d |
向上滚动半屏 | C-u |
下一页 | C-f |
下一个词 | w |
粘贴 | p |
上一页 | C-b |
上一个词 | b |
退出 | q |
向下翻 | J or C-Down |
向上翻 | K or C-Up |
继续搜索 | n |
向前搜索 | ? |
向后搜索 | / |
移到行首 | 0 |
开始选中 | Space |
当然使用鼠标模式之后就可以使用鼠标来选取复制文本了,鼠标选中的内容都会被拷贝。但是通过这种方式拷贝的内容只能通过prefix + ]
进行粘贴,相当于拷贝的内容没有同步到系统的剪切板中。
假如想要更符合vi风格,可以参考:https://harttle.land/2015/11/06/tmux-startup.html
- 鼠标操作
这种方式与上述方式不同,这种方式是terminal界面的内容拷贝,拷贝的内容将会到剪切板中。按住 shift
,鼠标左键选择文本,后右键点击,选择“复制”,注意全程按住 shift
。但是这种方法可能存在如下问题,在复制左边pane内容的时候,右边pane的内容也会被复制,如下所示
那么可以换成按住shift+alt
来进行复制。
3.5. 其他使用
功能 | 操作 |
---|---|
窗口中央显示一个数字时钟,按enter退出显示 | prefix + t |
列出所有快捷键 | prefix + ? |
进入命令输入状态 | prefix + : |
查看当前tmux的配置 | tmux show -g |
4. 个性化定制
默认的tmux风格比较朴素,快捷键方式也有点不太人性化。但是可以通过修改tmux的配置文件来实现个性化定制,tmux在新建session的时候,会去找tmux.conf文件。tmux配置文件位于~/.tmux.conf
,如果没有的话就创建一个touch ~/.tmux.conf
。下面列举一些常用的配置
prefix更改为Ctrl-a
# Setting the prefix from C-b to C-a
set -g prefix C-a
# Free the original Ctrl-b prefix keybinding
unbind C-b
# Setting the delay between prefix and command
set -s escape-time 1
# Ensure that we can send Ctrl-a to other apps
bind C-a send-prefix
使用shift + 箭头来进行window切换
# Shift arrow to switch windows
bind -n S-Left previous-window
bind -n S-Right next-window
split pane快捷键修改为|和-
# Splitting panes replace % and "
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %
pane切换快捷键增加/更改
# moving between panes using hjkl
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
# switch panes using Alt-arrow without prefix
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
resize pane快捷键增加,prefix+HJKL(先按prefix,按完之后不断按HJKL)即可修改pane size
# Pane resizing
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5
快捷键方式更新配置,使得无需重启就可以让配置生效。这是因为tmux只有在新建session的时候,才会去找tmux.conf文件,那么已经创建的session使用的还是之前的tmux.conf文件。
# Reload the file with Prefix r
bind r source-file ~/.tmux.conf \; display "Reloaded!"
启动鼠标功能,也就意味着可以鼠标改变pane size,鼠标选择pane、window等
# Mouse support
# setw -g mode-mouse on
# set -g mouse-select-pane off
# set -g mouse-resize-pane off
# set -g mouse-select-window off
# incompatible since tmux 2.1
set -g mouse on
2.1 之前的版本(发布于 2015.10.18) 需要设置
mode-mouse
,mouse-select-pane
,mouse-resize-pane
,mouse-select-window
等4 个选项来开启所有鼠标功能,现在只需要设置mouse
选项了。 使用tmux -V
可以查看当前安装的 tmux 版本。
新split 出来的pane的工作目录在默认情况下跟创建该session时的工作目录是一样的,下面将其修改为当前pane的工作目录
bind '"' split-window -c '#{pane_current_path}'
bind '%' split-window -h -c '#{pane_current_path}'
博主自己在使用的.tmux.conf
对tmux默认的主题颜色配置进行了修改,也修改了一些快捷键。可以通过这个链接获取:https://gist.github.com/DawnGuoDev/f44eca4f9c34d7d62571b83d3e391583 。参考的配置文件为https://gist.github.com/terrywang/3950393 。
5. 总结
- Tmux给的快捷键很多,上述列出都是常用的。你可以通过
prefix + ?
来查看所有快键键,也可以查看这个网址:https://tmuxcheatsheet.com/ 。 - 通过上面的内容即可基本掌握tmux的使用,按照上述的配置内容也可以基本配置出符合自己的个性化配置。
- 写教程不仅仅是为了给别人看,更多是为了让自己更加全面的了解这个工具,也让自己对这个工具中的细节内容更加明白。同时也让自己之后的使用有一份不错的文档。真的是不整理不知道,一整理才发现自己之前的使用方式都不算正宗的tmux使用。
6. 参考资料
Tmux快捷键速查表:https://tmuxcheatsheet.com/
Tmux 快捷键 & 速查表 & 简明教程(PS:推荐,挺不错的总结):https://gist.github.com/ryerh/14b7c24dfd623ef8edc7
tmux简洁教程及config关键配置(PS:比较好懂的tmux教程):https://www.jianshu.com/p/fd3bbdba9dc9
优雅地使用命令行:Tmux 终端复用(PS:比较偏进阶):https://harttle.land/2015/11/06/tmux-startup.html