tmux is a terminal multiplexerlinux
tmux
是一个终端复用器,这也是它命名的由来 t(terminal) mux(multiplexer)
,你能够在一个屏幕上管理多个终端!webpack
在 mac
上得益于 iterm2,你管理多个终端窗口至关方便。可是在 linux 上,iterm2
就鞭长莫及了,tmux
的优点就显出来了。git
就我理解,tmux
在 linux 上或者 mac 上有诸多好处github
分屏web
诚然,iterm2
也是能够作到分屏的,可是 iterm2
有一个缺点即是 iterm for Mac
。若是结合 iterm2
与 ssh
的话,iterm2
分屏须要不断地 ssh <server>
,致使的后果就是有多个用户链接,使用 who
命令查看登陆用户数。shell
attachvim
attach
能够起到保护现场的做用,不至于因 ssh timeout
,而丧失了工做环境。后端
操做简单,可配置化centos
你可使用快捷键很快地在多个窗口,面板间切换,粘贴复制,无限滚屏。bash
至于说它好看,体如今可定制化样式的状态栏下,能够设置状态栏的样式, 位置,当前window的样式,状态栏信息的丰富度。好比 gpakosz/.tmux 的配置
本章将介绍如下内容
tmux
tmux
tmux
经常使用操做若是你在 mac 上,那么你可使用 brew install tmux
安装 tmux,简单,快捷。
可是你在 centos 上,若是直接使用 yum
来安装软件,会安装特别旧的版本,且不少实用的功能没法使用。那么直接经过 tmux源码 本身编译安装则是一个不错的注意
# 安装软件依赖
$ yum install -y gcc automake libevent-devel ncurses-devel glibc-static
# 下载源代码
$ git clone git@github.com:tmux/tmux.git
# 切换到 2.8 版本
$ git checkout 2.8
$ cd tmux
# 编译源码
$ sh autogen.sh && ./configure && make
# 查看版本号
$ ./tmux -V
tmux 2.8
复制代码
使用源码编译安装过于琐碎且易错,又有可能须要在若干台服务器上安装 tmux
,此时使用 ansible
进行自动化安装是一个不错的选择。 关于 ansible
可参考本系列文章 使用 ansible 作自动化运维。
$ git clone git@github.com:shfshanyue/ansible-op.git
# 一次性给多服务器上安装 tmux
$ ansible-playbook -i hosts tmux.yml
复制代码
tmux
这个 ansible role 的配置在 个人tmux配置 上。配置文件以下
# 安装依赖软件
- name: prepare
yum:
name: "{{item}}"
with_items:
- gcc
- automake
- libevent-devel
# 字符终端处理库
- ncurses-devel
- glibc-static
# 下载 tmux 源文件
- name: install tmux
git:
repo: https://github.com/tmux/tmux.git
dest: ~/Documents/tmux
version: 2.8
- name: make tmux
shell: sh autogen.sh && ./configure && make
args:
chdir: ~/Documents/tmux/
# 使 tmux 全局可执行
- name: copy tmux
copy:
src: ~/Documents/tmux/tmux
dest: /usr/bin/tmux
remote_src: yes
mode: 0755
# 使用个人配置文件
- name: clone config file
when: USE_ME
git:
repo: https://github.com/shfshanyue/tmux-config.git
dest: ~/Documents/tmux-config
- name: copy config file
copy:
src: ~/Documents/tmux-config/.tmux.conf
dest: ~/.tmux.conf
remote_src: yes
- name: delete tmux-config
file:
name: ~/Documents/tmux-config
state: absent
复制代码
server
包含多个 session
session
包含多个 window
window
相似于 iterm2
的 Tab
,包含多个 pane
,如下中文会翻译为窗口pane
相似于 iterm2
的 Pane
,如下中文会翻译为面板# 新建一个 tmux session
$ tmux
复制代码
在 tmux
环境下使用快捷键 prefix %
与 prefix "
完成分屏
prefix ?
我习惯 <Crtl-s>
来做为前缀键,默认前缀建为 <Ctrl-b>
。send-prefix
表明向终端发送前缀键,send-prefix -2
表明新增一个快捷键表明前缀键。
# 如下命令直接在 tmux 命令模式执行,或者加关键字 `tmux` 在 shell 中执行,或者写入配置文件 ~/.tmux.conf 中生效
# `prefix :` 能够进入 tmux 命令模式
$ set -g prefix2 C-s
$ bind C-s send-prefix -2
复制代码
每次新建 session
的时候带上名字,方便下次 attach
。
稍微提一个命令 detach
,默认快捷键 <prefix> d
,会先 detach
掉当前 session
。
prefix 默认为
<Ctrl-b>
$ tmux new -s shanyue
# 或者使用快捷键 prefix + d
$ tmux detach
$ tmux attach -t shanyue
复制代码
移动面板命令为 select-pane
,可配置为 vim
式的移动命令。
# 如下命令直接在 tmux 命令模式执行,或者加关键字 `tmux` 在 shell 中执行,或者写入配置文件 ~/.tmux.conf 中生效
# `prefix :` 能够进入 tmux 命令模式
# bind 绑定快捷键
# -r 可重复按键
# select-pane 选择面板
$ bind -r h select-pane -L
$ bind -r l select-pane -R
$ bind -r j select-pane -D
$ bind -r k select-pane -U
复制代码
其中,参数 -r
表明可重复按键,好比 prefix r r
表示 prefix r, prefix r
。其中按键时间须要经过 repeat-time
来设置,通常为500ms。
另外,也能够开启鼠标支持,经过鼠标快速移动面板。
rename-window
为重命名窗口名的命令,默认快捷键 prefix ,
可是有一个小问题,每当重命名窗口名后,敲几个空格又会自动重命名,本身的辛勤工做又被破坏了...
须要配置如下两个配置把它俩给关了,终于能够重命名了
# 如下命令直接在 tmux 命令模式执行,或者加关键字 `tmux` 在 shell 中执行,或者写入配置文件 ~/.tmux.conf 中生效
# `prefix :` 能够进入 tmux 命令模式
set -wg allow-rename off
set -wg automatic-rename off
复制代码
$ tmux set -g mouse on
复制代码
鼠标支持默认是关闭的,开启鼠标后,支持复制,翻屏,切换面板,切换窗口,resize。
鼠标支持的功能很强大,至此已经成功打造了一个 iterm2
了。不过鼠标模式我不大喜欢,因此仍是禁了。
况且,开启鼠标支持后,谁均可以操做个人终端了,一点逼格也没有了
新开 pane
和 window
时,保持当前路径。为之前的命令添加参数 -c
,代表新建窗口或者面板的路径。
新开面板的命令为 split-window
# 如下命令直接在 tmux 命令模式执行,或者加关键字 `tmux` 在 shell 中执行,或者写入配置文件 ~/.tmux.conf 中生效
# `prefix :` 能够进入 tmux 命令模式
bind c new-window -c "#{pane_current_path}"
bind % split-window -h -c "#{pane_current_path}"
bind '"' split-window -c "#{pane_current_path}"
复制代码
命令为 tmux resize-pane -Z
,默认快捷键为 prefix z
。须要查看更加详细的信息时能够按 prefix z
进入全屏,完毕以后,再按一次恢复。至关酷的一个功能。
第一次使用 tmux
时, 使用webpack
,输出信息不少,而有用的错误信息被覆盖。此时,往上翻屏就很重要了。此时要说下 tmux window
下的两种模式,
default-mode
就是刚进入 tmux
默认的模式。
copy-mode
按 prefix [
键进入此模式,相似于 vi(emacs)
的 normal mode
,支持复制,粘贴,查找,以及翻页。具体是 vi
仍是 emacs
能够根据如下命令探知,代表查看全局窗口设置 mode-keys
,默认会是 vi
,若是不是,那就请设置为 vi
吧~
$ tmux show-window-options -g mode-keys
复制代码
与 vi
命令相同,如上下翻页(半屏)可以使用 C-d
以及 C-u
,固然你也可使用 hjkl
。
另外,也能够开启鼠标支持,使用滚轮来翻屏。
上边说到 copy-mode
,接下来是复制与粘贴。进入 copy-mode
后,v
开始选中,y
来进行复制并会退出 copy-mode
。使用 prefix ]
来进行粘贴。
在 linux 下复制粘贴是最重要最实用的功能了
v & y
为自定义配置,配置以下
bind -t vi-copy v begin-selection
bind -t vi-copy y copy-selection
复制代码
复制操做会把内容存进 buffer
里,熟悉如下几个命令可以更熟练地操做 buffer
$ tmux list-buffers # 列出全部 buffer
$ tmux show-buffer -b [name] # 显示最近 buffer,也可指定 buffer name
$ tmux choose-buffer    # 进入选择 buffer 界面,更加灵活
复制代码
另外,也能够开启鼠标支持,用鼠标来选择文字。
既然进入 copy-mode
,熟悉 vi
的朋友必定知道查找是 /
与 ?
。
假设你新建了多个窗口,须要快速定位到某一个窗口,而你虽知道那个窗口中的内容,却忘了窗口号,这样如何解决呢?
有一个很好的解决方案的命令即是 find-window
,更好用的即是默认的快捷键 prefix f
。输入窗口内容的关键字,即可以快速定位到窗口,不过有一个小小的缺点,即是不能定位到面板!
man tmux ! **不看文档不足以熟练,不看源码不足以精通。**因此,日常须要多看几眼文档,多瞧几个命令。
经过本章你能够很熟练地在服务器中使用 tmux 同时管理多个窗口,再结合 vim 的使用就可使在服务器里工做达到为所欲为的地步了。关于 vim 的使用,配置以及插件,能够参考上一章 vim 快速上手,配置以及插件。