简介
tmux
,其实就是 terminal multiplexer
的简称。使用 tmux 你可以把多个任务同时运行起来,使用不同的 tmux
窗口来查看它们。你也可以 detach
一个 session
,也就是让一个窗口的活动,比如编译这种耗时你又不希望断开的活动,放到后台去运行。如果你使用过 screen
对 detach
一个 session
应该非常熟悉。其实初用 tmux
的时候,它很大程度上就像一个 GNU-Session
外加很多窗口管理的功能。而且由于 tmux
使用了 client-server
架构,我们可以在一个总控的地方去操作所有的窗口和 pannel,甚至可以在一个窗口里面切换不同的 session
。
tmux的安装
用你的 Linux package manager 或者如果你和我一样在 OSX 可以用brew
。另外,iTerm2集成了对tmux
的支持,它也是很多 Mac 上的程序员最爱的 Terminal。
创建一个具名的Session
由于使用 tmux
可以在一个电脑上创建多个 session
,为了更好的管理它们我们一般可以使用名字来辨识这些 session
。 比如下面的命令可以创建一个叫 basic
的 session
:
$ tmux -new -s basic
回车之后就会进入一个新的 session
里面。可以看到具名的session
的terminal
和正常打开iTerm2
大致相同,没有特别之处。 这个时候我们敲exit
就会回到原来的terminal
中去。
Detaching 和 Attaching
使用tmux
一大好处就是我们可以启动terminal
,运行一个任务在后台,然后detach
这个session
。如果在一般的session
里面工作,一旦我们关闭了窗口,跑在里面的所有程序都会被退出。 但是如果是使用了detach
,我们可以再attach
回去。下面演示一个例子。
在创建的具名session
「basic」里面运行top
,然后使用Ctrl-b + d
来detach
这个session
。
首先来学习一下Ctrl+b
这样的Command Prefix
。因为tmux
是一个 terminal 管家,我们需要有一个办法告诉tmux
我们敲击的是需要tmux
处理的命令还是传给 terminal 的。如果定义了Ctrl-b
为命令前缀,就是说我们一定要先敲这个前缀,然后执行一个命令,比如d
,表示我们要detach
。要记住前缀输入之后要松开手,不要在不松手的情况下发命令给tmux
。
由于这个前缀是可以自定义的,所以后面我们记为Prefix
而不再用Ctrl-b
。
然后我们可以使用下面的命令对session
进行list
、attach
和delete
:
$ tmux ls
0: 1 windows (created Thu Sep 27 10:16:16 2012) [121x22]
basic: 1 windows (created Thu Sep 27 14:32:50 2012) [122x22]
可以看到目前有两个存活的session
,一个是刚刚创建的basic
$ tmux kill-session -t 0
杀掉我们不需要的那个
$ tmux ls
basic: 1 windows (created Thu Sep 27 14:32:50 2012) [122x22]
再次 attach 的时候可以不带-t
,因为只有basic
这个session
还活着。
$ tmux attach
后面我们可以看到在 session 之间进行切换还有更多更方便的办法。
窗口
很多时候我们都需要打开窗口运行多个任务。这种情况比较适用于tmux
的窗口概念:用起来和现代操作系统里面的tab
类似。
新建一个窗口很容易
tmux new -s windows -n shell
-s
是对session
进行命名的,-n
是用来对窗口进行命名的。
- 在当前的
session
里面新建一个窗口:Prefix+C
- 要给窗口命名:
Prefix+
- 在已有的窗口间跳转:
Prefix+n/Prefix+p
- 窗口较多的时候跳转:
Prefix+序列号
- 要关掉窗口:
exit
或者Prefix+&
- 要搜索窗口:
Prefix+f
或者Prefix+w
分栏
- 竖分:
Prefix+%
- 横分:
Prefix+"
- 在分栏中切换:
Prefix+o
- 在分栏中切换:
Prefix+方向键
- 在不同的布局间切换:
Prefix+space
- 关闭:
Prefix+x
命令行模式
Prefix+:
取得所有的快捷键
Prefix+?
二、配置 tmux
首先在系统设置里面把CapsLock
这枚废材按键 map 成ctrl
。然后是把 Prefix 配置成ctrl+a
而不是ctrl+b
,这样主要是为了按起来方便顺手。
另外可以让窗口的序列号从 1 开始分配,这样初始窗口不会是 0,那个你需要手伸很远才能按到的键。
set -g base-index 1
同理分栏的序列号也可以从 1 开始:
setw -g pane-base-index 1
另外一般需要把发送命令的延迟设置为没延迟
set -sg escape-time 1
完整的配置文件在这里: