Skip to content

Tmux

Tmux is a terminal multiplexer that allows you to manage multiple terminal sessions within a single window. It is particularly useful for running multiple programs simultaneously and maintaining persistent sessions even after disconnecting.

What is Tmux

Tmux 是一个终端复用器(terminal multiplexer),属于程序开发和运维常用的开发工具。

类似的终端复用器还有 GNU Screen。Tmux 与它功能相似,但是更易用,也更强大。

命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称“窗口”),在里面输入命令。用户与计算机的这种临时的交互,称为一次“会话”(session)。

会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。

Tmux 就是会话与窗口的“解绑”工具,将它们彻底分离。

Can I use Tmux on Windows OS

根据目前的资料,Tmux 目前只能在 macOS 或 Linux 上安装和使用,不支持 Windows 系统。

Do Your Need Tmux

不是专业的程序开发和运维工作人员,平时只是在 Terminal 下:

  • 使用 Neovim 写 Markdown 文档,同时操作多个文档文件
  • 使用 yt-dlp 下载 YouTube 或 Amazon 的视频,同时下载多个视频文件

需要 Tmux 吗?不,你目前的工作流程并不需要 Tmux,因为这其中并不牵涉会话与窗口的「解绑」需求,你仅仅只是需要同时操作多个窗口、多个进程而已。

  • macOS:
    • iTerm2 → Right Click → New Window (Default Profile) 即可打开一个新的 iTerm2 终端窗口
    • ⌘ + N 打开新窗口
  • Windows OS: Windows Terminal
    • Ctrl + Shift + N 打开新窗口

使用 Tmux

在使用 Tmux 之前,技术堆栈之间的嵌套关系为:终端 iTerm2 → Shell Zsh → 命令行应用程序 (Neovim, Yazi, yt-dlp...)。在使用 Tmux 之后,系统间的嵌套关系为:终端 iTerm2 → Tmux → Shell Zsh → 命令行应用程序 (Neovim, Yazi, yt-dlp...)。

由此可见,Tmux 可以看作是位于终端和 Shell 之间的一个中间层,而它的作用就是:在单一的 iTerm2 终端窗口内,通过运行 Tmux 来进行多个会话、多个窗口、多个窗格的操作。

安装

Tmux 内部的实体层级关系:会话 → 窗口 → 窗格 (session → window → pane)

配置

建议的配置文件所在位置:~/.tmux.conf

以下是参考别人的配置文件,注意自行甄别和选择使用:

set-option -sa terminal-overrides ",xterm*:Tc"
set -g mouse on

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

# Vim style pane selection
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# Start windows and panes at 1, not 0
set -g base-index 1
set -g pane-base-index 1
set-window-option -g pane-base-index 1
set-option -g renumber-windows on

# Use Alt-arrow keys without prefix key to switch panes
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Shift arrow to switch windows
bind -n S-Left  previous-window
bind -n S-Right next-window

# Shift Alt vim keys to switch windows
bind -n M-H previous-window
bind -n M-L next-window

set -g @catppuccin_flavour 'mocha'

set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'
set -g @plugin 'christoomey/vim-tmux-navigator'
set -g @plugin 'dreamsofcode-io/catppuccin-tmux'
set -g @plugin 'tmux-plugins/tmux-yank'

run '~/.tmux/plugins/tpm/tpm'

# set vi-mode
set-window-option -g mode-keys vi
# keybindings
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel

bind '"' split-window -v -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"

进入

  • tmux 进入 Tmux 并默认创建 [0] 会话

退出

C-dexit,每次运行会依次退出当前的 pane,window,或 session,退出最后的 session 之后,Tmux 退出。

前缀命令

Tmux 默认的命令前缀是 C-b,但是 Ctrlb 这两个按键有点距离,不容易操作。为方便操作,建议在 Tmux 配置文件内将前缀命令更换为 C-a

会话管理

新建会话

  • tmux new -s <name>

分离会话

  • C-ad
  • tmux ls

接入会话

  • tmux attach -t <name>

中止会话

切换会话

  • C-as

每次按下 C-as 会列出所有会话列表,当前接入的会话会包含 (attached) 标志。通过方向键切换了会话之后,会自动中止旧的会话,并接入新的会话。

重新命令会话

  • C-a? 显示快捷键列表,q 退出列表
  • C-as 列出所有会话列表,然后可通过 jk,或者 选择会话
  • C-a$ 改名会话:重新命名当前会话
    • 会话名称默认以编号 [0],[1],[2],······
    • 会话名称可以更改为类似 [YouTube],[Blog] 这样有意义的名称
  • C-ad 分离会话:断开当前会话,会话继续后台运行
  • C-a: 命令模式
    • new-session 新建会话
    • new-window 新建窗口
    • split-window 上下拆分窗格
    • split-window -h 水平拆分窗格
  • C-a{arrow} 通过箭头键移动光标至各个窗格
  • C-a" 水平拆分窗口
  • tmux attach 接入上次会话
    • tmux attach -t 0 使用会话编号
    • tmux attach -t <session-name> 使用会话名称

窗口管理

  • C-ac 新建窗口:在当前会话中多加一个窗口
  • C-an 切换到下一个窗口
  • C-ap 切换到上一个窗口
  • C-a& 关闭当前窗口
  • C-a<number> 切换到指定编号的窗口 (1, 2, ...)
  • C-a, 重新命名当前窗口
    • 窗口名称默认以编号 0,1,2,······
    • 通过配置文件设置成 1,2,3,······
    • 窗口名称的格式 1:zsh2:Teek-nvim

窗格管理

  • C-a% 左右拆分窗格
  • C-a" 上下拆分窗格
  • C-a<arrow> 在面板间移动焦点
    • Vim style pane selection (not working)
  • C-ax 关闭当前窗格
  • C-az 最大/恢复当前窗格
  • C-a<Space> 切换窗格布局
最近更新