用 tmux 保存工作现场
- tmux 是什么?
- tmux 的任务会话机制
- 安装 tmux
- tmux session
- tmux window
- tmux pane
- tmux 的复制
- tmux 的配置文件
- tmux 在远程服务器中的表现
- 结对编程
- tmux 小技巧
- 使用tmux的一些问题
- 一些自言自语
tmux 是什么?
tmux
是一款非常好用的终端复用器
可以认为是终端分屏软件,但远远不止…
可以认为是 nohup
和 &
的结合体,但远远不止…
可以认为是一款结对编程 ( Pair Programming ) 的软件,但远远不止…
是的,远远不止…
不知道怎么去描述,且跟随使用去体会吧
tmux 的任务会话机制
当你运行 tmux
之后,会启动一个 tmux server 来管理 tmux 的 sessions
tmux server 有且仅有一个,并且在第一个 session 创建时启动, 当最后一个 session 销毁时销毁
然后有以下几条规则:
- 一个 tmux server 可以有多个 sessions
- 一个 session 可以有多个 window , 类似终端有多个标签页
- 一个 window 可以有多个 pane, 即分屏
session
可译作 会话
, window
可译作 窗口
, pane
可译作 窗格
安装 tmux
Ubuntu 下安装 : sudo apt-get install tmux
Centos 下安装 : CentOS 下安装 tmux
tmux session
-
快速创建:
tmux
这样创建的 session 被自动用数字命名 -
创建一个命名的 session :
tmux new-session -s session-name
或tmux new -s session-name
-
查看当前所有的 sessions :
tmux list-sessions
或tmux ls
-
脱离当前 session :
ctrl-b + d
脱离当前 session , 你的工作状态依然保留 -
如果想重新进入之前的 session , 只需:
tmux attach-session -t session-name
或tmux a -t session-name
这样你又回看到你之前的工作进度了 -
当你想退出当前 session : 在终端中输入
exit
, 直到所有的 window 和 pane 被关闭
这时,你的 session 也被销毁了 -
杀死指定的 session :
tmux kill-session -t session-name
-
重命名 session :
ctrl-b + $
-
杀死所有的 session :
tmux kill-server
因为所有的 sessions 跑在一个 server 上
所以只要关掉 tmux server 即可
tmux window
创建 window
当你创建一个 session 时,也自动创建一个 window , window 中也会自动创建一个 pane
在 session 中创建 window : 按下ctrl-b +c
切换 window
-
切换到下一个窗口 :
ctrl-b + n
-
切换到上一个窗口 :
ctrl-b + p
-
切换到num窗口,num为窗口编号,底部状态栏可看到 :
ctrl-b + num
-
显示当前会话的所有窗口 :
ctrl-b + w
-
关闭当前窗口 :
ctrl-b + &
或者exit
或者ctrl + d
重命名当前窗口
按下 ctrl-b + ,
然后输入 window-name 即可
tmux pane
-
分割一个垂直的窗格 :
ctrl-b + "
-
分割一个水平的窗格 :
ctrl-b + %
-
移动到其他窗格 :
ctrl-b + Arrow-Up/Down/Left/Right
-
关闭所有窗格 :
ctrl-b + !
tmux 的复制
在没有启动鼠标滚轮时, tmux 可以通过鼠标选中,并复制
当你用了上面配置文件中的鼠标滚轮启用,那么一般的鼠标选中就不可能了:
按下 shift, 然后使用鼠标去选中想要copy的内容进行复制操作
Copy 模式下的复制
-
Copy 模式下的复制, 然后粘贴
tmux 提供了一种 copy 模式,类似于 vim 的(Esc-v)模式 : 按下ctrl-b + [
进入 copy 模式
tmux 的 copy 模式下有两种快捷键模式: vim 和 Emacs
当你在配置文件中启用 vim 模式:setw -g mode-keys vi
在 copy 模式下, 我们就可以使用j/k/h/l
来移动光标了 - 复制
在 Copy 模式下,我们这样复制:- 移动光标到复制开始位置
- 按下
Space
键进入复制模式 - 移动光标选择要复制的内容
- 按下
Enter
键完成复制
- 粘贴
到你要粘贴内容的位置, 使用快捷键ctrl-b + ]
刚才复制的内容已经被完美粘贴了
推荐使用 Copy 模式
如果你只是想复制不超过一行文字,那么这两种方式均可,甚至第一种方式更有效率
如果你想复制多行文本,那么还是使用Copy 模式
这和 tmux 的实现方式有关,具体请自行探讨
tmux 的配置文件
配置文件生效
配置文件生效有两种方式:
-
新建一个 session,
.tmux.conf
中的设置就在此 session 中生效了 -
在当前 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 就会很方便啦
一些自言自语
任何时候不要太过迷信一件东西
你知道的, 服务器也会有重启的时候
及时保存你的编辑,及时提交你的修改,及时备份你的收藏,永远是明智的做法
- 上一篇: 离去
- 下一篇: 用 gitbook 来写书