本文参考了这篇博文,写得非常好
1. tmux 是什么
tmux 是一套终端复用软件,它可以让你在一个窗口中打开多个子窗口,这样就不用在多个窗口中来回切换,而且可以在一个窗口中同时观察多个输出。
2. tmux 的一些术语
tmux 用一个会话 (session) 来表示一个 tmux 服务(tmux 采用 C/S 模型,输入 tmux 就相当于打开了一个服务器)。一个会话中可以打开多个窗口(window),一个窗口又可以切分成多个面板 (pane)。
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 之内,重复的h
、j
、k
、l
按键都将有效
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" # 指定消息通知的前景、后景色