tmux 基础教程
- uvim管理员
你好!作为一名资深软件工程师,我非常推荐你掌握 tmux (Terminal Multiplexer)。在远程服务器开发、长时间运行任务或者需要同时进行多项任务时,tmux 是提升开发效率的“瑞士军刀”。
简单来说,tmux 能让你在同一个终端窗口中开启多个会话,并且即使你断开了 SSH 连接,程序依然可以在后台持续运行。
第一部分:核心概念
要理解 tmux,只需记住三个层级:
1. Session (会话):最顶层,你可以把它看作是一个“工作空间”(比如:后端开发、数据库监控)。
2. Window (窗口):每个 Session 下可以有多个窗口,类似于浏览器的标签页。
3. Pane (面板):每个 Window 可以切分成多个小面板,实现左右、上下分屏。第二部分:安装与启动
- 安装:
sudo apt install tmux(Ubuntu/Debian) 或brew install tmux(macOS)。 - 启动: 在终端输入
tmux即可进入。 - 快捷键前缀: tmux 的操作核心是
Ctrl + b。这意味着,在进行任何命令操作前,你需要先按下Ctrl + b,松开后,再按下功能键。
第三部分:常用快捷键(按优先级)
1. 会话管理 (在终端输入,而非快捷键)
tmux new -s <name>:创建一个名为<name>的新会话。tmux ls:查看当前所有会话。tmux attach -t <name>:重新连接到名为<name>的会话。tmux kill-session -t <name>:关闭指定会话。
2. 会话内部操作 (
Ctrl + b为前缀)- 分离会话:
Ctrl + b然后d(Detach)。重点:这是它最强大的地方,断开后程序继续运行,下次进来attach即可复原。 - 列出所有会话:
Ctrl + b然后s。
3. 分屏操作
- 横向分屏:
Ctrl + b然后% - 纵向分屏:
Ctrl + b然后" - 切换面板:
Ctrl + b然后 方向键 (上下左右) - 关闭面板: 直接输入
exit或Ctrl + d
4. 窗口操作
- 新建窗口:
Ctrl + b然后c - 切换窗口:
Ctrl + b然后n(下一个) 或p(上一个) - 重命名窗口:
Ctrl + b然后,
第四部分:资深工程师的进阶建议
1. 配置文件 (
~/.tmux.conf)默认的
Ctrl + b离左手太远,且容易和 Vim 按键冲突。我建议修改配置文件,将前缀改为Ctrl + a(类似于 GNU Screen 的习惯):# 将前缀改为 Ctrl + a set -g prefix C-a unbind C-b bind C-a send-prefix # 支持鼠标操作(方便选中、拖动分屏大小) set -g mouse on # 开启 256 色显示 set -g default-terminal "screen-256color"修改后别忘了在 tmux 中输入
tmux source-file ~/.tmux.conf使其生效。2. 利用插件:Tmux Plugin Manager (TPM)
当你熟练使用后,可以安装
tpm,通过插件快速实现状态栏美化(如 battery/cpu 使用率) 和 会话自动保存功能(tmux-resurrect)。3. 最佳实践
- 不要用
Ctrl+C强行杀死正在运行的服务器:如果你需要在后台跑服务,使用tmux后直接detach是最优雅的处理方式。 - 配合 SSH 使用:即使你在公共网络环境下,即使 SSH 断开了,你在 tmux 里的进程依然稳健。
- 语义化命名:执行
tmux new -s project-name时养成命名的习惯,这样在管理几十个会话时不会混乱。
总结:
对于初学者,你只需要记住三个词:tmux(启动)、Ctrl+b+d(挂机)、tmux a(接回)。 - 安装:
为了方便你快速查阅,我将 tmux 的常见用法按照生命周期和场景进行了归纳。你可以把这张表保存下来作为“备忘录”。
1. 核心会话生命周期 (最常用)
这一组命令是你每天通过 SSH 登录服务器后的“标准作业程序”。
目标 操作 创建新会话 tmux new -s <名称>退出会话(挂起在后台) Ctrl + b然后d查看所有活动会话 tmux ls恢复(回到)会话 tmux a -t <名称>切换到另一个会话 Ctrl + b然后s(列表选择)彻底关闭会话 tmux kill-session -t <名称>2. 窗口 (Window) 管理
窗口就像浏览器的 Tab,适合组织不同的任务(比如一个窗口跑代码,一个窗口查日志)。
- 创建窗口:
Ctrl + b+c - 切换窗口:
Ctrl + b+n(下一页) /p(上页) /0-9(直接跳转) - 重命名窗口:
Ctrl + b+, - 关闭窗口:
Ctrl + b+&(需确认)
3. 面板 (Pane) 布局控制
面板适合在同一个屏幕上进行多任务处理。
- 垂直分屏:
Ctrl + b+% - 水平分屏:
Ctrl + b+" - 切换面板:
Ctrl + b+ 方向键 - 调整大小:
Ctrl + b+Alt+ 方向键(需要开启鼠标支持,拖动边缘也行) - 面板全屏/恢复:
Ctrl + b+z(查看代码时非常实用) - 关闭当前面板:
Ctrl + b+x(或直接输入exit)
4. 资深工程师的高频进阶操作
A. 从终端回滚(查看历史输出)
很多新手不知道怎么在 tmux 里向上翻页看之前的日志:
1. 按下Ctrl + b进入复制模式 ([)。
2. 现在你可以使用方向键或鼠标滚动向上看日志了。
3. 按Esc或q退出模式,回到命令行。B. 快速复制粘贴
1. 进入复制模式:
Ctrl + b+[。
2. 移动光标到开始处。
3. 按Space开始选取,移动光标选中内容。
4. 按Enter复制(并自动退出复制模式)。
5. 在目标位置按Ctrl + b+]进行粘贴。C. “一次性”优雅关闭
如果你开了几十个窗口,没必要一个个关。可以使用命令行:
*tmux kill-server:直接杀掉所有会话(极其暴力,慎用)。
*tmux kill-session -a:杀掉除当前会话外的所有会话。5. 建议配置清单 (优化体验)
如果默认快捷键让你感到痛苦,请务必在
~/.tmux.conf中加入以下配置:# 1. 开启鼠标支持 (极其推荐) set -g mouse on # 2. 解决粘贴延迟 (防止按下 ESC 变慢) set -sg escape-time 0 # 3. 更顺手的面板切换逻辑 (类似 Vim) bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # 4. 状态栏色彩美化 set -g status-style bg=black,fg=white给你的专业建议:
1. 别在 tmux 里开太多乱七八糟的后台任务,时间久了会忘记什么任务跑在哪里。
2. 学会使用tmux-resurrect插件:这是 tmux 的“存档存档”插件,系统重启后依然可以恢复之前的窗口布局和正在运行的脚本。
3. 如果遇到乱码或无法显示中文,请检查终端模拟器(Terminator, iTerm2, Alacritty 等)的字符编码是否设置为 UTF-8。如果你在特定的开发场景(比如同时开着 Go 服务、数据库 CLI 和 Redis Client)感到排版困难,可以通过一个自动化分屏的脚本(使用
tmuxinator库),实现一键还原开发环境。- 创建窗口:
在复杂的软件开发场景中,每次手动开窗口、切分屏、进目录、启动服务确实非常低效。
要实现“一键还原开发环境”,业界最标准的做法是使用 tmuxinator。它允许你通过一个简单的 YAML 文件定义你的工作区布局。
以下是实现步骤和配置指南:
第一步:安装 tmuxinator
可以通过 Ruby 的 Gem 安装(最推荐):
gem install tmuxinator(如果没有 Ruby,也可以通过包管理器安装,如 macOS 上的
brew install tmuxinator)第二步:创建项目配置
假设你现在要搭建一个“前后端开发环境”,我们可以创建一个名为
web-project的配置:tmuxinator new web-project这会自动在
$HOME/.config/tmuxinator/web-project.yml创建一个配置文件,并用你的默认编辑器打开它。第三步:编写 YAML 配置 (核心)
将内容修改为类似下面这样:
# ~/.config/tmuxinator/web-project.yml name: web-project root: ~/projects/my-app # 项目根目录,进入 tmux 后自动 cd 到这里 windows: - editor: # 窗口名称 layout: main-vertical panes: - vim # 窗口1,打开 Vim - npm run dev # 窗口1,右侧分屏启动前端服务 - backend: # 窗口2 layout: tiled panes: - python manage.py runserver # 后端服务 - celery worker -A app # 辅助服务 - logs: panes: - tail -f logs/app.log # 实时日志监控第四步:一键启动
配置好后,你在任何路径下,只需要输入:
tmuxinator start web-project魔法发生了:tmux 会自动开启对应的 Session,分屏,并在每个面板中执行你定义的命令,甚至自动切换到项目目录。
“资深工程师”的调优秘籍
如果你不想用 Ruby 的第三方库,或者不想安装太多依赖,我为你写了一个轻量级的 Bash Shell 函数方案。你可以把它加入到你的
~/.bashrc或~/.zshrc中:# 在 .zshrc 或 .bashrc 中添加 function dev_up() { session="my-dev-env" # 如果会话已存在,直接附着 tmux has-session -t $session 2>/dev/null if [ $? != 0 ]; then # 创建一个新会话 tmux new-session -d -s $session -c ~/projects/my-app -n "code" # 切分面板并运行命令 tmux send-keys -t $session:1 'vim' C-m tmux split-window -h -t $session:1 tmux send-keys -t $session:1 'npm run dev' C-m # 新建第二个窗口,运行后端 tmux new-window -t $session -n "backend" -c ~/projects/my-app tmux send-keys -t $session:2 'python manage.py runserver' C-m fi tmux attach-session -t $session }如何使用:
1. 保存并source ~/.zshrc。
2. 在终端敲入dev_up。
3. 你的开发环境会瞬间搭建完毕,所有服务按既定规则启动。为什么我推荐这种做法?
1. 心流保护:不要把时间浪费在开 Terminal、拆屏、换目录这些重复劳动上。
2. 环境标准化:当你和队友共享这一份脚本时,大家的开发环境 Layout 是一模一样的,这在调试时非常有用。
3. 可扩展性:你可以在send-keys后面通过;再接更多命令,比如先git pull再运行服务。作为一名在生产环境中摸爬滚打了多年的软件工程师,我深知工具用得好是“生产力”,用不好则是“认知负担”。
tmux默认的配置对新手不太友好(比如那个反人类的Ctrl+b快捷键),而且如果不规范使用,很容易搞出一堆混乱的 Session。今天我把多年来积累的 tmux 最佳实践(Best Practices) 毫无保留地分享给你。通过这套配置和工作流,你可以将 tmux 的效率提升到极致。
一、 终极痛点解决:优化配置文件 (
~/.tmux.conf)不要直接用默认的 tmux。在
~/.tmux.conf中加入以下配置,能带来质的飞跃。你可以直接创建/编辑
~/.tmux.conf并写入以下内容:# ==================== 基础配置 ==================== # 1. 开启鼠标支持(支持点击切换面板、滚动、调整大小) set -g mouse on # 2. 修改 Prefix 键:将 Ctrl+b 改为 Ctrl+a (类似 Vim 的习惯,离键盘主区更近) set -g prefix C-a unbind C-b bind C-a send-prefix # 3. 减少 Esc 的延迟(这对 Vim 用户至关重要,解决 Vim 响应慢的问题) set -g escape-time 10 # 4. 窗口和面板索引从 1 开始(默认从 0 开始,键盘上 0 太远了) set -g base-index 1 setw -g pane-base-index 1 # 5. 重新加载配置文件的快捷键 (在 tmux 中按 prefix + r 即可生效) bind r source-file ~/.tmux.conf \; display "Config Reloaded!" # ==================== 键位映射优化 ==================== # 1. 更直观的分屏快捷键: # prefix + | 左右分屏 # prefix + - 上下分屏 bind | split-window -h -c "#{pane_current_path}" bind - split-window -v -c "#{pane_current_path}" unbind '"' unbind % # 2. 像 Vim 一样用 h, j, k, l 在面板之间跳转 bind h select-pane -L bind j select-pane -D bind k select-pane -U bind l select-pane -R # 3. 开启 Vi 模式复制文本 setw -g mode-keys vi # ==================== 视觉美化(状态栏) ==================== # 开启 256 色支持 set -g default-terminal "screen-256color" # 状态栏背景色和前景色(深色系,护眼) set -g status-style bg='#333333',fg='#aaaaaa' # 当前激活的窗口高亮显示 setw -g window-status-current-style bg='#00aa00',fg='#ffffff',bold修改后别忘了:如果在 tmux 中,按下
Ctrl + a然后按r即可重新加载配置。二、 会话管理最佳实践:命名与持久化
不要盲目地
tmux new,长此以往你会拥有一堆名为0,1,2的 Session,根本不知道里面跑的是什么。1. 语义化命名
- 规则:用你的项目名或任务名来命名 Session。
- 命令:
tmux new -s project-api或tmux new -s fix-bug-1024。
2. 使用
tmuxinator或tmux-resurrect管理复杂环境如果你每次开发一个项目都需要打开 4 个面板(一个跑后端、一个跑前端、一个看日志、一个留着敲命令),每次手动切很麻烦。
* 推荐插件:tmux-resurrect(可以保存和恢复 tmux 会话,即使重启服务器也不怕)。
* 你可以通过 TPM (Tmux Plugin Manager) 来安装它。在~/.tmux.conf中加入:# 推荐安装 TPM (Tmux Plugin Manager) set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-resurrect' # 初始化 TPM (放在配置文件最底部) run '~/.tmux/plugins/tpm/tpm'安装后,在 tmux 中按
Ctrl + a然后按I(大写 i)即可自动下载插件。
使用Ctrl + a+Ctrl + s保存会话,Ctrl + a+Ctrl + r恢复会话。三、 窗口与面板的最佳实践
1. 新建面板时保持当前目录:
你看上面配置文件里我写了-c "#{pane_current_path}"。这意味着,当你切分出一个新面板时,它会自动继承当前面板所在的目录,而不是跳回根目录。这在项目开发中极其重要!2. 按功能划分窗口:
* 不要把所有东西塞在一个面板里。
* Window 1: 专门跑服务(Dev Server / Docker)。
* Window 2: 专门写代码(Vim / Git 操作)。
* Window 3: 专门跑测试或看实时日志 (tail -f)。四、 避坑指南(Senior 经验之谈)
1. 不要嵌套使用 tmux:
如果你在本地电脑的 tmux 里通过 SSH 连接到了远程服务器,千万不要在远程服务器上再次启动 tmux。这样会导致快捷键冲突(比如你想发给远程 tmux 的Ctrl+a被本地的 tmux 拦截了)。
解法*:本地用 tmux,或者远程用 tmux,只用一层。2. 复制粘贴的痛点:
在开启鼠标模式后,按住鼠标左键拖动选中文本,其实是复制到了 tmux 的剪贴板,而不是系统的剪贴板。
解法*:按住键盘上的Shift键再用鼠标选中,就可以调用系统的原生复制功能。或者使用上面配置中的vi 模式配合插件。3. 优雅地退出:
养成好习惯,离开时用Ctrl + a然后按d(Detach)让它在后台跑,而不是直接关闭 SSH 窗口或狂点exit关掉所有面板。遵循这套最佳实践,你的终端效率会发生质的飞跃。先花 10 分钟把配置文件搞定,适应一下
Ctrl+a和 Vi 风格的面板跳转,一周之后你会发现自己再也离不开它了!你好!作为一名软件工程师,我在日常开发中几乎离不开
tmux(特别是配合远程 SSH 会话时,它简直是神兵利器)。在
tmux中复制文本稍微有点直觉上的反直觉,因为它的复制模式(Copy Mode)类似于经典的vi/vim编辑器。下面我为你整理一份最实用、最顺手的 tmux 复制指南,分为“键盘流”和“鼠标流”。
第一步:进入“复制模式”(Copy Mode)
不管你想怎么复制,首先得进入复制模式:
- 快捷键:先按
Ctrl + b,然后松开,再按[ - 屏幕右上角会出现类似
[0/1]或(copy mode)的字样,这就表示你进入了复制模式。
第二步:移动光标并选择文本
进入复制模式后,你可以用方向键或
vi键位来移动光标。1. 移动光标
h,j,k,l:左、下、上、右(像 Vim 一样)Page Up/Page Down:上下翻页Ctrl + u/Ctrl + d:向上/向下滚动半屏
2. 开始选择(类似于 Visual 模式)
- 空格键 (
Space):按下空格键,就开始标记你要复制的起点。 - 移动光标,你会发现被选中的区域高亮显示了。
- 如果你用的是现代版本的 tmux,也可以直接用鼠标左键按住拖动来选择。
3. 复制选中的内容
* 回车键 (
Enter):选好文本后,按下回车键,文本就会被复制到 tmux 的剪贴板中,并自动退出复制模式。第三步:粘贴文本 (
Paste)- 快捷键:
Ctrl + b然后按] - 这会将你刚才复制的内容粘贴到当前光标所在的位置。
🚀 进阶技巧:与系统剪贴板(Mac/Linux)打通
默认情况下,tmux 复制的内容只存在于 tmux 自身的剪贴板里,无法粘贴到系统的其他软件(如浏览器、VS Code)中。作为工程师,我们肯定希望它能直接复制到系统剪贴板。
你需要修改配置文件
~/.tmux.conf:如果你在 macOS 上 (使用
pbcopy):在
~/.tmux.conf中加入以下配置:# 绑定 v 开始选择,y 复制到系统剪贴板 bind-key -T copy-mode-vi v send-keys -X begin-selection bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "pbcopy" setw -g mode-keys vi # 开启 vi 风格键位如果你在 Linux 上 (使用
xclip或xsel):首先安装工具:
sudo apt-get install xclip
然后在~/.tmux.conf中加入:bind-key -T copy-mode-vi v send-keys -X begin-selection bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -selection clipboard -i" setw -g mode-keys vi修改配置后,记得在 tmux 中按
Ctrl + b然后输入:,再输入source-file ~/.tmux.conf来重载配置。
此后,你在 tmux 里按v选择,按y就能直接把内容复制到电脑的系统剪贴板里了!总结一下平时的操作肌肉记忆:
1.Ctrl + b然后[(进入)
2. 移动光标,按Space(开始选)
3. 按Enter或y(复制)
4.Ctrl + b然后](粘贴到别处)如果你在实际操作中遇到什么报错或具体环境的问题,随时告诉我!
- 快捷键:先按