Kane BlueriverKane Blueriver

Tmux 简易配置

Tmux 名字取自“Terminal Multiplexer”,读作“T-马克思”,是一个能够终端窗口中提供多终端会话管理的应用,它可以在后台保持多个终端会话的运行,并在合适的时候 attach 或者 detach 会话,以达到保持和切换会话的作用。

Tmux 的竞争对手有 GNU Screen,我没有过 Screen 的使用经验,但是根据搜索的结果 BSD 协议的 Tmux 似乎要更加自由和强大。

Tmux 基本概念

  • session 是 Tmux 的最高层级,一个 session 可以包含多个 window;
  • window 是 Tmux 的第二层级,一个 window 可以包含多个 pane;
  • Tmux 中 buffer 概念和 Vim 类似,用于保存复制或剪切的文本或命令输出,使用 Prefix+[ 进入复制模式时就会遇到选择缓冲区和剪贴板缓冲区。

Pane(面板)

如果你用过 Vim 之类的编辑器肯定不会对 Pane 概念感到陌生,Tmux 也支持类似的概念,支持横向和纵向切割面板功能。

功能命令
水平切割(上下两半)Prefix + "
竖直切割(左右)Prefix + %
调整面板宽度/高度Prefix - 方向键

窗口(window)

窗口的层级要高于面板,作用类似于标签页,默认会在终端的底部显示窗口列表。

功能命令
创建新窗口Prefix + c
重命名窗口Prefix + $
切换到某个窗口Prefix + 窗口 ID

会话(session)

会话的层级更高于窗口,在终端输入 tmux 会创建并进入一个新的会话,你可以使用会话来区分 使用者或者任务。

功能命令
创建并进入新会话tmux
进入未关闭的会话tmux attach 会话名
退出但保留当前会话Prefix + d
列出所有会话Prefix + s
重命名当前会话Prefix + $

Tmux Prefix(prefix)

Tmux 使用 Prefix 以将自身的快捷键与其它应用区分,运行 Tmux 快捷键时首先按下这个 Prefix(默认是 Ctrl-b 组合键),松手后紧接着按下对应操作的快捷键。

比如,如果我想要列出所有的 Tmux 会话(对应快捷键是 s)需要这样:

  1. 按下 Ctrl-b 组合键(默认 Prefix );
  • 放开 Ctrl-b
  • 按下 s 键。

Tmux 配置文件的默认地址是 ~/.tmux.conf,每次启动 Tmux 时都会加载该文件。

修改 Prefix( Prefix )

Tmux 的配置未见位置是 ~/.tmux.conf,修改 Tmux Prefix 首先需要取消绑定原有的的 Prefix ; 再设置新的 Prefix,这里以 Ctrl-w 为例:

unbind C-b
set -g prefix C-w

Tmux 基本操作

Tmux 基本操作是以 Prefix + 操作 的方式进行的,比如 Prefix+c 会创建一个新的窗口,或者 Prefix+: 进入命令模式直接输入命令。大体可以分为:

  • 会话操作:
    • 增加会话:tmux new -s 会话名
    • 列出会话:tmux ls
    • 进入会话:tmux attach -t 会话名
    • 退出会话:tmux detach
  • 窗口操作:
    • 创建窗口:Prefix + c
    • 切换窗口:Prefix + 窗口 ID
    • 重命名窗口:Prefix + $
    • 关闭窗口:Prefix + &
  • 面板操作:
    • 水平切割:Prefix + "
    • 竖直切割:Prefix + %
    • 切换面板:Prefix + 方向键
    • 关闭面板:Prefix + x
    • 调整面板宽度/高度:Prefix + 方向键
  • 其它:
    • 重新加载配置文件:Prefix + r
    • 列出所有快捷键:Prefix + ?
    • 列出所有会话:Prefix + s
    • 安装插件:Prefix + I
    • 卸载插件:Prefix + u
    • 窗口/面板转换:Prefix + !
    • 横向/纵向布局转换:Prefix + space

更多操作可以参考 Tmux CheatSheet

绑定快捷键

Tmux 快捷键绑定的命令是 bind 快捷键 作用,即可将“作用”绑定在 Prefix +快捷键 上, 下面这行配置会将“重新加载”配置文件的操作绑定在快捷键 R 上:

bind R source-file ~/.tmux.conf \; display-message "Config reloaded..."

类 Vim 的文字选择和复制方式

选中和复制文字

你需要添加以下配置:

#(进入复制模式后)输入 'v' 开始选择
bind-key -t vi-copy v begin-selection
# 将选中文字添加到系统的剪贴板中
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

结对编程

tmux 有个特性,不管多少人连进同一个 tmux 会话,他们看到和操作的都是同一个东西,会话的长宽取决于输出的长款的最小值,因此可以用来进行结对编程练习。如果你想要临时和别人一起使用 tmux,可以使用 tmate 来创建共享会话:

Tmate 与远程会话共享

首先你需要安装 Tmate

brew install tmate

Ubuntu:

sudo apt-get install software-properties-common && \
sudo add-apt-repository ppa:tmate.io/archive    && \
sudo apt-get update                             && \
sudo apt-get install tmate

输入 tmate 将会创建一个公开的远程会话(会话的底部会出现提示“[tmate] Remote session: ssh [some hash]@ny.tmate.io”),将 ssh 的地址发送给你的朋友就可以分享你的会话了!

Vim 兼容问题

主题冲突问题

如果你跟我一样使用 Vim 作为编辑器,可能同样会遇到输出黑块的问题。解决方案是在 Vim 的配置文件中加入:

if exists('$TMUX')
  set term=screen-256color
endif

在 Tmux 中遇到 Vim 主题颜色问题也可以在 .tmux.conf 配置中加入:

# set -g default-terminal "screen-256color"
set-option -sa terminal-overrides ",xterm*:Tc"

UI 主题

推荐一些主题:

关闭终端时自动保存和恢复会话

关闭 Tmux 会话所在 Terminal 窗口时不会自动关闭会话,可以在新窗口中使用 tmux attach 命令恢复会话。

插件安装和管理

推荐使用 TPM(Tmux Plugin Manager)来管理插件,TMP 的安装方法见 https://github.com/tmux-plugins/tpm#installation

配置示例和推荐

一个简单的配置

# 配置 Vim 颜色兼容
set-option -sa terminal-overrides ",xterm*:Tc"
# 配置鼠标控制,可能需要 terminal 支持
set -g mouse on

# 插件,默认是从 GitHub 寻找对应 repo
set -g @plugin 'tmux-plugins/tpm'
set -g @plugin 'tmux-plugins/tmux-sensible'

set -g @plugin 'catppuccin/tmux'
set -g @plugin 'christoomey/vim-tmux-navigator'

# 控制区管理插件
set -g @plugin 'tmux-plugins/tmux-yank'

# set vi-mode
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

# 窗口切换快捷键
bind-key -n C-H previous-window
bind-key -n C-L next-window

# 设置窗口从 1 开始而不是默认的 0,这样就可以使用 1-9 来切换窗口了,0 离其它键太远了
set -g base-index 1
set -g pane-base-index 1
set-window-option -g pane-base-index 1

# 新建窗口时设置为当前目录
bind '"' split-window -v -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"


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

Oh My Tmux

也可以试试 Oh My Tmux! 这个开箱即用的方案,或者仅作为个人配置的参考。

参考链接