10x 程序员之 tmux

Preface

日常的工作当中,总是免不了同时进行多个终端任务的情况。典型的是 
SSH
 到线上的不同主机,查看日志信息等。面对这种情况,开启一堆的终端(如下图所示),单窗口切换就让人晕头转向,更不用说不小心关了窗口后还得重复之前的工作。出现这种烦恼之后,就尝试看看有没有什么东西可以帮助解决这个问题题,经过一翻折腾,最后 
tmux
 优雅的出现了。


Tmux

tmux is a terminal multiplexer.

Tmux可以在一个  terminal
终端窗口中管理多个  session
会话,多个  session
之间轻松的切换, 同时  tmux
的  session
会话可以在多个  terminal
终端之间共享和复用。 tmux
以  deamon
线程在后台运行一个  server
,所有的  session
由该线程进行维护和管理,使得  session
与  terminal
终端分离。

会话 (Session)

  session即会话,当使用  terminal
建立与主机的连接后,也就是建立了一个  session
。传统的  terminal
终端与  session
1:1
绑定, session
随着  terminal
的开启与关闭而建立和终止。 tmux
中的会话与终端无任何关系, terminal
的角色只是一个通信的工具。 tmux
中的  session
是一个  server
对应多个  session
的  1:N
的模式,如下图所示。


新建会话 (New)

  • 不指定名称,直接执行  tmux
    命令,此时自动分配一个  session
    数字名称,从  0
    开始递增;
  • 指定名称,执行  tmux new -s
    , 此时  session
    就具有一个易于辩识的名称;

脱离会话 (Detach)

  • 命令式: 处于  session
    内时,直接在执行命令  tmux detach
    ,即可使  session
    进入后台运行;
  • Ctrl+b d
    Ctrl
    b
    d
    

tmux的快捷键采用  Ctrl+b
的组合方。

查看会话 (List)

脱离会话后,若想查看后台运行的会话,则可使用 list
相关的命令,以列表的形式展示会话。

tmux list-sessions  // 标准命令
tmux ls // 简写命令

重命名会话 (Rename)

有时我们可能在一个 session
中,做多件事情或者重新建立连接到新的主机,这里可能会话名称有可能无法表达对应的意思,从而有了更名的需要。 tmux
为我们提供两种更名方式,如下:

  • 命令式:  tmux rename -t
  • 快捷键:  ctrl+b $,

进入会话 (Entry)

session进入使用的命令是  attach
, 使用  attch
后,就可把后台运行的  session
唤回前台执行。

tmux attach-session                   // 进入最近脱离的一个 session 会话
tmux attach-session // 进入指定的 session 会话

不能在一个 session
中  attach
另外一个  session
,   tmux
不支持  session
的嵌套使用。

销毁会话 (Destroy)

tmux的  session
可以脱离  terminal
终端存活,所以  session
的结束不会随着终端的关闭而结束, session
的结束需要执行特定的命令方可。

tmux kill-session -t  	// 在任意的 terminal 终端中执行即可
exit // 这个只针对于结束当前 session

切换会话 (Switch)

当在一个 session
执行任务时,如果想切换到别的  session
时,可采用快捷键进行切换,而不用退出后再重新进入。

ctrl+b (  	// 前一个会话
ctrl+b ) // 下一个会话
ctrl+b L // 最后一个会话
ctrl+b s // 列出所有会话

Ctrl+b s
列出会话后,需要使用  h j k l
或者方向键进行选择,然后  Enter
键进入。

窗体 (Window)

tmux的一个  session
支持多个  window
session
与  windonw
之间的关系如下图所示。


创建窗体 (New)

session中的  window
可以简单的对应为一个  terminial
终端的展示界面,因为每个  window
使用时,它独占了整个  terminal
的展示界面。 window
的创建有如下两种方式:

  • 命令式:  tmux new-window
  • 快捷键:  ctrl+b c

窗体切换 (Switch)

window的切换命令综合如下:

ctrl+b p 		// 前一个
ctrl+b n // 下一个
ctrl+b // 这儿的 代表数字,切换到对应数字的窗体
ctrl+b w // 列表展示出所有的窗体
ctrl+b l // 切换到最一个会话
ctrl+b & y // 关闭当前窗体
ctrl+b ' // 代表窗体的编号

窗格格 (Pane)

tmux的  window
也可再切分成更小的单元,那就是  pane
窗格。 pane
可以在一个  window
中同时展示多个不同的内容, 如图所示。


窗格操作 (Operation)

ctrl+b % 		// 垂直分割
ctrl+b " // 水平分割
ctrl+b o // 窗格间按顺序切换
ctrl+b ↑ | ↓ | ← | → // 向指定方向切换
ctrl+b Space // 重新调整窗格大小
ctrl+b z // 当前窗格最大化
ctrl+b x // 关闭当前窗格

配置 (Config)

窗格绑定 (Bind)

   软件的修改化使用始终是离不开配置文件, tmux
使用  ~/.tmux.conf
为配置文件。如果你是一个  Vim
的重度使用者,那么在  pane
的切换时,肯定不习惯方向键的使用,而偏向于  h j k l
进行导航。而  tmux
也支持此功能,仅需在配置文件中加入下面的绑定语句就可。

# hjkl pane traversal
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

如果你在修改配置文件前没有启动 tmux
的话,你修改配置文件后马上就生效,但是如果你是在  tmux
运行当中修改的话,还需要执行命令加载配置文件,命令如下:

ctrl+b :, source-file ~/.tmux.conf

复制粘贴 (copypaste)

tmux支持的复制功能比较强大与方便,需启用  vi
模式的支持。修改  ~/.tmux.conf
配置文件,添加如下配置。

# vi copypaste mode
set -g mode-keys vi

  复制粘贴模式流程如下:

1. `ctrl+b [`  	// 进入复制粘贴模式
2. `space` // 开始选择内容
3. `enter` // 复制内容
4. `ctrl+b ]` // 粘贴内容

进入文本复制和粘贴模式,可以使用相关的 Vim
命令进行操作,快捷而高效。

Appendix