tmux 的配置

本文参考了这篇博文,写得非常好

本文参考了这篇博文,写得非常好

1. tmux 是什么

tmux 是一套终端复用软件,它可以让你在一个窗口中打开多个子窗口,这样就不用在多个窗口中来回切换,而且可以在一个窗口中同时观察多个输出。

2. tmux 的一些术语

tmux 用一个会话 (session) 来表示一个 tmux 服务(tmux 采用 C/S 模型,输入 tmux 就相当于打开了一个服务器)。一个会话中可以打开多个窗口(window),一个窗口又可以切分成多个面板 (pane)。 tmux01

3. 会话

序号 功能 命令
1 新建会话 tmux # 新建一个无名称的会话
tmux new -s demo # 新建一个名称为demo的会话
2 断开当前会话 tmux detach
Ctrl + b + d
3 进入之前的会话 tmux a # 默认进入第一个会话
tmux a -t demo # 进入到名称为demo的会话
4 关闭会话 tmux kill-session -t demo # 关闭demo会话
tmux kill-server # 关闭服务器,所有的会话都将关闭
5 查看所有的会话 tmux list-session # 查看所有会话
tmux ls # 查看所有会话,提倡使用简写形式
tmux 中可以通过 Ctrl+b + s 打开会话列表

4. 配置

tmux 的用户级配置文件为 ~/.tmux.conf

4.1 修改指令前缘

set -g prefix C-a #
unbind C-b # C-b即Ctrl+b键,unbind意味着解除绑定
bind C-a send-prefix # 绑定Ctrl+a为新的指令前缀

# 从tmux v1.6版起,支持设置第二个指令前缀
set-option -g prefix2 ` # 设置一个不常用的`键作为指令前缀,按键更快些

# 绑定生效快捷键为r
bind r source-file ~/.tmux.conf \; display-message "Config reloaded.."

tmux 中,可以按下 prefix + r 实现配置生效

4.2 新增面板

unbind '"'
bind - splitw -v -c '#{pane_current_path}' # 垂直方向新增面板,默认进入当前目录
unbind %
bind | splitw -h -c '#{pane_current_path}' # 水平方向新增面板,默认进入当前目录

4.3 开启鼠标支持

最好不要开启,否则复制的内容共享不到系统的粘贴板中,只能在 tmux 的会话内共享

set-option -g mouse on # 支持鼠标选取文本,整面板的大小,切换面板

4.4 快速面板切换

# 绑定hjkl键为面板切换的上下左右键
bind -r k select-pane -U # 绑定k为↑
bind -r j select-pane -D # 绑定j为↓
bind -r h select-pane -L # 绑定h为←
bind -r l select-pane -R # 绑定l为→

-r 表示可重复按键,大概 500ms 之内,重复的 hjkl 按键都将有效

4.5 面板大小调整

# 绑定Ctrl+hjkl键为面板上下左右调整边缘的快捷指令
bind -r ^k resizep -U 10 # 绑定Ctrl+k为往↑调整面板边缘10个单元格
bind -r ^j resizep -D 10 # 绑定Ctrl+j为往↓调整面板边缘10个单元格
bind -r ^h resizep -L 10 # 绑定Ctrl+h为往←调整面板边缘10个单元格
bind -r ^l resizep -R 10 # 绑定Ctrl+l为往→调整面板边缘10个单元格

4.6 面板最大化

输入 tmux-prefix+z,就可以最大化当前面板至窗口大小,只要再重复输入一次,便恢复正常

4.7 窗口变为面板

join-pane -s window01 # 合并名称为window01的窗口的默认(第一个)面板到当前窗口中
join-pane -s window01.1 # .1显式指定了第一个面板,.2就是第二个面板(我本地将面板编号起始值设置为1,默认是0)

4.8 开启日志

# 绑定P键为开启日志功能,如下,面板的输出日志将存储到桌面
bind P pipe-pane -o "cat >>~/Desktop/#W.log" \; display "Toggled logging to ~/Desktop/#W.log"

5. 复制模式

序号 功能 命令
1 进入复制模式 输入 prefix + [
2 选择复制区 按下 空格键 开始复制,移动光标选择复制区域
3 复制 按下 回车键 复制选中文本并退出复制模式
4 粘贴 按下 prefix+] 粘贴文本

5.1 设置为 vi 风格

setw -g mode-keys vi # 开启vi风格后,支持vi的C-d、C-u、hjkl等快捷键

bind Escape copy-mode # 绑定esc键为进入复制模式  <--- 最好不采用
# 绑定v键为开始选择文本
bind -T copy-mode-vi v send-keys -X begin-selection
# 绑定y键为复制选中文本
bind -T copy-mode-vi y send-keys -X copy-selection-and-cancel
bind p pasteb # 绑定p键为粘贴文本(p键默认用于进入上一个窗口,不建议覆盖) <--- 最好不采用

修改后,prefix+[ 进入复制模式,通过 v, y 进行选择,按下 回车键 完成复制,prefix+] 粘贴文本

6. 使用系统粘贴板

我自己实验时是不成功的,最后通过去除 tmux 的鼠标模式实现复制粘贴

tmux 的复制是加入其进程中的 buffer 缓存中,可以在会话间共享,但不会与 Linux 系统粘贴板共享,我们通过 xclip 工具接入系统粘贴板来解决此问题

首先,需要安装 xclip

sudo apt-get install xclip

然后,修改配置:

# buffer缓存复制到Linux系统粘贴板
bind C-c run " tmux save-buffer - | xclip -i -sel clipboard"
# Linux系统粘贴板内容复制到会话
bind C-v run " tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer"

按下 prefix + Ctrl + c 键,buffer 缓存的内容将通过 xlip 程序复制到粘贴板,按下 prefix + Ctrl + v 键,tmux 将通过 xclip 访问粘贴板,然后由 set-buffer 命令设置给 buffer 缓存,最后由paste-buffer 粘贴到 tmux 会话中。

7. Tmux 优化

7.1 设置窗口面板起始序号

set -g base-index 1 # 设置窗口的起始下标为1
set -g pane-base-index 1 # 设置面板的起始下标为1

7.2 自定义状态栏

set -g status-utf8 on # 状态栏支持utf8
set -g status-interval 1 # 状态栏刷新时间
set -g status-justify left # 状态栏列表左对齐
setw -g monitor-activity on # 非当前窗口有内容更新时在状态栏通知

set -g status-bg black # 设置状态栏背景黑色
set -g status-fg yellow # 设置状态栏前景黄色
set -g status-style "bg=black, fg=yellow" # 状态栏前景背景色

set -g status-left "#[bg=#FF661D] ❐ #S " # 状态栏左侧内容
set -g status-left-length 300 # 状态栏左边长度300
set -g status-right-length 500 # 状态栏左边长度500

set -wg window-status-format " #I #W " # 状态栏窗口名称格式
set -wg window-status-current-format " #I:#W#F " # 状态栏当前窗口名称格式(#I:序号,#w:窗口名称,#F:间隔符)
set -wg window-status-separator "" # 状态栏窗口名称之间的间隔
set -wg window-status-current-style "bg=#0e665d" # 状态栏当前窗口名称的样式
set -wg window-status-last-style "fg=red" # 状态栏最后一个窗口名称的样式

set -g message-style "bg=#202529, fg=#91A8BA" # 指定消息通知的前景、后景色