目录

Tmux使用教程+配置文件更改

Tmux是一个优秀的终端复用软件,使用它最直观的好处就是通过一个终端登录远程主机并运行tmux后,可以通过tmux开启多个控制台而无需再开多余的终端来连接这台远程主机。如下所示

https://img.dawnguo.cn/Linux/tmux/0.jpg

另外使用tmux的一个主要原因是它提供了一个窗体组随时存储和恢复的功能,即使 iTerm/Terminal/Konsole 意外关闭也没关系,因为 Session 完全保存在 Tmux Server 中。这个功能适用于如下场景:比如服务器开了一堆vim和log打印窗口,结果到下班时间了,然后回家之后想要继续debug或者coding。那么请使用tmux。

假如说选择tmux还有另外一个原因的话,那就是tmux支持自定义配置。

1. 安装

本次tmux安装的环境为Ubuntu 16.04,采用如下命令即可完成安装。

1
$ sudo apt-get install tmux

使用tmux,输入tmux即可使用。

2. 基本概念

下面来理解一下tmux的几个元素,tmux的主要元素分为三层:

  • Session。一组window的集合,通常用来概括一个任务。session可以有自己的名字用于标识。
  • Window。单个可见窗口,window有自己的编号。
  • Pane。window又可以被划分成一个个小窗口,称为pane。

整个元素的框图如下所示

https://img.dawnguo.cn/Linux/tmux/1.png

对应实际的情况如下所示(默认情况下,不修改任何配置)

https://img.dawnguo.cn/Linux/tmux/2.jpg

  • 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文件中写入这样的配置

1
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的内容也会被复制,如下所示

https://img.dawnguo.cn/Linux/tmux/3.jpg

那么可以换成按住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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 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切换

1
2
3
# Shift arrow to switch windows
bind -n S-Left previous-window
bind -n S-Right next-window

split pane快捷键修改为|和-

1
2
3
4
5
# Splitting panes replace % and "
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %

pane切换快捷键增加/更改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 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

1
2
3
4
5
# 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文件。

1
2
# Reload the file with Prefix r
bind r source-file ~/.tmux.conf \; display "Reloaded!"

启动鼠标功能,也就意味着可以鼠标改变pane size,鼠标选择pane、window等

1
2
3
4
5
6
7
# 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的工作目录

1
2
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