我的论坛
登录

tmux 基础教程

274
  • 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 (接回)。

  • uvim
    管理员
    #1

    为了方便你快速查阅,我将 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 库),实现一键还原开发环境。

  • uvim
    管理员
    #2

    在复杂的软件开发场景中,每次手动开窗口、切分屏、进目录、启动服务确实非常低效。

    要实现“一键还原开发环境”,业界最标准的做法是使用 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 再运行服务。

  • uvim
    管理员
    #3

    作为一名在生产环境中摸爬滚打了多年的软件工程师,我深知工具用得好是“生产力”,用不好则是“认知负担”。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 风格的面板跳转,一周之后你会发现自己再也离不开它了!

  • uvim
    管理员
    #4

    你好!作为一名软件工程师,我在日常开发中几乎离不开 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 然后 ] (粘贴到别处)

    如果你在实际操作中遇到什么报错或具体环境的问题,随时告诉我!

发表回复

登录后回复