Productivity · #productivity#tmux#terminal

Tmux高效终端管理

2025.11.05 7 min 2.9k
// 目录 · contents

前言

Tmux(Terminal Multiplexer)是终端复用器,允许在一个终端窗口中运行多个终端会话。它的核心价值在于:会话持久化(SSH断开后任务继续运行)、窗口管理(多面板分屏)和高效的键盘操作。本文将从基础到高级,系统介绍Tmux的使用和配置。

核心概念

graph TB
    SERVER[Tmux Server] --> S1[Session 1: dev]
    SERVER --> S2[Session 2: ops]

    S1 --> W1[Window 1: editor]
    S1 --> W2[Window 2: terminal]
    S1 --> W3[Window 3: logs]

    W1 --> P1[Pane 1: vim]
    W1 --> P2[Pane 2: file tree]
    W2 --> P3[Pane 3: shell]
    W2 --> P4[Pane 4: shell]

    style SERVER fill:#1976d2,color:#fff
    style S1 fill:#388e3c,color:#fff
    style S2 fill:#388e3c,color:#fff
    style W1 fill:#f57c00,color:#fff
  • Server:后台进程,管理所有会话
  • Session:一组窗口的集合,代表一个工作环境
  • Window:会话中的标签页,占满整个终端
  • Pane:窗口中的分屏面板

基础操作

所有Tmux命令以前缀键(默认Ctrl+b)开始,下文记为<prefix>

Session管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建会话
tmux new -s dev # 创建名为dev的会话
tmux new -s ops -d # 创建但不进入(后台)

# 列出会话
tmux ls

# 连接会话
tmux attach -t dev # 连接到dev会话
tmux a -t dev # 简写

# 在tmux中
# <prefix> d - 分离(detach)当前会话
# <prefix> s - 选择会话列表
# <prefix> $ - 重命名当前会话
# <prefix> ( - 切换到上一个会话
# <prefix> ) - 切换到下一个会话

# 关闭会话
tmux kill-session -t dev
tmux kill-server # 关闭所有会话

Window管理

1
2
3
4
5
6
7
8
# <prefix> c    - 创建新窗口
# <prefix> , - 重命名当前窗口
# <prefix> w - 窗口列表(可预览)
# <prefix> n - 下一个窗口
# <prefix> p - 上一个窗口
# <prefix> 0-9 - 切换到指定编号窗口
# <prefix> & - 关闭当前窗口(确认)
# <prefix> l - 切换到上次使用的窗口

Pane管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建面板
# <prefix> % - 水平分割(左右)
# <prefix> " - 垂直分割(上下)

# 导航
# <prefix> 方向键 - 在面板间移动
# <prefix> o - 循环切换面板
# <prefix> ; - 切换到上一个活动面板
# <prefix> q - 显示面板编号,输入数字跳转

# 调整大小
# <prefix> Ctrl+方向键 - 按方向调整大小
# <prefix> z - 面板最大化/还原(zoom)

# 布局
# <prefix> Space - 循环切换布局
# <prefix> Alt+1-5 - 预设布局

# 交换
# <prefix> { - 与上一个面板交换
# <prefix> } - 与下一个面板交换

# 关闭
# <prefix> x - 关闭当前面板
graph TB
    subgraph "Even-horizontal (Alt+1)"
        direction LR
        EH1[P1] --- EH2[P2] --- EH3[P3]
    end

    subgraph "Even-vertical (Alt+2)"
        EV1[P1]
        EV2[P2]
        EV3[P3]
    end

    subgraph "Main-horizontal (Alt+3)"
        MH1[P1 - Main<br>顶部大面板]
        MH2[P2] --- MH3[P3]
    end

    subgraph "Tiled (Alt+5)"
        T1[P1] --- T2[P2]
        T3[P3] --- T4[P4]
    end

自定义配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# ~/.tmux.conf

# === 基础设置 ===
# 修改前缀键为Ctrl+a
set -g prefix C-a
unbind C-b
bind C-a send-prefix

# 支持256色和true color
set -g default-terminal "tmux-256color"
set -ag terminal-overrides ",xterm-256color:RGB"

# 开启鼠标支持
set -g mouse on

# 历史记录行数
set -g history-limit 50000

# 减少ESC延迟(对Vim用户重要)
set -sg escape-time 0

# 窗口编号从1开始
set -g base-index 1
setw -g pane-base-index 1

# 窗口关闭后自动重新编号
set -g renumber-windows on

# 焦点事件(对Vim autoread有用)
set -g focus-events on

# === 按键绑定 ===
# 重载配置
bind r source-file ~/.tmux.conf \; display "Config reloaded!"

# 分屏(更直观的按键)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %

# 新窗口保持当前路径
bind c new-window -c "#{pane_current_path}"

# Vim风格的面板导航
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# 调整面板大小
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

# 快速切换面板最大化
bind -r m resize-pane -Z

# Vi模式(复制模式)
setw -g mode-keys vi
bind -T copy-mode-vi v send -X begin-selection
bind -T copy-mode-vi y send -X copy-pipe-and-cancel "pbcopy"
# Linux: 将pbcopy改为xclip -selection clipboard

# === 状态栏 ===
set -g status-position top
set -g status-interval 5
set -g status-style "bg=#1e1e2e,fg=#cdd6f4"

# 左侧
set -g status-left-length 50
set -g status-left "#[fg=#1e1e2e,bg=#89b4fa,bold] #S #[default] "

# 右侧
set -g status-right-length 100
set -g status-right "#[fg=#a6adc8] %Y-%m-%d %H:%M #[fg=#1e1e2e,bg=#a6e3a1,bold] #H "

# 窗口标签
setw -g window-status-format " #I:#W "
setw -g window-status-current-format "#[fg=#1e1e2e,bg=#f9e2af,bold] #I:#W "

# 面板边框
set -g pane-border-style "fg=#45475a"
set -g pane-active-border-style "fg=#89b4fa"

插件系统(TPM)

1
2
# 安装TPM
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# ~/.tmux.conf 底部添加

# === 插件 ===
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible' # 合理默认设置
set -g @plugin 'tmux-plugins/tmux-resurrect' # 会话持久化
set -g @plugin 'tmux-plugins/tmux-continuum' # 自动保存/恢复
set -g @plugin 'christoomey/vim-tmux-navigator' # Vim-Tmux无缝导航
set -g @plugin 'tmux-plugins/tmux-yank' # 系统剪贴板集成
set -g @plugin 'catppuccin/tmux' # 主题

# Resurrect设置
set -g @resurrect-capture-pane-contents 'on'
set -g @resurrect-strategy-nvim 'session'

# Continuum设置
set -g @continuum-restore 'on'
set -g @continuum-save-interval '15'

# 初始化TPM(必须放在最后)
run '~/.tmux/plugins/tpm/tpm'

# 安装插件: <prefix> I
# 更新插件: <prefix> U
# 卸载插件: <prefix> Alt+u

tmux-resurrect会话持久化

1
2
3
4
5
6
7
8
9
10
11
# 保存会话状态
# <prefix> Ctrl+s

# 恢复会话状态
# <prefix> Ctrl+r

# 保存的内容:
# - 所有Session和Window
# - 面板布局
# - 当前工作目录
# - 运行中的命令(部分支持)

vim-tmux-navigator

实现Vim和Tmux面板之间的无缝导航:

1
2
3
4
5
6
7
8
9
10
11
12
-- Neovim配置(如果使用vim-tmux-navigator)
-- 在lua/plugins/中添加
return {
"christoomey/vim-tmux-navigator",
lazy = false,
keys = {
{ "<C-h>", "<cmd>TmuxNavigateLeft<cr>" },
{ "<C-j>", "<cmd>TmuxNavigateDown<cr>" },
{ "<C-k>", "<cmd>TmuxNavigateUp<cr>" },
{ "<C-l>", "<cmd>TmuxNavigateRight<cr>" },
},
}
1
2
3
4
5
6
7
# tmux.conf中添加
# vim-tmux-navigator自动处理,但手动配置如下:
is_vim="ps -o state= -o comm= -t '#{pane_tty}' | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
bind -n C-h if-shell "$is_vim" "send-keys C-h" "select-pane -L"
bind -n C-j if-shell "$is_vim" "send-keys C-j" "select-pane -D"
bind -n C-k if-shell "$is_vim" "send-keys C-k" "select-pane -U"
bind -n C-l if-shell "$is_vim" "send-keys C-l" "select-pane -R"

Tmux脚本化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#!/bin/bash
# dev-session.sh - 自动化创建开发环境

SESSION="dev"
PROJECT_DIR="$HOME/projects/my-app"

# 如果会话已存在则连接
tmux has-session -t $SESSION 2>/dev/null
if [ $? -eq 0 ]; then
tmux attach -t $SESSION
exit 0
fi

# 创建新会话
tmux new-session -d -s $SESSION -c $PROJECT_DIR

# 窗口1: Editor
tmux rename-window -t $SESSION:1 "editor"
tmux send-keys -t $SESSION:1 "nvim ." C-m

# 窗口2: Server
tmux new-window -t $SESSION:2 -n "server" -c $PROJECT_DIR
tmux send-keys -t $SESSION:2 "npm run dev" C-m

# 窗口3: Terminal (分两个面板)
tmux new-window -t $SESSION:3 -n "terminal" -c $PROJECT_DIR
tmux split-window -h -t $SESSION:3 -c $PROJECT_DIR
tmux send-keys -t $SESSION:3.1 "git status" C-m

# 窗口4: Logs
tmux new-window -t $SESSION:4 -n "logs" -c $PROJECT_DIR
tmux send-keys -t $SESSION:4 "tail -f logs/app.log" C-m

# 选择第一个窗口
tmux select-window -t $SESSION:1

# 连接到会话
tmux attach -t $SESSION

复制模式和搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 进入复制模式
# <prefix> [

# 在复制模式中(Vi模式)
# v - 开始选择
# V - 行选择
# Ctrl+v - 块选择
# y - 复制选中内容
# q / Escape - 退出复制模式

# 搜索
# <prefix> [ 进入复制模式
# / 向下搜索
# ? 向上搜索
# n 下一个匹配
# N 上一个匹配

# 粘贴
# <prefix> ]

# 查看粘贴缓冲区
# <prefix> = 选择粘贴缓冲区

Pair Programming

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 方法1: 共享会话(两人看到完全相同的内容)
# 用户A创建会话
tmux new -s pair

# 用户B连接同一个会话(通过SSH)
ssh user@host
tmux attach -t pair
# 两人看到和操作完全相同的窗口

# 方法2: 共享会话但独立窗口
# 用户A
tmux new -s pair

# 用户B(创建新会话连接到同一服务端)
tmux new -t pair -s pair-b
# 两人可以在不同窗口中操作

高效工作流示例

Web开发工作流

graph TB
    subgraph "Session: web-dev"
        subgraph "Window 1: Code"
            W1P1[Neovim<br>左侧 70%]
            W1P2[Terminal<br>右侧 30%]
        end
        subgraph "Window 2: Server"
            W2P1[Dev Server<br>上方]
            W2P2[API Server<br>下方]
        end
        subgraph "Window 3: DB & Logs"
            W3P1[Database CLI<br>左侧]
            W3P2[App Logs<br>右上]
            W3P3[Error Logs<br>右下]
        end
        subgraph "Window 4: Git"
            W4P1[git log / lazygit]
        end
    end

常用快捷键速查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Session:
<prefix> d detach
<prefix> s session列表
<prefix> $ 重命名session

Window:
<prefix> c 新建窗口
<prefix> , 重命名窗口
<prefix> n/p 上/下一个窗口
<prefix> 0-9 切换到指定窗口
<prefix> w 窗口预览列表

Pane:
<prefix> | 水平分割 (自定义)
<prefix> - 垂直分割 (自定义)
<prefix> h/j/k/l 导航 (自定义)
<prefix> z 最大化/还原
<prefix> x 关闭面板
<prefix> Space 切换布局

Copy:
<prefix> [ 进入复制模式
v 开始选择
y 复制
<prefix> ] 粘贴

Other:
<prefix> r 重载配置 (自定义)
<prefix> : 命令模式
<prefix> ? 快捷键帮助

总结

Tmux高效终端管理的核心要点:

  1. 会话持久化:SSH断开后任务继续运行,tmux-resurrect/continuum实现重启恢复
  2. 窗口和面板:灵活的分屏和窗口管理,一个终端承载完整开发环境
  3. 自定义配置:改前缀键、Vim风格导航、保持当前路径等提升效率
  4. vim-tmux-navigator:Vim和Tmux面板之间无缝切换
  5. 脚本化:用Shell脚本自动创建项目工作环境
  6. 插件生态:TPM管理插件,按需扩展功能

Tmux是服务器操作和日常开发的必备工具。花一个下午配置好你的tmux.conf,之后每天都能节省大量时间。

作者 · authorzt
发布 · date2025-11-05
篇幅 · length2.9k 字 · 7 min
许可 · licenseCC BY-SA 4.0
$ echo "comments" · 评论