@Lenciel

tmux: Introduction and Tips

Don't touch me

简介

tmux ,其实就是 terminal multiplexer 的简称。使用 tmux 你可以把多个任务同时运行起来,使用不同的 tmux 窗口来查看它们。你也可以 detach 一个 session,也就是让一个窗口的活动,比如编译这种耗时你又不希望断开的活动,放到后台去运行。如果你使用过 screendetach 一个 session 应该非常熟悉。其实初用 tmux 的时候,它很大程度上就像一个 GNU-Session 外加很多窗口管理的功能。而且由于 tmux 使用了 client-server 架构,我们可以在一个总控的地方去操作所有的窗口和 pannel,甚至可以在一个窗口里面切换不同的 session

tmux的安装

用你的 Linux package manager 或者如果你和我一样在 OSX 可以用brew。另外,iTerm2集成了tmux的支持,它也是很多 Mac 上的程序员最爱的 Terminal。

创建一个具名的Session

由于使用 tmux 可以在一个电脑上创建多个 session ,为了更好的管理它们我们一般可以使用名字来辨识这些 session 。 比如下面的命令可以创建一个叫 basicsession

$ tmux -new -s basic

回车之后就会进入一个新的 session 里面。可以看到具名的sessionterminal和正常打开iTerm2大致相同,没有特别之处。 这个时候我们敲exit就会回到原来的terminal中去。

Detaching 和 Attaching

使用tmux一大好处就是我们可以启动terminal,运行一个任务在后台,然后detach这个session。如果在一般的session里面工作,一旦我们关闭了窗口,跑在里面的所有程序都会被退出。 但是如果是使用了detach,我们可以再attach回去。下面演示一个例子。

在创建的具名session 「basic」里面运行top,然后使用Ctrl-b + ddetach这个session

首先来学习一下Ctrl+b这样的Command Prefix。因为tmux是一个 terminal 管家,我们需要有一个办法告诉tmux我们敲击的是需要tmux处理的命令还是传给 terminal 的。如果定义了Ctrl-b为命令前缀,就是说我们一定要先敲这个前缀,然后执行一个命令,比如d,表示我们要detach。要记住前缀输入之后要松开手,不要在不松手的情况下发命令给tmux

由于这个前缀是可以自定义的,所以后面我们记为Prefix而不再用Ctrl-b

然后我们可以使用下面的命令对session进行listattachdelete

$ 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"

欢迎留言