终端利器:新手也能轻松驾驭 tmux

889 阅读10分钟

前置知识

什么是 Session

我们现在可以将 Session 按照其对应的中文意思进行理解,即为一次会话,我们通过 Terminal 连接服务器至我们退出服务器的整个过程就可以被称为一次会话

场景

比如我们再进行服务器终端操作的时候,现在要安装一个包,我们在安装的时候如果此时发生了一些以外情况不小心中断了连接,此时就只能再重新通过 ssh 连接服务器然后输入安装软件包的指令

  • 该场景存在的问题:
    • session 的生命周期是跟 terminal 强绑定的,即关闭 terminal 之后 session 就自动中断了

如何解决?

所以要解决当前使用场景的问题,就有了将 sessionterminal 的生命周期分离开的方案,而这个解决方案就是我们今天要介绍的 Tmux

什么是 Tmux

  • Tmux 是一个终端多路复用器

Tmux 允许在一个终端窗口中创建、访问和控制多个终端会话,并且 Tmux 支持将 sessionterminal 分离开并在后台运行,并支持重新连接。支持窗口和窗格的垂直和水平拆分,非常适合同时运行多个命令行程序。

Tmux 的安装

如果是使用 MacOS 使用如下命令:

brew install tmux 

如果是使用 Linux 系统的话看一下你自己的机器用的软件包管理器,然后使用对应的命令安装该软件包即可

Tmux 起步

在安装好 Tmux 之后,该如何使用呢?其实非常简单,基本的使用如下:

  1. 打开终端软件
  2. 输入 tmux
  3. 回车

恭喜你开启了一个新的 Session

Tmux 的基本概念

prefix 前置快捷键

在进入 TmuxSession (会话)之后,现在我们要查看该如何使用 Tmux 的基本快捷键呢?

要使用 Tmux基本功能,比如:

  • 上下(水平)分屏
  • 左右(垂直)分屏
  • 退出 Tmux 会话

Tmux 中存在着 prefix 的概念,所谓的 prefix 可以理解为前置快捷键,而前置快捷键就是在进行操作动作前一定要执行的一个步骤,比如我们如果要进行垂直分屏,对应的按键是 % 键,但是要触发这个按键的功能,我们一定要在按 % 之前加上 prefix 也就是前置快捷键。

默认的 prefixctrl + b,所以要进行垂直分屏,对应的快捷键就是:ctrl + b + % 即按下 ctrl + b 之后再按下 %

[!info] 所有的快捷键都是可以更改的,在[[#如何改键?]]的小节会具体讲解

三大核心概念

接下来讲解一下 Tmux 中的 3 大概念,搞明白这三大概念就会对 Tmux 的基本使用有一个比较好的理解

Sessions

  • 中文名:会话
  • 一个 sessiontmux 的最高层次单位。它包含多个窗口和窗格。你可以在不同的终端会话之间切换,并保持它们的状态。

Windows

  • 中文名:窗口
  • 一个 session 可以包含多个窗口。每个窗口类似于一个独立的终端,可以运行不同的任务。你可以在同一个 session 中创建和切换多个窗口。

Panes

  • 中文名:窗格
  • 每个窗口可以进一步分割成多个窗格。每个窗格都是一个独立的终端区域,可以运行不同的命令。窗格可以垂直或水平分割,方便同时查看和操作多个任务。

树形结构:

Session 0
├── Window 0
│   ├── Pane 1
│   ├── Pane 2
│   ├── Pane 3
│   └── Pane 4
└── Window 1
    ├── Pane 1
    ├── Pane 2
    ├── Pane 3
    └── Pane 4
	
Session 1
└── Window 0
    ├── Pane 1
    └── Pane 2

图例:

实际呈现:

  • 下方绿色的条显示我当前处于 session 0 中的 window 2 的编号为 1pane
    • [0] 表示当前处于会话 0
    • 0:zsh 1:zsh- 2:zsh*:表示当前有 3 个 window,其对应的名称都为 zsh 后面带上 * 表示的是当前处于该 window
    • 当前处于编号为 1pane

基本配置

讲了这么多,也是时候配置一下 Tmux ,首先 Tmux 的默认配置非常难看,所以我们需要自己改造一下,首先要解决的就是 Tmux 那个非常难看的主题配色了!但是我们首先需要安装 tpm即为 Tmux Plugin Manager (Tmux 插件管理器)

安装 tpm

  1. 首先选择在 ~ 下创建 .tmux.conf 即为 Tmux 的配置文件(也可以选择在其他地方创建,在后面指定配置文件的时候需要制定对应的路径)
  2. 安装 ,首先我们克隆项目:
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
  1. 编辑配置文件,我们按照 github 上的安装教程,写入如下内容:
    • [[Vim]] 的配色可能有点问题可以顺便加入代码:set -g default-terminal 'tmux-256color'
# List of plugins
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

# Other examples:
# set -g @plugin 'github_username/plugin_name'
# set -g @plugin 'github_username/plugin_name#branch'
# set -g @plugin 'git@github.com:user/plugin'
# set -g @plugin 'git@bitbucket.com:user/plugin'

## - Solve the Vim color scheme problem
set -g default-terminal 'tmux-256color'

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

[!Warning] run '~/.tmux/plugins/tpm/tpm' 这句一定要放在配置文件的末尾才能生效

  1. 然后我们参考下一小节的内容刷新配置文件,就可以安装完成了!

如何让刚刚修改的配置文件生效

  • 方法一:通过 Tmux 命令模式
    • 按下 <prefix> + :
    • 输入 source ~/.tmux.confsource 后面跟的是 Tmux 配置文件的路径)
  • 方法二:直接通过 Tmux 命令来让配置文件生效
    • 在终端输入 tmux source ~/.tmux.conf
    • 回车,配置文件即刻生效

如何美化?

下面我们来介绍一下如何美化 Tmux,默认的 Tmux 非常难看,所以我们需要借助一些主题,来强化 Tmux 的效果!

这里我推荐使用 catppuccin (猫布奇)主题,这个主题的配色风格非常好看:

首先我们修改 .tmux.conf 中的内容:

  • catppuccin_flavourcatppuccin_window_status_style 这两块的内容是给该插件做样式客制化的配置,详情可以查阅官方的 GitHub
...

## - catppuccin theme
set -g @plugin 'catppuccin/tmux'
set -g @catppuccin_flavour 'macchiato'
set -g @catppuccin_window_status_style "rounded"

...

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'

然后我们 按下 <prefix> + shift + i 安装该主题!

如果你觉得还是不够好看,那么我们接下来继续优化一下!

## - List of plugins
...
set -g @plugin 'tmux-plugins/tmux-cpu' 
set -g @plugin 'tmux-plugins/tmux-battery'

## - catppuccin theme
set -g @plugin 'catppuccin/tmux'
set -g @catppuccin_flavour 'macchiato'
set -g @catppuccin_window_status_style "rounded"

## - Make the status line pretty and add some modules
set -g status-right-length 100
set -g status-left-length 100
set -g status-left ""
set -g status-right "#{E:@catppuccin_status_application}"
set -agF status-right "#{E:@catppuccin_status_cpu}"
set -ag status-right "#{E:@catppuccin_status_session}"
set -ag status-right "#{E:@catppuccin_status_uptime}"
set -agF status-right "#{E:@catppuccin_status_battery}"
...

# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
run '~/.tmux/plugins/tpm/tpm'
  • 这里我们用到了两个插件,tmux-cputmux-battery 这两个插件
  • 刷新配置文件,然后我们就可以看到相对比较好看的 Tmux 样式了!

如何改键?

修改默认的 prefix

Tmux 中比较难用的就是 prefix 即 [[#prefix 前置快捷键|前置键]] (默认为 ctrl + b),这块对于我一个 Vim 党来说是不太行的,他和 Vim 的翻页快捷键冲突了,所以我会将其改掉 变为 ctrl + s

## - change the prefix
unbind C-b
set -g prefix C-s
  • 首先要让原先的快捷键失效:unbind C-b
  • 然后设置新的前置键:set -g prefix C-s

修改快捷键

bind-key c new-window -c "#{pane_current_path}"

比如这块的修改:

  • bind-key c 表示在按下 prefix 之后按下 c 就执行后面的内容
  • new-window -c "#{pane_current_path}":这部分命令表示在当前面板的路径下创建一个新窗口。

问题就来了,如果我想要快捷键不加上 prefix 呢?我们看下面的代码:

## - fullscreen
bind -n M-f resize-pane -Z
  • bind -n M-f-n可以理解为,按下无须按下 prefix ,直接按下 meta + f 就可以执行后面的部分(meta 相当于 alt
  • resize-pane -Z :触发全屏

常用的 Tmux 命令/快捷键

Sessions

  1. 创建一个新 Sessiontmux
  2. 创建一个新 Session,并制定会话名 :tmux new -s name
  3. 查看当前存在的 Sessiontmux ls
  4. 回到最近使用的 Sessiontmux attach 或者可以简写为 tmux a
  5. 切换指定的 Sessiontmux a[ttach] [-t <session-name-or-num>]
  6. 关闭:tmux kill-session [-t <session-name-or-num>]
  7. 进入会话后退出会话:<prefix> + d

[!tip]

  • <session-name-or-num> 表示可以是 Session 名或者是 Session 编号
  • tmux kill-session 如果不指定对应的 Session 默认触发的是删除当前最后处在的 Session,不会吧当前所有的 Session 都删除
  • 第七点中的进入会话后退出会话 ,并不会中断 Session,只是脱离当前的 Session,所以此时我们可以打开新的 Session / Window 去做其他的事情,这样就可以解决我们一开始在[[#什么是 Session#场景]] 中所遇到的问题了

Windows

  1. 创建一个 Window<previx> + c
  2. 切换 Window<previx> + <num>
  3. 关闭当前 Window<previx> + &
  4. 查看(可以选择并切换对应的 WindowPanes):<previx> + w,如下图所示

Panes

  1. 左右(垂直)分屏:<prefix> + "
  2. 上下(水平)分屏:<prefix> + %
  3. 切换 Panes<prefix> + q + <num>
  4. 关闭:<prefix> + x
  5. 缩放(在对应的 Panes 触发该快捷键会放大,如果再次触发会缩小):<prefix> + z

去阴间化的配置(提升使用体验)

因为 tmux 的默认配置比较难用,所以这里我们需要自己添加一些配置来让 Tmux 更好用一些:

设置默认开启的 windows/panes 编号为1

  • 如果默认的编号为 0 的话不太好按,所以推荐设置默认的编号为 1
# Options to make tmux more pleasant
## - Solve the Vim color scheme problem
set -g default-terminal 'tmux-256color'
set -g base-index 1
set -g pane-base-index 1
set -g renumber-windows on # 关掉某个窗口后,编号重排

开启鼠标

## - mouse on
set -g mouse on

复制模式使用 vim 键位

Tmux 默认进入复制模式使用的是 Emacs 键位,推荐使用下面的配置,这样就可以在复制模式下使用 Vim 键位了

## - Visual move
set-window-option -g mode-keys vi
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

如何进入/退出复制模式

进入:

  • 使用快捷键:prefix + ]

退出:

  • 按下回车

让工作目录更好用

  • set-option default-path "$PWD"
    • 设置默认路径为启动 tmux 会话时的当前工作目录。
  • bind-key c new-window -c "#{pane_current_path}"
    • 绑定快捷键 c 用于创建新窗口,窗口会继承当前窗格的工作目录。
  • bind-key % split-window -h -c "#{pane_current_path}"
    • 绑定快捷键 % 用于水平分割窗格,新窗格会继承当前窗格的工作目录。
  • bind-key '"' split-window -v -c "#{pane_current_path}"
    • 绑定快捷键 " 用于垂直分割窗格,新窗格会继承当前窗格的工作目录。
## - Set the default path for new windows and panes to the current working directory 
set-option default-path "$PWD"

## - Open a new window with the same directory as the current pane
bind-key c new-window -c "#{pane_current_path}"

## - Split window with the same directory as the current pane
bind-key % split-window -h -c "#{pane_current_path}"
bind-key '"' split-window -v -c "#{pane_current_path}"

提升使用体验

  • alt + f:全屏
  • alt + shift + f:切换当前的布局
## - fullscreen
bind -n M-f resize-pane -Z

## - toggle layout
bind -n M-F next-layout

其他命令

  • 查看可用命令:tmux list-commands
  • 查看可用快捷键:tmux list-keys
    • 如果想要快速搜索也可以用管道配合 grep 命令的形式:tmux list-<commands | keyss> | grep <key | cmd>

除了以上命令推荐到 Tmux Cheat Sheet 上看一看常用的命令,相信就能比较快的上手了!

其他推荐安装的插件

  • tmuxifier:Session 管理工具,允许自定义 Session 中 Window 和 Pane 的排版
  • vim-tmux-navigator:使用 vim 键位在 pane 中实现来回跳转
  • tmux-yank:让在复制模式下复制的内容在剪贴板也能读取到(同样适用于服务器端)

来源与参考

[!quote]