..

tmux命令的使用

介绍

tmux 应该是 “terminal multiplexer” 的缩写,是用来进行终端复用的。不过日常开发时,我更喜欢使用多标签。但是一旦需要在远程服务器上执行时长比较长的命令的时候,那就不得不使用 tmux 了。因为它是在服务器上启动一个 tmux 后台进程在维系终端的使用,即便你跟服务器之间的 ssh 连接断开了,也不影响命令的执行。

日常实在是少用,所以把一些"常用",又经常忘记的用例记录一下。

用例

进入"滚动模式"

在 tmux 里,你会发现上下键无法滚动终端输出。tmux 需要在 copy-mode 下,才能进行滚动,进而查看命令的输出。

C-b + [ 进入 copy-mode。这时候就可以用上下键,或者类似 Emacs 可以使用 C-sC-r 进行搜索。

要退出 copy-mode 只需要按下 q 即可退出。

窗格管理

  • C-b + % 左右分屏
  • C-b + " 上下分屏
  • C-b + x 关闭分屏,需要再按下 y 进行确认
  • C-b + o 进行循环切换分屏,这个操作跟 emacs 类似
  • C-b + ; 切换到上一个窗格,; 就在字母 l 旁边。跟切换到上一个窗口的快捷键类似
  • C-b + q 会显示每个窗格的编号,然后按对应数字,即可跳转过去。其编号顺序跟 emacs 类似
  • C-b + z 切换窗格的进入或退出全屏模式
  • C-b + { 跟上一个窗格对换
  • C-b + } 跟下一个窗格对换

窗口管理

  • C-b + c 新建
  • C-b + , 重命名
  • C-b + number 切换到对应的窗口
  • C-b + l 切换到上次切换的窗口
  • C-b + & 关闭窗口
  • C-b + f 按关键字搜索窗口(跨 session)
  • C-b + ' 按关键字搜索并跳转到某个窗口。这个没有任何交互,只需要输入可以唯一确认一个 window 的字符即可。

session 切换

  • C-b + s 进入 session 列表。选择之后,可以切换。可以用数字选中、也可以是光标移动按回车选中。
  • C-b + L 切换到上一个 session。

滚动

tmux 并不支持鼠标滚动上翻历史输出结果。tmux 用的是一个叫 “copy mode” 的方式来替代。

  • C-b [ 进入 copy mode。这时候可以使用类 emacs 的快捷键来翻页、搜索目标文本
  • 按下 q 即可退出 copy mode。如果没有文本要复制,这样做即可退出 copy mode。
  • 按下 Ctrl + Space 进入选择文本、按下 Alt + w 复制文本并退出 copy mode。行为跟 emacs 几乎一致。
  • 按下 C-b ] 粘贴前面复制的文本。

改键

个人习惯用 C-b 来左移光标。这跟 tmux 的 Prefix 的默认快捷键冲突了。所以对 Prefix 进行了改键。

~/.tmux.conf 里写入如下内容:

unbind C-b
set-option -g prefix C-x
bind-key C-x send-prefix

TERM 环境变量

tmux 的 TERM 默认是 screen。这会导致 vim 里粘贴代码缩进错乱,深层原因不明。可以把 TERM 的值设置成 xterm-256color~/.tmux.conf 配置如下:

set -g default-terminal "xterm-256color"

清爽的使用方式

使用 tmux 如果不及时清理,就会用着用着出现一大堆 session,看起来不清爽,也占资源。个人梳理了一个自适用的流程来:

  1. 每次准备新建 session 前,可以先查询一下有什么 session。执行 tmux ls
  2. 如果发现可以复用的 session,就 attach 这个 session。 执行 tmux attach-session -t <session-name>
  3. 如果没有可以复用的 session,才新建 session。使用 tmux new -s <session-name> 来新建一个有名字的 session。如果不小心创建了一个匿名的 session,进入 session 之后,也可执行 C-x $(即,rename current session 命令)来重命名 session。
  4. 确认 session 所执行的任务完成后,要及时清理掉对应的 session。执行 tmux kill-session -t <session-name>