tmux 是什么?

tmux 是一款非常好用的终端复用器

可以认为是终端分屏软件,但远远不止…
可以认为是 nohup& 的结合体,但远远不止…
可以认为是一款结对编程 ( Pair Programming ) 的软件,但远远不止…

是的,远远不止…

不知道怎么去描述,且跟随使用去体会吧

tmux 的任务会话机制

当你运行 tmux 之后,会启动一个 tmux server 来管理 tmux 的 sessions

tmux server 有且仅有一个,并且在第一个 session 创建时启动, 当最后一个 session 销毁时销毁

然后有以下几条规则:

  1. 一个 tmux server 可以有多个 sessions
  2. 一个 session 可以有多个 window , 类似终端有多个标签页
  3. 一个 window 可以有多个 pane, 即分屏

session 可译作 会话, window 可译作 窗口, pane 可译作 窗格

安装 tmux

Ubuntu 下安装 : sudo apt-get install tmux

Centos 下安装 : CentOS 下安装 tmux

tmux session

  1. 快速创建: tmux
    这样创建的 session 被自动用数字命名

  2. 创建一个命名的 session : tmux new-session -s session-nametmux new -s session-name

  3. 查看当前所有的 sessions : tmux list-sessionstmux ls

  4. 脱离当前 session : ctrl-b + d
    脱离当前 session , 你的工作状态依然保留

  5. 如果想重新进入之前的 session , 只需: tmux attach-session -t session-nametmux a -t session-name
    这样你又回看到你之前的工作进度了

  6. 当你想退出当前 session : 在终端中输入 exit, 直到所有的 window 和 pane 被关闭
    这时,你的 session 也被销毁了

  7. 杀死指定的 session : tmux kill-session -t session-name

  8. 重命名 session : ctrl-b + $

  9. 杀死所有的 session : tmux kill-server
    因为所有的 sessions 跑在一个 server 上
    所以只要关掉 tmux server 即可

tmux window

创建 window

当你创建一个 session 时,也自动创建一个 window , window 中也会自动创建一个 pane

在 session 中创建 window : 按下ctrl-b +c

切换 window

  1. 切换到下一个窗口 : ctrl-b + n

  2. 切换到上一个窗口 : ctrl-b + p

  3. 切换到num窗口,num为窗口编号,底部状态栏可看到 : ctrl-b + num

  4. 显示当前会话的所有窗口 : ctrl-b + w

  5. 关闭当前窗口 : ctrl-b + & 或者 exit 或者 ctrl + d

重命名当前窗口

按下 ctrl-b + ,
然后输入 window-name 即可

tmux pane

  1. 分割一个垂直的窗格 : ctrl-b + "

  2. 分割一个水平的窗格 : ctrl-b + %

  3. 移动到其他窗格 : ctrl-b + Arrow-Up/Down/Left/Right

  4. 关闭所有窗格 : ctrl-b + !


tmux 的复制

在没有启动鼠标滚轮时, tmux 可以通过鼠标选中,并复制

当你用了上面配置文件中的鼠标滚轮启用,那么一般的鼠标选中就不可能了:

按下 shift, 然后使用鼠标去选中想要copy的内容进行复制操作  

Copy 模式下的复制

  1. Copy 模式下的复制, 然后粘贴
    tmux 提供了一种 copy 模式,类似于 vim 的(Esc-v)模式 : 按下 ctrl-b + [ 进入 copy 模式
    tmux 的 copy 模式下有两种快捷键模式: vim 和 Emacs
    当你在配置文件中启用 vim 模式: setw -g mode-keys vi
    在 copy 模式下, 我们就可以使用 j/k/h/l 来移动光标了

  2. 复制
    在 Copy 模式下,我们这样复制:
    1. 移动光标到复制开始位置
    2. 按下 Space 键进入复制模式
    3. 移动光标选择要复制的内容
    4. 按下 Enter 键完成复制
  3. 粘贴
    到你要粘贴内容的位置, 使用快捷键 ctrl-b + ]
    刚才复制的内容已经被完美粘贴了

推荐使用 Copy 模式

如果你只是想复制不超过一行文字,那么这两种方式均可,甚至第一种方式更有效率

如果你想复制多行文本,那么还是使用Copy 模式

这和 tmux 的实现方式有关,具体请自行探讨


tmux 的配置文件

配置文件生效

配置文件生效有两种方式:

  1. 新建一个 session, .tmux.conf 中的设置就在此 session 中生效了

  2. 在当前 session 中,按下 ctrl-b + :,然后:

     : source-file ~/.tmux.conf
    

    .tmux.conf是 tmux 配置文件的命名,默认位于你的用户主目录下

一个简单的 tmux 配置文件

# This is a tmux configure file
# 取消默认Ctrl+b的前缀绑定,绑定Ctrl+s为新的快捷发送前缀方式
unbind C-o
set -g prefix C-s

# Copy模式下使用vim快捷操作方式
setw -g mode-keys vi

# split window with p/v after C-s
bind p split-window -h
bind v split-window -v

# move into left/Down/Up/Right panes with h/j/k/l after C-s
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# resize panes forward left/right/Down/Up with </>/-/+ after C-s
bind < resize-pane -L 10
bind > resize-pane -R 10
bind - resize-pane -D 10
bind + resize-pane -U 10

# bind : to command-prompt like vim
# this is the defalut in tmux already
bind : command-prompt

# 鼠标可以选中窗格
set-option -g mouse-select-pane on  
# 鼠标滚轮可以使用
set-window-option -g mode-mouse on  

# 分屏后如何保留先前窗格的路径
bind c new-window -c "#{pane_current_path}"

自动生成布局

新建一个文件 ~/.tmux/mylayout:

selectp -t 0 #选中第0个窗格
splitw -h -p 50 #将其分成左右两个
selectp -t 1 #选中第一个,也就是右边那个
splitw -v -p 50 #将右边那个分成上下两个
selectp -t 0 #选中第一个

然后在 .tmux.conf 后面添加:

bind D source-file ~/.tmux/mylayout

这样,每次当我们启动 tmux 后, 可以使用 ctrl-b + D 来生成布局


tmux 在远程服务器中的表现

如果通过 ssh 远程登录到服务器,恰好要进行一个很耗时的任务

我们不可能等待这个任务执行完毕,再去做其他工作

因此,我们选择了启用一个新的终端来完成其他工作

但是网络可能很不稳定,你那个耗时任务在执行过程,突然网络掉线,然后,你的 ssh 断掉,然后你的任务挂掉了

但是我们的任务已经进行了80%,功亏一篑

是的,你可以选择执行任务时,采用 nohup ,那样,网络断掉,也不会影响你的任务

但是你永远也回不到 案发现场

案发现场 在某些情况下很重要

而且费那么多心思在保证任务完成,现场保留上,实在太浪费了

使用 tmux 完全可以解决这个问题,除非远程服务器挂了

因此,远程工作的正确方式:

$ ssh pi@192.168.199.114 
...
Last login: Tue May  5 02:37:14 2015 from 192.168.199.104
pi@raspberrypi ~ $ tmux new-session -s code

这样,你可在 session 中进行分屏来完成其他工作
或者你可以脱离终端, 继续其他操作
再或者网络中断,当你重新连接上服务器:

...
Last login: Tue May  5 02:37:14 2015 from 192.168.199.104
pi@raspberrypi ~ $ tmux a -t code
...

你会发现,哦,我的工作现场依旧完整无缺…

结对编程

关于结对编程的概念,可以查看维基百科:

http://zh.wikipedia.org/wiki/%E7%BB%93%E5%AF%B9%E7%BC%96%E7%A8%8B

tmux 利用服务器上的同一账户的同一 tmux session 实现的

两个人打开同一个 tmux session, 一个人所做的改变,会即时的反映到另一个人的终端上

tmux 基于文本, 所以即使网速慢点也无妨


tmux 小技巧

tmux 的 command-prompt

command-prompt 是用来输入 tmux 命令的

tmux 的所有快捷键的功能都是通过命令来实现的

因此,我们也通过键入命令来实现某种功能

按下 ctrl-b + : 即可打开 command-prompt  
然后,你输入相应命令即可  

tmux 快捷键帮助

tmux 的快捷键由 send-prefix 和 bind-key 组成

按下 send-prefix 的同时,按下 bind-key 才唤醒相应的快捷功能

send-prefix 是固定的,默认是 ctrl-b

bind-key 对应不同的功能绑定了不同的 key, 可以通过以下方式查看:

按下 `ctrl-b + ?`  

重新绑定 send-prefix

更换 send-prefix 为 ctrl-a ,在 tmux 的配置文件(.tmux.conf)中这样写:

unbind C-b
set -g prefix C-a

tmux 底部状态栏

  • tmux 窗口底部就是状态栏

  • 状态栏左边显示 session-name ,并且列出当前所有 window-name ,以及所有 window 当前运行的 process-name

  • 当前所在 window 旁边会有 * 提示

  • 右边会显示主机名和时间

显示钟表

按下 ctrl-b + t, 会在当前 window 的当前 pane 显示当前时间

为 pane 显示编号—快速切换

按下 ctrl-b + q, 每一个 pane 都会出现一个数字
按下想要切换的 pane 显示的数字, 就可以切换到那个 pane

使用tmux的一些问题

tmux 和 vim的powerline插件

默认情况下,启动vim, 如果使用了 powerline 插件, 那么会发现颜色显示不正常

此时,只要你在每次打开 tmux 时启动256色即可,即 tmux -2

我们可以在 .bashrc 末尾添加:

alias tmux='tmux -2'

这样,每次使用 tmux 就会很方便啦


一些自言自语

任何时候不要太过迷信一件东西

你知道的, 服务器也会有重启的时候

及时保存你的编辑,及时提交你的修改,及时备份你的收藏,永远是明智的做法



blog comments powered by Disqus