Loading... ## 简介 tmux是一款优秀的终端复用软件,其之所以受人们喜爱,主要得益于以下功能: - 丝滑分屏(split),虽然iTem2也提供了横向和竖向分屏功能,但这种分屏功能非常拙劣,完全等同于屏幕新开一个窗口,新开的pane不会自动进入到当前目录,也没有记住当前登录状态。这意味着如果我ssh进入到远程服务器时,iTem2新开的pane中,我依然要重新走一遍ssh登录的老路(omg)。tmux就不会这样,tmux窗口中,新开的pane,默认进入到之前的路径,如果是ssh连接,登录状态也依旧保持着,如此一来,我就可以随意的增删pane,这种灵活性,好处不言而喻。 - 保护现场(attach),即使命令行的工作只进行到一半,关闭终端后还可以重新进入到操作现场,继续工作。对于ssh远程连接而言,**即使网络不稳定也没有关系,掉线后重新连接,可以直奔现场,之前运行中的任务,依旧在跑,就好像从来没有离开过一样**;特别是在远程服务器上运行耗时的任务,tmux可以帮你一直保持住会话。如此一来,你就可以随时随地放心地进行移动办公,只要你附近的计算机装有tmux(没有你也可以花几分钟装一个),你就能继续刚才的工作。 - 会话共享(适用于结对编程或远程教学),将 tmux 会话的地址分享给他人,这样他们就可以通过 SSH 接入该会话。如果你要给同事演示远程服务器的操作,他不必直勾勾地盯着你的屏幕,借助tmux,他完全可以进入到你的会话,然后静静地看着他桌面上你风骚的键盘走位,只要他愿意,甚至还可以录个屏。 - **会话的自动保存与恢复**, 在习惯了在一个会话中开启很多不同的窗口与面板进行各个项目工作后,如果会话被异常结束由于各种原因(机器重启或者异常操作), 在机器恢复后, 可以直接还原会话内容: 各个pannel内的程序停止时的会话路径/历史输出都会被恢复 以上,只是主要功能,还有更多功能可以自由探索: 可以参考[这里](https://louiszhai.github.io/2017/09/30/tmux/) 接下来我们将介绍快速配置&使用tmux。 ## 安装 在各个主要平台的安装方法 mac: HomeBrew ``` # 支持各种开源/免费软件 # 可以自由升级软件到最新版本 $ brew install tmux ``` ubuntu: apt ``` # 不同发行版安装的版本可能不同 # 且大多非最新版本 $ sudo apt-get install tmux ``` 其它: annaconda3/miniconda3 如果存在如上的Python环境, 可以通过conda直接安装最新版本的tmux, 并将conda的bin路径加入到Path环境变量中 ``` # 当前最新v3.3 $ conda install -c conda-forge tmux $ conda install -c "conda-forge/label/cf201901" tmux $ conda install -c "conda-forge/label/cf202003" tmux $ conda install -c "conda-forge/label/gcc7" tmux ``` 参考: - https://anaconda.org/conda-forge/tmux ## 推荐配置 工作中推荐的配置, 适配最新v3.3版本; 需要注意, 不同的tmux版本, 支持的配置项/配置参数可能存在差异,导致无效/不兼容问题! ```shell vim ~/.tmux.conf """ #保存在个人home目录下 .tmux.conf #取消默认的设定键 unbind C-b unbind & unbind % unbind w unbind '"' #Escape键 set -g prefix C-a #解决bash ctrl a冲突问题 bind a send-prefix # 绑定快捷键为r bind r source-file ~/.tmux.conf \; display-message "Config reloaded.." #窗口切分快捷键 bind / split-window -h -c "#{pane_current_path}" bind - split-window -v -c "#{pane_current_path}" bind K confirm-before -p "kill-window #W? (y/n)" kill-window bind '"' choose-window bind c new-window -c "#{pane_current_path}" #Pane之间切换的快捷键 # 注意: # -r,表可重复按键 约500ms内连续有效 # -r 可取消 bind h select-pane -L # 绑定k为↑ bind j select-pane -D # 绑定j为↓ bind k select-pane -U # 绑定h为← bind l select-pane -R # 绑定l为→ #Pane大小调整快捷键 # 注: -r 参数同上 #bind -r < resize-pane -L 5 #bind -r > resize-pane -R 5 #bind -r _ resize-pane -D 5 #bind -r + resize-pane -U 5 bind < resize-pane -L 5 bind > resize-pane -R 5 bind _ resize-pane -D 5 bind + resize-pane -U 5 # 鼠标支持 tmux<2.1 #setw -g mouse-resize-pane on #setw -g mouse-select-pane on #setw -g mouse-select-window on #setw -g mode-mouse on # 鼠标支持 tmux>=2.1(四合一) #set-option -g -q mouse on #设置window属性 #setw -g window-status-current-bg red #setw -g window-status-current-fg white #setw -g window-status-current-attr bright #setw -g window-status-attr bright #[fg=cyan,dim]#I# .... setw -g window-status-format '#[fg=red,dim]#I#[fg=blue] #[default]#W#[fg=grey,dim]' setw -g window-status-current-format '#[fg=red,dim]#I#[fg=blue] #[default]#W#[fg=grey,dim]' # 设置window重命名 setw -g automatic-rename off setw -g allow-rename off #设置状态栏 #set -g status-utf8 on set -g status-left "" set -g status-left-length 0 set -g status-interval 2 set -g status-fg white set -g status-bg blue set -g status-right "%Y/%m/%d %H:%M" set -g default-terminal "screen" #设置默认shell set -g default-shell /bin/zsh # extend for active window and panel setw -g window-status-current-fg white #setw -g window-status-current-bg red #setw -g window-status-current-attr bright # #set -g pane-active-border-fg white #set -g pane-active-border-bg yellow # extend for active window and panel v=3.3a set -g pane-active-border-style fg=white,bg=yellow setw -g window-status-current-style fg=white,bg=red,bright #设置滚屏,屏幕历史长度 set -g history-limit 50000 set -g terminal-overrides 'xterm*:smcup@:rmcup@' setw -g mode-keys vi #setw -g utf8 on #其他设置 set -sg escape-time 0 #窗口的初始序号;默认为0,这里设置为1 set-option -g base-index 1 # tmux 会话保存与恢复 #git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm set -g @plugin 'tmux-plugins/tpm' set -g @plugin 'tmux-plugins/tmux-resurrect' set -g @plugin 'tmux-plugins/tmux-continuum' set -g @continuum-save-interval '15' set -g @continuum-restore 'on' set -g @resurrect-capture-pane-contents 'on' run -b '~/.tmux/plugins/tpm/tpm' #tmux source ~/.tmux.conf """ ``` 关于会话的自动保存与恢复, 需要做额外的安装/配置 ``` # 1. 安装tpm $ git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm # 2. 刷新配置 $ tmux source ~/.tmux.conf # 3. 进入会话, 执行如下操作 # 键盘输入如下: PREFIX这里为ctrl+a # PREFIX + I (大写的i): 安装插件 # PREFIX + Ctrl s:保存会话 # PREFIX + Ctrl r:加载会话 ``` ## 常用命令与快捷键 ``` # tmux 版本 $ tmux -V # tmux 新建一个名为test的会话 tmux new -s test # tmux 退出会话 # PREFIX + d # tmux 重新进入会话 # -d: 已经存在其它终端连接此会话时, 会被同时结束 tmux a -d # 进入最近的上一个会话 tmux a -d -t test # 进入test会话 # 关闭指定名称会话 $ tmux kill-session -t session_name ``` 修改后的快捷键说明 1. tmux 全局前缀快捷键(下文用prefix表示)修改 - 默认 ctrl+b - 修改为ctrl+a 2. 面板切分&切换&关闭 - 水平切分: 默认 prefix, shift + |; 修改为prefix, / - 垂直切分: 默认 prefix, shift + %; 修改为prefix, - - 面板间切换: prefix, [上下左右方向键] - 特别的: prefix, o 循环切换 - 最大化[还原]当前面板: prefix, z - 关闭当前一个面板: prefix, x - 需要输入y确认 - 调整面板大小: prefix, <> 或 shift +- 3. 窗口创建&切换&关闭&重命名 - 创建: prefix, c - 关闭: prefix, & - 切换: prefix, 0-9 - 修改后窗口从1开始编号, - 特别的 prefix, p/n 循环切换 - **重命名: prefix + ,** 4. 选择并且换会话(同时开启多个会话使用) - 会话内执行: prefix, s (上下键或者数字键选择) 5. 文本复制模式 - 需求:tmux panel控制台输出的信息需要大批量复制/导出 - 配置项: set-window-option -g mode-keys vi #可以设置为vi或emacs - 复制模式步骤: - prefix + [ 进入复制模式 - 移动鼠标到要复制的区域 (移动鼠标时可用vim的搜索功能"/","?") - 空格键开始选择复制区域(连续区域);全部选择后按回车键退出 - 最后, vi/vim新建/编辑文件, 进入编辑模式后, prefix + ] 完成粘贴 6. 其他使用技巧 - 小圆点取消(一个会话多个终端连接时, 以最小的为准, 其他区域填充小圆点); 很实用!!! - [fail] 断开其他连接(会话内): prefix, : a -d - [ok] 断开其他连接(会话外): tmux a -d -t session_name - 屏幕滚动 - 查看输出历史(上下滚屏): prefix, PgDn, PgUp(或上下键) - 退出此状态: Esc + 回车键 THE END 本文作者:将夜 本文链接:https://zoe.red/2023/20.html 版权声明:本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。 最后修改:2024 年 01 月 09 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏