Tmux 名字取自“Terminal Multiplexer”,读作“T-马克思”,是一个能够终端窗口中提供多终端会话管理的应用,它可以在后台保持多个终端会话的运行,并在合适的时候 attach 或者 detach 会话,以达到保持和切换会话的作用。
Tmux 的竞争对手有 GNU Screen,我没有过 Screen 的使用经验,但是根据搜索的结果 BSD 协议的 Tmux 似乎要更加自由和强大。
Prefix+[
进入复制模式时就会遇到选择缓冲区和剪贴板缓冲区。如果你用过 Vim 之类的编辑器肯定不会对 Pane 概念感到陌生,Tmux 也支持类似的概念,支持横向和纵向切割面板功能。
功能 | 命令 |
---|---|
水平切割(上下两半) | Prefix + " |
竖直切割(左右) | Prefix + % |
调整面板宽度/高度 | Prefix - 方向键 |
窗口的层级要高于面板,作用类似于标签页,默认会在终端的底部显示窗口列表。
功能 | 命令 |
---|---|
创建新窗口 | Prefix + c |
重命名窗口 | Prefix + $ |
切换到某个窗口 | Prefix + 窗口 ID |
会话的层级更高于窗口,在终端输入 tmux
会创建并进入一个新的会话,你可以使用会话来区分
使用者或者任务。
功能 | 命令 |
---|---|
创建并进入新会话 | tmux |
进入未关闭的会话 | tmux attach 会话名 |
退出但保留当前会话 | Prefix + d |
列出所有会话 | Prefix + s |
重命名当前会话 | Prefix + $ |
Tmux 使用 Prefix 以将自身的快捷键与其它应用区分,运行 Tmux 快捷键时首先按下这个 Prefix(默认是 Ctrl-b
组合键),松手后紧接着按下对应操作的快捷键。
比如,如果我想要列出所有的 Tmux 会话(对应快捷键是 s
)需要这样:
Ctrl-b
组合键(默认 Prefix );Ctrl-b
;s
键。Tmux 配置文件的默认地址是 ~/.tmux.conf
,每次启动 Tmux 时都会加载该文件。
Tmux 的配置未见位置是 ~/.tmux.conf
,修改 Tmux Prefix 首先需要取消绑定原有的的 Prefix ;
再设置新的 Prefix,这里以 Ctrl-w
为例:
unbind C-b
set -g prefix C-w
Tmux 基本操作是以 Prefix + 操作
的方式进行的,比如 Prefix+c
会创建一个新的窗口,或者 Prefix+:
进入命令模式直接输入命令。大体可以分为:
tmux new -s 会话名
tmux ls
tmux attach -t 会话名
tmux detach
Prefix + c
Prefix + 窗口 ID
Prefix + $
Prefix + &
Prefix + "
Prefix + %
Prefix + 方向键
Prefix + x
Prefix + 方向键
Prefix + r
Prefix + ?
Prefix + s
Prefix + I
Prefix + u
Prefix + !
Prefix + space
更多操作可以参考 Tmux CheatSheet。
Tmux 快捷键绑定的命令是 bind 快捷键 作用
,即可将“作用”绑定在 Prefix +快捷键
上,
下面这行配置会将“重新加载”配置文件的操作绑定在快捷键 R
上:
bind R source-file ~/.tmux.conf \; display-message "Config reloaded..."
你需要添加以下配置:
#(进入复制模式后)输入 'v' 开始选择
bind-key -t vi-copy v begin-selection
# 将选中文字添加到系统的剪贴板中
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
tmux 有个特性,不管多少人连进同一个 tmux 会话,他们看到和操作的都是同一个东西,会话的长宽取决于输出的长款的最小值,因此可以用来进行结对编程练习。如果你想要临时和别人一起使用 tmux,可以使用 tmate 来创建共享会话:
首先你需要安装 Tmate:
brew install tmate
Ubuntu:
sudo apt-get install software-properties-common && \
sudo add-apt-repository ppa:tmate.io/archive && \
sudo apt-get update && \
sudo apt-get install tmate
输入 tmate
将会创建一个公开的远程会话(会话的底部会出现提示“[tmate] Remote session: ssh [some hash]@ny.tmate.io”),将 ssh 的地址发送给你的朋友就可以分享你的会话了!
如果你跟我一样使用 Vim 作为编辑器,可能同样会遇到输出黑块的问题。解决方案是在 Vim 的配置文件中加入:
if exists('$TMUX')
set term=screen-256color
endif
在 Tmux 中遇到 Vim 主题颜色问题也可以在 .tmux.conf
配置中加入:
# set -g default-terminal "screen-256color"
set-option -sa terminal-overrides ",xterm*:Tc"
推荐一些主题:
关闭 Tmux 会话所在 Terminal 窗口时不会自动关闭会话,可以在新窗口中使用 tmux attach
命令恢复会话。
推荐使用 TPM(Tmux Plugin Manager)来管理插件,TMP 的安装方法见 https://github.com/tmux-plugins/tpm#installation 。
# 配置 Vim 颜色兼容
set-option -sa terminal-overrides ",xterm*:Tc"
# 配置鼠标控制,可能需要 terminal 支持
set -g mouse on
# 插件,默认是从 GitHub 寻找对应 repo
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'catppuccin/tmux'
set -g @plugin 'christoomey/vim-tmux-navigator'
# 控制区管理插件
set -g @plugin 'tmux-plugins/tmux-yank'
# set vi-mode
set-window-option -g mode-keys vi
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# 窗口切换快捷键
bind-key -n C-H previous-window
bind-key -n C-L next-window
# 设置窗口从 1 开始而不是默认的 0,这样就可以使用 1-9 来切换窗口了,0 离其它键太远了
set -g base-index 1
set -g pane-base-index 1
set-window-option -g pane-base-index 1
# 新建窗口时设置为当前目录
bind '"' split-window -v -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
也可以试试 Oh My Tmux! 这个开箱即用的方案,或者仅作为个人配置的参考。