Linux 下 tmux 基础配置:鼠标、状态栏、vi 复制与系统剪贴板

整理一份适合日常服务器使用的 tmux 配置,包含窗口编号、状态栏、vi 复制模式、系统剪贴板透传、鼠标复制取舍和配置热重载。

tmux 适合长期 SSH 到服务器、在一个终端里同时维护多个任务的场景。它可以把会话、窗口和面板留在远端,即使本地终端断开,重新登录后也能接着原来的工作现场继续。

下面这份配置偏向日常使用:关闭 tmux 自己的鼠标接管,让外部终端继续负责鼠标选中复制;窗口和面板从 1 开始编号,状态栏保持简洁,复制模式使用 vi 键位,并尽量把复制内容同步到系统剪贴板。

写入配置文件

编辑 ~/.tmux.conf

nvim ~/.tmux.conf

如果没有安装 nvim,也可以使用 vimnano

写入下面这份配置:

# --- 基础设置 ---
set -g mouse off
set -g base-index 1
set -g pane-base-index 1
set -g renumber-windows on

# --- 状态栏美化(通用无乱码版) ---
set -g status-style "bg=#282c34,fg=#abb2bf"
set -g status-left-length 30
set -g status-left "#[bg=#61afef,fg=#282c34,bold] #S #[bg=default,fg=#61afef] "

# 1. 开启 vi 风格的复制模式
setw -g mode-keys vi

# 2. 绑定 y 键为复制(并同步到系统剪贴板)
# 注意:tmux 3.2+ 版本配合 set-clipboard on 效果最佳
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel

# 3. 确保开启剪贴板透传支持
set -s set-clipboard on

# 颜色与转义支持(至关重要)
set -g default-terminal "xterm-256color"
set-option -ga terminal-overrides ",xterm-256color:Tc"

# tmux 重新读取配置文件:Ctrl+a,然后按 r
bind r source-file ~/.tmux.conf \; display-message "Config reloaded!"

# --- 快捷键优化 ---
# 把前缀键从 Ctrl+b 改成 Ctrl+a
unbind C-b
set -g prefix C-a
bind C-a send-prefix

# 绑定 Ctrl+a 后接 Ctrl+l:发送清屏指令给 Shell,并清空 tmux 当前 pane 的历史记录
bind C-l send-keys C-l \; clear-history \; display-message "Screen and scrollback buffer cleared!"

如果你更习惯 tmux 默认的 Ctrl+b,可以删掉“快捷键优化”中的这几行:

unbind C-b
set -g prefix C-a
bind C-a send-prefix

让配置立即生效

已经在 tmux 里面时,可以直接执行:

tmux source-file ~/.tmux.conf

也可以按:

Ctrl+a,然后按 r

注意 Command + K 是 iTerm2 终端模拟器层面的强制清除缓冲区(Clear Buffer)操作。它会直接擦除当前屏幕上的所有显示内容,包括 tmux 正在渲染的状态栏。由于该操作发生在 tmux 外部,tmux 进程并未感知到界面已被破坏,因此不会主动触发重绘,导致状态栏“消失”。

如何恢复状态栏

只需触发 tmux 的界面重绘机制即可让状态栏重新显示:

  1. 调整窗口大小(最快):用鼠标稍微拖拽边缘改变一下 iTerm2 窗口的大小,tmux 会感知到尺寸变化并立刻重新绘制所有界面。
  2. 执行重绘命令:按下前缀键 Ctrl + a,然后按冒号 : 进入命令输入模式,输入 refresh-client 并回车。

正确的清屏步骤与方法

在 tmux 环境中工作时,应**避免使用终端自带的 Command + K**。请使用以下 Shell 层级的操作,它们只会清空命令行的输出内容,不会破坏 tmux 自身的 UI 框架:

  1. **按 Ctrl + L**(标准 POSIX 终端清屏快捷键,最推荐)。
  2. 输入 clear 命令并回车。

进阶配置:在 tmux 中实现安全的“深度清屏”

如果你使用 Command + K 的目的是为了彻底清空屏幕以及向上的历史输出记录,建议在你的 ~/.tmux.conf 中追加以下配置,将这个动作交给 tmux 内部处理:

# 绑定 Ctrl+a 后接 Ctrl+l:发送清屏指令给 Shell,并清空 tmux 当前 pane 的历史记录
bind C-l send-keys C-l \; clear-history \; display-message "Screen and scrollback buffer cleared!"

添加后,按 Ctrl + a 再按 r 重载配置。以后需要深度清屏时,按下 Ctrl + a 后按 Ctrl + l 即可,状态栏将安然无恙。

如果是第一次启动 tmux,直接新建会话即可:

tmux new -s main

以后重新进入这个会话:

tmux attach -t main

常用操作

配置里的前缀键已经改成 Ctrl+a,所以后续操作都先按 Ctrl+a,松开后再按对应按键。

Ctrl+a c      新建窗口
Ctrl+a ,      重命名当前窗口
Ctrl+a n      切到下一个窗口
Ctrl+a p      切到上一个窗口
Ctrl+a %      左右分屏
Ctrl+a "      上下分屏
Ctrl+a x      关闭当前面板
Ctrl+a d      断开当前会话,任务继续留在后台
Ctrl+a r      重新加载 ~/.tmux.conf

进入复制模式:

Ctrl+a [

在复制模式中:

h/j/k/l       移动光标
Space         开始选择
y             复制选区并退出复制模式
q             退出复制模式

y 键复制到底有什么用

如果你用鼠标选中终端内容,然后按 Ctrl+cCmd+c 可以成功复制,主要是因为配置里使用了:

set -g mouse off

在这个状态下,鼠标操作不会被 tmux 接管,而是由外部终端模拟器处理,例如 Windows Terminal、iTerm2、WezTerm 或 Kitty。也就是说,鼠标选中和复制走的是终端自己的复制机制,基本绕过了 tmux。

配置里的 y 键绑定处理的是另一件事:它只在 tmux 的复制模式中生效,用来把 tmux 内部选中的内容复制出去。

纯键盘复制的步骤如下:

Ctrl+a [      进入复制模式
h/j/k/l       移动光标,也可以使用方向键
Ctrl+u        向上翻页查看历史输出,PageUp 也可以
Space         从当前光标位置开始选择
h/j/k/l       移动光标,扩大或缩小选区
y             复制选区,并自动退出复制模式

因为配置里同时开启了:

set -s set-clipboard on

所以在终端支持 OSC 52 剪贴板透传的情况下,按 y 后选中的内容会被发送到系统剪贴板。简单说,鼠标选中加 Ctrl+c 适合复制当前屏幕里的一小段内容;tmux 复制模式加 y 更适合纯键盘操作,尤其是在需要向上翻历史日志、精确选择多行输出时使用。

这两个方式并不冲突。鼠标复制负责快,y 键负责稳,保留这条绑定是有意义的。

关于系统剪贴板

set -s set-clipboard on 依赖终端对 OSC 52 剪贴板透传的支持。常见的 iTerm2、WezTerm、Windows Terminal、较新的 Kitty 等终端通常可以配合使用;如果复制后没有进入本机剪贴板,优先检查本地终端是否允许应用访问剪贴板。

在远程 SSH 场景下,tmux 自己只负责发出剪贴板序列,最终能不能写入本机剪贴板,取决于本地终端、SSH 链路和外层终端复用器是否放行 OSC 52。

快速检查

确认当前 tmux 版本:

tmux -V

确认配置文件能被正常读取:

tmux source-file ~/.tmux.conf

如果没有报错,再进入复制模式试一下选区复制即可。对于长期使用 SSH 的服务器,这份配置已经足够轻量,也不会绑定太多个人习惯,后续可以在它的基础上继续加插件、主题或更细的面板快捷键。