终端复用神器——tmux

tmux

tmux是一个能够实现会话复用和分屏显示的终端工具。类似的终端复用器还有 GNU Screen,Tmux 与它功能相似,但是更强大易用。使用tmux需要掌握三个概念:session、window、pane,三者依次包含,和vim的buffer、window概念类似。

谈谈个人对着三个层级的理解:

  1. session的职责是确保会话复用,比如每次远程连上开发机退出后,下次登入无法获得同样的工作环境,这个问题通过session来解决,不同的用户可能使用不同的环境,因此需要多个session;
  2. window的定位可能只是为同一个session提供多套工作环境,有点类似于虚拟桌面;
  3. pane的职责是分屏显示,保证一个屏幕中能够同时使用多个终端界面。

tmux常用的控制命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看当前所有session
$ tmux ls
$ tmux list-session

# 新建session
$ tmux new -s <session-name> # 推荐显式指定
$ tmux # 自动创建一个编号递增的session

# 重新接入某个已存在的session
$ tmux attach -t 0 # 使用会话编号
$ tmux attach -t <session-name> # 使用会话名称

# 删除某个session
$ tmux kill-session -t 0 # 使用会话编号
$ tmux kill-session -t <session-name> # 使用会话名称

# 重命名session
$ tmux rename-session -t 0 <new-name> # 将0号会话重命名

tmux常用的快捷键。注意,快捷键只是对常用命令的一个提炼,更多的命令可以通过命令输入栏来使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<c-b> ?  # 查看帮助(方向键移动,q退出)
<c-b> s # 从列表中选取session
<c-b> w # 从列表中选取window
<c-b> : # 打开命令输入栏,用来输入命令
<c-b> d # 退出

<c-b> $ # 重命名当前session
<c-b> $ ( | <c-b> $ ) # 切换到前/后一个session

<c-b> c # 创建一个新的window
<c-b> & # 删除当前window
<c-b> 0-9 # 根据window id切换不同window
<c-b> p # 切换到前一个window
<c-b> n # 切换到后一个window

<c-b> % # 水平分割当前window为两个pane
<c-b> " # 垂直分割当前window为两个pane
<c-b> 方向键 # 在当前window的多个pane中选择
<c-b> x # 删除当前选中的pane
<c-b> c-方向键 # 调整当前pane的尺寸
<c-b> { | <c-b> } # 交换前后两个pane的位置

一点小配置

1
2
3
4
# jyy config
bind-key c new-window -c "#{pane_current_path}"
bind-key % split-window -h -c "#{pane_current_path}"
bind-key '"' split-window -c "#{pane_current_path}"

⭐️在命令模式中执行:set -g mouse on # 开启全局的鼠标支持,但是对于选中文本复制会有影响,这里选择不启用。但是如果需要查看历史输出信息的话,还是打开更好用一些,打开后可以触控板滚动屏幕,否则需要通过如下方式:

  1. Control+B
  2. [
  3. Arrows keys or Shift+Page up/down
  4. Control+C when done with scrollback

上述原生的方法太麻烦了,通过tmux-yank插件来解决,在安装yank插件之前,额外推荐一下tmux的插件管理工具 tpm,安装方法见官网,非常简单,以后只需要将需要的插件列表添加到配置文件中,然后 prefix+I 即可安装新的插件,prefix+U 即可实现插件更新。

安装好tpm后,将下面的配置追加到 ~/.tmux.conf ,然后执行 prefix+Itmux source ~/.tmux.conf 完成插件安装和配置,此后鼠标选中tmux中的文本后会自动复制到剪贴板。详细步骤可参见Copy and Paste in tmux,里面介绍了更多更能,这里我只选择了自己喜欢的部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
set -g mouse on

# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'github_username/plugin_name#branch'
# set -g @plugin 'git@github.com:user/plugin'
# set -g @plugin 'git@bitbucket.com:user/plugin'

# plugin for text copy in mouse mode
set -g @plugin 'tmux-plugins/tmux-yank'
# set -g @yank_action 'copy-pipe-no-clear'
# bind -T copy-mode C-c send -X copy-pipe-no-clear "xsel -i --clipboard"


# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

参考博客:


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!