Loading... ## 前言 因为常用的环境都在服务器端,大部分的工作也都是 SSH 上服务器或者通过 vscode 的 remote-ssh 远程完成的,所以就会有 SSH 断开工作环境丢失的问题。然后几个月前了解到了 [Tmux](https://github.com/tmux/tmux/wiki) 这个终端复用工具,用了一段时间之后感觉还不错,遂对其做个记录。 ## Tmux 简介 ### 单元模块 - 服务器(server):tmux 为 C/S 模型,输入 tmux 时则代表开启了一个 tmux 服务器 - 会话(session):开启 tmux 服务后,默认新建一个会话;一个 tmux 服务器可以创建多个会话 - 窗口(window):新建一个会话后,默认新建一个窗口;一个会话可以创建多个窗口 - 窗格(pane):新建一个窗口后,默认新建一个窗格;一个窗口可以创建多个窗格 ![tmux-module](https://10101.io/usr/uploads/2021/05/2340012775.png) ### 主要功能 对于我来说,tmux 主要功能有: - 会话和窗口分离,窗口关闭,会话不结束,用以维持环境; - 窗口可以进行分割,在一个窗口不同窗格下进行不同的操作; - 基于 C/S 模型,多个客户端可以同时连接到同一个 session,方便共享; - 插件系统,方便扩展功能,如记录日志(可以不依赖终端软件了) ## Tmux 自定义配置 tmux 可以自定义配置,针对个人用户的配置文件,修改 `$HOME/.tmux.conf` 文件即可。 ### 前缀键 tmux 可以通过 `tmux + command` 的方式进行操作;也可以在进入 tmux 窗口中后通过快捷键进行操作,快捷键通过前缀键唤醒。 默认的前缀键是 `ctrl+b`,但是这个前缀键比较不友好,实际使用中有点别扭,所以我对其进行了修改。关于前缀键的选取,主要考虑的因素有是否方便敲击和是否与其他快捷键有冲突。 比较理想的按键是 `` ` `` 键,冲突少,只要敲击一个键,+ 数字键切换窗口时也很方便,但是我的 [NiZ Plum Atom66](https://10101.io/2019/12/29/consumption-in-2019) 键盘这个键很不方便,所以放弃了,最后采用的是 `ctrl+s` 键,修改如下: ```bash set -g prefix C-s unbind C-b bind C-s send-prefix ``` 关于前缀键的选取可参考如下文章 / 提问: - [为 tmux / screen 选择一个合适的引导键](https://zzz.buzz/zh/2016/03/11/choose-a-prefix-key-for-tmux-and-screen/) - [hotkeys - What's the least conflicting prefix/escape sequence for screen or tmux? - Super User](https://superuser.com/questions/74492/whats-the-least-conflicting-prefix-escape-sequence-for-screen-or-tmux) ### 常用基础选项 ```bash # 设置延时 set -sg escape-time 1 # 修改默认延时,设置为1ms,增加响应时间 # 开启鼠标模式,可以使用鼠标进行窗格大小的调整 set -g mouse on # 关闭自动改名 set-option -g allow-rename off # 开启剪贴板 set -g set-clipboard on # 设置 buffer 长度 set -g history-limit 50000 # 加载 tmux 配置文件的快捷键: prefix + r bind r source-file ~/.tmux.conf\; display "Reloaded!" ``` ### 文本复制模式 使用快捷键 `prefix + [` 可以进入 Copy 模式,使用 `Enter` 键退出,平时修改配置时习惯使用 Vim 进行操作,所以修改文本复制模式为 vi: ```bash # 开启 vi 按键 setw -g mode-keys vi set -g status-keys vi bind-key -T vi-edit Up send -X history-up bind-key -T vi-edit Down send -X history-down ``` 不过我一般不使用键盘来进行复制操作,多是进入 Copy 模式后进行屏幕搜索 ### 窗口配置 ```bash # 由于 0 键的位置,切换窗口时不好寻找,设置窗口索引从 1 开始 set -g base-index 1 # 切换窗口快捷键,在窗口间前后切换,-r 代表可以多次敲击 bind -r C-h select-window -t :- bind -r C-l select-window -t :+ # 修改默认的分割 window 快捷键,采用 | 和 - 更加形象好记 bind | split-window -h bind - split-window -v ``` ### 窗格配置 ```bash # 设备窗格索引从 1 开始 setw -g pane-base-index 1 # 选择窗格快捷键,使用 Vim 按键模式 bind h select-pane -L # 左 bind j select-pane -D # 下 bind k select-pane -U # 上 bind l select-pane -R # 右 # 调节窗格大小快捷键,使用 Vim 按键模式 bind -r H resize-pane -L 5 bind -r J resize-pane -D 5 bind -r K resize-pane -U 5 bind -r L resize-pane -R 5 # 窗格边缘显示,在窗格上方显示 pane 索引及名字 set -g pane-border-status top ``` ### 状态栏配置 ```bash # 状态栏刷新间隔 set -g status-interval 1 # 状态栏窗口居中 set -g status-justify centre # 左侧状态栏长度 set -g status-left-length 40 # 开启活动通知 setw -g monitor-activity on set -g visual-activity on ``` ### 配色 ```bash # 以 256 色显示内容 set -g default-terminal "screen-256color" # 配置窗口样式 # > 窗口列表 set -g window-status-format '#[dim]#I:#[default]#W#[fg=dim]' set -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]' # 配置窗格样式 # > 配置窗格颜色 set -g pane-border-style fg=cyan set -g pane-border-style bg=default # > 配置当前窗格颜色 set -ag pane-active-border-style fg=green set -ag pane-active-border-style bg=default # 设置命令行或消息的颜色 set -g message-style fg=white set -g message-style bg=black set -g message-style bright # 设置底部状态栏的背景色、前景色及内容 set -g status-style fg=white set -g status-style bg=default set -g status-left "#[fg=green][#[fg=cyan]#S#[fg=green]] #{prefix_highlight}" set -g status-right "#[fg=green][#[fg=cyan]%Y-%m-%d %R#[fg=green]]" ``` ### 插件配置 #### tpm tpm 为 tmux 的插件管理器,使用它可以方便的对插件进行安装和更新管理。 - 安装:`git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm` - 在 tmux 配置文件中加入以下内容: ```bash set -g @plugin 'tmux-plugins/tpm' # 初始化 tpm,注意此行加载配置文件最底部 run '~/.tmux/plugins/tpm/tpm' ``` - 绑定的快捷键: - `prefix + I`:下载配置文件中列出的插件; - `prefix + U`:更新配置文件中列出的插件; - `prefix + alt + u`: 卸载配置文件中没有的插件 后面提到的插件均使用绑定的快捷键进行下载和更新 #### tmux-logging 该插件用于日志或者屏幕记录,添加方法如下: ```bash set -g @plugin 'tmux-plugins/tmux-logging' # 设置日志保存文件夹 set -g @logging-path "$HOME/.tmux/logs" # 设置日志保存的文件名格式 set -g @logging-filename "tmux-#{session_name}-#{window_name}-#{pane_title}-%Y%m%dT%H%M%S.log" ``` 绑定的快捷键为: - `prefix + shift + p`: 记录日志,针对的是单一窗格; - `prefix + alt + p`: 屏幕捕捉; - `prefix + shift + alt + p`: 记录所有历史记录; #### tmux-resurrect 该插件用于保存会话,方便设备重启后恢复会话记录,添加内容如下: ```bash set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @resurrect-capture-pane-contents 'on' # 开启恢复窗格内容功能 set -g @resurrect-save-shell-history 'on' # 恢复 shell 环境 ``` 绑定的快捷键为: - `prefix + Ctrl-s`: 保存; - `prefix + Ctrl-r`: 恢复; #### tmux-continuum 该插件对于 tmux-resurrect 插件进行补充,用于自动备份和恢复,添加内容如下: ```bash set -g @plugin 'tmux-plugins/tmux-continuum' # 设置自动备份的时间间隔,单位为分钟 set -g @continuum-save-interval '1440' # 设置自动恢复 set -g @continuum-restore 'on' ``` #### tmux-yank 该插件用于对 tmux 的复制进行补充,可将内容复制到系统剪贴板,添加内容如下: ```bash set -g @plugin 'tmux-plugins/tmux-yank' ``` 绑定的快捷键为: - normal 模式: - `prefix + y`: 将命令行上的文本复制到系统剪贴板; - `prefix + Y`: 将当前窗格的当前路径复制到系统剪贴板; - copy 模式: - `y`: 将选取的内容复制到系统剪贴板; - `Y`: 将选取的内容复制并粘贴到命令行; #### tmux-prefix-highlight 该插件用于在状态栏显示 prefix / copy 模式状态,方便判断是否按下了前缀键,添加方法如下: ```bash set -g @plugin 'tmux-plugins/tmux-prefix-highlight' # set -g @prefix_highlight_fg 'white' # default is 'colour231' # set -g @prefix_highlight_bg 'blue' # default is 'colour04' set -g @prefix_highlight_show_copy_mode 'on' # set -g @prefix_highlight_copy_mode_attr 'fg=black,bg=yellow,bold' # default is 'fg=default,bg=yellow' set -g @prefix_highlight_show_sync_mode 'on' # set -g @prefix_highlight_sync_mode_attr 'fg=black,bg=green' # default is 'fg=default,bg=yellow' ``` ## Tmux 常用命令及快捷键 **说明**: 1. 本章节记录自己使用过程中常会用到的命令或者快捷键,上文中提到的自定义绑定的快捷键不做记录,仅记录未做修改的默认快捷键。 2. 命令可通过指定参数的方式对任何会话/窗口/窗格进行操作,而快捷键作用范围为当前会话 ### 系统篇 | 命令 | 快捷键 | 描述 | | :--------------------: | :------: | ------------------------------------------ | | `tmux list-keys` | `?` | 列出所有快捷键,查看说明 | | `tmux list-commands` | | 列出所有命令,查看参数及说明 | | | `:` | 进入命令行模式,可以输入支持的 tmux 命令 | ### 会话篇 | 命令 | 快捷键 | 描述 | | :------------------------------: | :------: | ------------------------------------ | | `tmux new-session/new` | | 创建新会话 | | `tmux attach-session/attach/a` | | 连接已有会话 | | `tmux kill-session` | | 删除会话 | | `tmux detach-client/detach` | `d` | 脱离会话,退出窗口,不删除会话 | | `tmux list-sessions` | `s` | 查看所有会话,可通过方向键进行切换 | | `tmux rename-session/rename` | `$` | 重命名会话 | ### 窗口篇 | 命令 | 快捷键 | 描述 | | :-----------------------------: | :------: | ------------------------------------------------------------ | | `tmux new-window/neww` | `c` | 创建新窗口 | | `tmux list-windows` | `w` | 列出所有窗口,可通过方向键选择窗口 | | `tmux rename-window/renamew` | `,` | 重命名窗口 | | `tmux kill-window/killw` | `&` | 删除窗口 | | | 数字键 | 切换至指定数字索引的窗口 | | `tmux swap-window` | | 交换窗口 | | `tmux move-window` | `.` | 移动窗口,相当于修改索引;命令模式可将窗口加入到不同会话中 | | `tmux setw synchronize-panes` | | 同步该窗口下所有窗格,用于同步输入内容,再次输入关闭 | ### 窗格篇 | 命令 | 快捷键 | 描述 | | :---------------------: | :-------: | -------------------------------------------------------------- | | | `%` | 水平方向创建窗格 | | | `“` | 垂直方向创建窗格 | | `tmux select-pane -T` | | 重命名窗格 | | | `q` | 显示窗格索引,当出现索引数字时,按下数字键则进入对应窗格 | | | `x` | 关闭窗格 | | | `z` | 最大化窗格 | | | `space` | 切换窗格布局 | | | `!` | 将当前窗格置于新窗口中,即新建一个窗口,窗口中只包含当前窗格 | | `tmux swap-pane -U` | `{` | 向前置换当前窗格 | | `tmux swap-pane -D` | `}` | 向后置换当前窗格 | ## 完整配置 见 [dotfiles/tmux](https://github.com/WithdewHua/dotfiles/blob/master/tmux/tmux.conf) (与上文介绍的可能有些许改动) ## 参考 - [OpenBSD manual page of tmux](http://man.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man1/tmux.1?query=tmux&sec=1) - [Tmux 配置指北](https://xpgeng.gitbooks.io/omooc2py/content/guide/Tmux-Guide.html) - [Tmux 使用手册](http://louiszhai.github.io/2017/09/30/tmux/) - [打造最强终端之二:Tmux配置及使用教程](https://kxcblog.com/post/terminal/2.tmux-tutorial/) 最后修改:2021 年 11 月 30 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏