Tmux高效终端管理
// 目录 · 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 tmux new -s ops -d
tmux ls
tmux attach -t dev tmux a -t dev
tmux kill-session -t dev tmux kill-server
|
Window管理
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
|
|
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
|
set -g prefix C-a unbind C-b bind C-a send-prefix
set -g default-terminal "tmux-256color" set -ag terminal-overrides ",xterm-256color:RGB"
set -g mouse on
set -g history-limit 50000
set -sg escape-time 0
set -g base-index 1 setw -g pane-base-index 1
set -g renumber-windows on
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}"
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
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"
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
| 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
|
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' set -g @plugin 'tmux-plugins/tmux-yank' set -g @plugin 'catppuccin/tmux'
set -g @resurrect-capture-pane-contents 'on' set -g @resurrect-strategy-nvim 'session'
set -g @continuum-restore 'on' set -g @continuum-save-interval '15'
run '~/.tmux/plugins/tpm/tpm'
|
tmux-resurrect会话持久化
vim-tmux-navigator
实现Vim和Tmux面板之间的无缝导航:
1 2 3 4 5 6 7 8 9 10 11 12
|
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
|
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
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
tmux rename-window -t $SESSION:1 "editor" tmux send-keys -t $SESSION:1 "nvim ." C-m
tmux new-window -t $SESSION:2 -n "server" -c $PROJECT_DIR tmux send-keys -t $SESSION:2 "npm run dev" C-m
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
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
|
|
Pair Programming
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
tmux new -s pair
ssh user@host tmux attach -t pair
tmux new -s pair
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高效终端管理的核心要点:
- 会话持久化:SSH断开后任务继续运行,tmux-resurrect/continuum实现重启恢复
- 窗口和面板:灵活的分屏和窗口管理,一个终端承载完整开发环境
- 自定义配置:改前缀键、Vim风格导航、保持当前路径等提升效率
- vim-tmux-navigator:Vim和Tmux面板之间无缝切换
- 脚本化:用Shell脚本自动创建项目工作环境
- 插件生态:TPM管理插件,按需扩展功能
Tmux是服务器操作和日常开发的必备工具。花一个下午配置好你的tmux.conf,之后每天都能节省大量时间。