简介
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
完整的配置文件在这里:
# zsh is kinda tight
set-option -g default-shell $SHELL
# copy and paster
set-option -g default-command "reattach-to-user-namespace -l zsh"
# look good
set -g default-terminal "screen-256color"
# act like GNU screen
set -g prefix C-a
unbind C-b
set -sg escape-time 1
set -g base-index 1
setw -g pane-base-index 1
bind r source-file ~/.tmux.conf \; display "Reloaded!"
bind - split-window -v
bind | split-window -h
# act like vim
setw -g mode-keys vi
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+
unbind [
bind ` copy-mode
unbind p
bind p paste-buffer
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection
# after copying to a tmux buffer, hit y again to copy to clipboard
bind y run "tmux save-buffer - | reattach-to-user-namespace pbcopy"
# resize pane
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
# enable mouse
setw -g mode-mouse on
set -g mouse-select-pane on
set -g mouse-resize-pane on
set -g mouse-select-window on
setw -g window-status-fg cyan
setw -g window-status-bg default
setw -g window-status-attr dim
setw -g window-status-current-fg white
setw -g window-status-current-bg red
setw -g window-status-current-att bright
set -g status-interval 60
set -g status-justify centre
setw -g monitor-activity on
set -g visual-activity on
set -g terminal-overrides "xterm*:XT:smcup@:rmcup@:kUPS=\eOA:kDN5=\eOB:kLFT5=\eOD:kRIT5=\eOC"
set -g history-limit 30000
setw -g alternate-screen on
set -s escape-time 50
set-window-option -g window-status-current-format "#[fg=colour235, bg=colour27]⮀#[fg=colour255, bg=colour27] #I ⮁ #W #[fg=colour27, bg=colour235]⮀"
source "/Users/lenciel/Library/Python/2.7/lib/python/site-packages/powerline/bindings/tmux/powerline.conf"