简介
有些开发者常常要使用终端控制台工做,致使最终打开了过多的标签页。若是你也是他们当中的一员,或者你正在实践结对编程,那么我推荐你读一读这篇文章。从上个月开始,我开始大量使用 Tmux 而且发现 Tmux 很是实用,因此我想应该写一篇文章,与诸位分享一些有关使用 Tmux 的建议和专业方案。本文将先介绍 Tmux 是什么,而后讲解如何使用 Tmux,才能使其同 Vim 结合起来,打造出更高效、更优雅的终端工具。github
本文将会包含如下内容:shell
- Tmux 的基础
- Tmux 中最棒的功能
- 窗口(Window)
- 窗格(Pane)
- 会话(Session)
- 快速在文本间移动光标或复制文本
- 很是轻巧的结对编程功能
- 调整 Tmux 以加强其同 Vim 的集成度
- 调整背景的配色方案
- 调整光标的形状
- 调整粘贴时的文本缩进
- 其余可以提高 Tmux 体验的工具或技巧
- 用 Tmuxinator 自动建立会话
- 改变 Tmux 状态栏的颜色
请注意,在撰写本文的过程当中,我安装了如下这一组软件,并在测试时使用了这些版本:编程
- Tmux 1.9a
- Vim 7.4
- iTerm 2.1
- Mac OS (Mavericks and Yosemite)
让咱们开始吧!vim
基础知识
什么是Tmux?
Tmux 是一个工具,用于在一个终端窗口中运行多个终端会话。不只如此,你还能够经过 Tmux 使终端会话运行于后台或是按需接入、断开会话,这个功能很是实用。稍后,咱们将会看到如何充分地利用这个功能。windows
如图所示,这就一个是 Tmux 的会话:ruby
从图中咱们能够看出:bash
- 左侧:Vim
- 右侧:系统 Shell
- 左下方:Tmux 会话的名字(“pomodoro-app”)
- 下方的中部:当前会话中的 Tmux 窗口(“app log”、“editor”和 “shell”)
- 右下方:当前的日期
如何安装 Tmux?
在 Mac OS 中安装:
- 安装 Homebrew
1ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
有关安装 homebrew 的详细的信息能够参考这里。服务器
- 安装 Tmux
1$ brew install tmux
在 Ubuntu 中安装:
在终端输入以下命令:session
1
|
sudo apt-get install tmux
|
Tmux 的快捷键前缀(Prefix)
为了使自身的快捷键和其余软件的快捷键互不干扰,Tmux 提供了一个快捷键前缀。当想要使用快捷键时,须要先按下快捷键前缀,而后再按下快捷键。Tmux 所使用的快捷键前缀默认是组合键 Ctrl-b
(同时按下 Ctrl
键和 b
键)。例如,假如你想经过快捷键列出当前 Tmux 中的会话(对应的快捷键是 s),那么你只须要作如下几步:
- 按下组合键
Ctrl-b
(Tmux 快捷键前缀) - 放开组合键
Ctrl-b
- 按下
s
键
这里有一些小建议:
首先我建议对调 Ctrl
键和 Caps-Lock
键的功能。
经过按下 Caps-Lock
键来代替 Ctrl
键将会很是实用。由于在编码过程当中,你须要频繁地按下 Ctrl
键,而因为 Caps-Lock
与手指在键盘的起始位置处于同一直线,因此按下 Caps-Lock
键会更加容易、便捷。
其次,我建议将 Tmux 的快捷键前缀变为 Ctrl - a
。用 Caps-Lock
键替代了 Ctrl
键以后,因为 Caps-Lock
键与 a
键离得更近,因此按下 Ctrl - a
就将会比按下 Ctrl - b
更容易、更便捷。
若要将快捷键前缀变动为 Ctrl-a
,请将如下配置加入到 Tmux 的配置文件 ~/.tmux.conf
中:
1
2
|
unbind C-b
set -g prefix C-a
|
Tmux 的配置文件
每当开启一个新的会话时,Tmux 都会先读取 ~/.tmux.conf
这个文件。该文件中存放的就是对 Tmux 的配置。
小提示:若是你但愿新的配置项可以当即生效,那么你能够将下面这一行配置加入到文件 ~/.tmux.conf
中。
1
2
|
# bind a reload key
bind R source-file ~/.tmux.conf ; display-message "Config reloaded.."
|
这样配置了以后,每当向 ~/.tmux.conf
文件中添加了新的配置,只须要按下 Ctrl-b r
就能够从新加载配置并使新的配置生效,从而免去了开启一个新的会话。
Tmux 中最棒的功能
提示:下面这截图也许与你使用 Tmux 时看到的界面略有不一样。这是由于我修改了 Tmux 的状态栏配置,若是你也想修改为和截图中同样的效果,那么能够参照“美化 Tmux 的状态栏”这一节中的步骤。
窗格
我认为沿竖直方向分割屏幕是个不错的主意,这样我就能够在一边使用 Vim,而在另外一边查看代码运行结果,若是须要的话,有时我还会再打开一个控制台。下面我就要讲解如何利用 Tmux 实现这一切。
从图中能够看出:
- 左侧:Vim(左上方是一个 Ruby 的类文件,左下方是针对这类编写的测试文件)
- 右侧:一个 Bash 的会话
要建立一个竖直放置的窗格很容易,待开启了一个 Tmux 会话以后,只需再按下 Ctrl-b %
,一个竖直窗格就出现了。另外,若要把屏幕沿水平方向分割,则只须要按下 Ctrl-b "
。在 Tmux 的窗格间移动光标也很简单,只须要先按下 Tmux 的快捷键前缀,而后再按下对应的方向键就可让光标进入到目标窗格了。
窗口
在Tmux中,窗口是个窗格容器,你能够将多个窗格放置在窗口中,并根据你的实际须要在窗口中排列多个窗格,也是彻底取决于你的须要。例如,我常常是这样作,先开启一个叫做“server”的窗口用于运行应用程序的服务器(在这个窗口中能够看到服务器的日志),而后开启另外一个叫做“editor”的窗口用于编写代码。在这个窗口中有两个窗格,一个用于 Vim,一个用于运行测试代码。最后再开启一个叫做“shell”的窗口用于经过 Bash shell 运行命令。Tmux 的窗口功能很是实用,由于在一个窗口中能够建立出多个窗格,这样在一个窗口中就能同时查看全部窗格内容,经过这种方法能够高效地利用有限的屏幕空间。
在 Tmux 的会话中,现有的窗口将会列在屏幕下方。下图所示的就是在默认状况下 Tmux 列出现有窗口的方式。这里一共有三个窗口,分别是“server”、“editor”和“shell”。
若要建立一个窗口,只须要按下Ctrl-b c
;若要切换窗口,只须要先按下Ctrl-b
,而后再按下想切换的窗口所对应的数字,该数字会紧挨着窗口的名字显示。
会话
一个 Tmux 会话中能够包含多个窗口。会话功能很是简单易用,例如能够为一个特定的项目建立一个专用的 Tmux 会话。若要建立一个新的会话,只须要在终端运行以下的命令:
1
|
tmux new -s <name-of-my-session>
|
假设我还须要开发另外一个项目,因而我就会为此再新建一个会话。虽然进入了新的会话,可是原来的会话并无消失。因此我能够在稍后回到以前的会话继续工做。若要建立一个新的会话,只须要按下 Ctrl-b :
,而后输入以下的命令:
1
|
new -s <name-of-my-new-session>
|
除非显式地关闭会话,不然 Tmux 的会话在重启计算机以前都不会消失。只要尚未重启计算机,你均可以自由地从一个项目的会话跳转到另外一个。
在 Tmux 的会话间切换
若要获取现有会话的列表,能够按下Ctrl-b s
。下图所示的就是会话的列表:
列表中的每一个会话都有一个 ID,该 ID 是从 0 开始的。按下对应的 ID 就能够进入会话。若是你已经建立了一个或多个会话,可是尚未运行 Tmux,那么能够输入以下命令以接入已开启的会话。
1
|
tmux attach
|
在文本间快速移动光标,复制文本
在 iTerm2 中,要想快速地复制内容就不得不键盘和鼠标一块儿用,这一点我一直很不喜欢。我想必定会有不须要使用鼠标且更快捷的复制方法。幸运的是,Tmux就提供了只用键盘就能够完成复制的功能,这源于 Tmux 是从命令行启动的,而在命令行界面是没法使用鼠标的。
在文本间移动光标
在 Tmux 中可使用与 Vim 极为类似的方式在文本间移动光标。正如你熟知的那样,用 k
键能够将光标移动到上一行,用 w
键能够向后移动一个单词等等。并且还能够经过把 Tmux 设为 vi 模式,使其与 Vim 的操做更加接近。为此,须要将如下配置加入到文件 ~/.tmux.conf
中。
1
2
|
# Use vim keybindings in copy mode
setw -g mode-keys vi
|
将复制下来的文本发送到系统的剪贴板中
在默认状况下,当从 Tmux 中复制文本时,复制下来的文本只能粘贴到同一个 Tmux 会话中。若要使复制下来的文本能够粘贴到任何位置,就须要让 Tmux 将文本复制到系统的剪贴板。为此,咱们须要这样作:
安装 retach-to-user-namespace。用 brew 安装的话将会很是简单,只须要运行下面这条命令:
1
|
$ brew install reattach-to-user-namespace
|
在配置文件 ~/.tmux.conf
中加入如下内容:
1
2
|
# invoke reattach-to-user-namespace every time a new window/pane opens
set-option -g default-command "reattach-to-user-namespace -l bash"
|
Select and copy text
既然已经设置成了 vi 模式,也安装了 rettach-to-user-namespace,下面就让咱们来看看如何从 Tmux 的会话中复制文本吧。假设要复制的是 IP 地址,因而咱们先运行了 ifconfig
命令。接下来就请跟随如下的步骤:
首先按下 Ctrl-b [
进入复制模式,而后能够看到一小段高亮的文本出如今了屏幕的右上角 (“[0/0]”)(以下图所示)。
接下来就能够像在 Vim 中同样用 j
、k
、l
和 h
等键在文本间移动光标了。
把光标移动到想复制的文本上后再按下空格键就能够开始选择文本了(这和在 Vim 中复制文本的步骤如出一辙)。
选择完要复制的文本后再按下回车键。
这样 IP 地址就复制下来并能够粘贴到任何地方了。
让复制文本的操做更像 Vim
你还能够设置 Tmux 使用 v
键选择文本,用 y
键复制文本。为此只须要将下面的配置项加入到配置文件 ~/.tmux.conf
中。
1
2
3
4
|
# start selecting text typing 'v' key (once you are in copy mode)
bind-key -t vi-copy v begin-selection
# copy selected text to the system's clipboard
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
|
高效的结对编程
你能够将 Tmux 会话的地址分享给他人,这样他们就能够经过 SSH 接入这个会话了。因为会话是创建在 SSH 之上的,因此不会产生额外的开销。经过使用高速的互联网,对于那些链接到远程会话上的用户而言,他们会以为这个会话就是运行在本地的。
在Tmux 中使用 Tmate
Tmate 是一个 Tmux 的管理工具,使用它不但可以轻松地建立 Tmux 会话并且还可以经过互联网把该会话共享给其余人。若要使用 Tmate 共享 Tmux 会话,请按照如下步骤操做:
- 安装 Homebrew
1$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" - 安装 Tmate
12$ brew update &&brew tap nviennot/tmate &&brew install mate - 使用 Tmate 开启一个新的会话
1$ tmate - 从 Tmux 的会话中复制由 Tmate 产生的 SSH URL。以下图所示,请注意屏幕下方的信息“[tmate] Remote session: ssh …”:
- 利用刚刚复制下来的 URL 就能够邀请其余人经过 SSH 访问你的会话了。
了解了如何利用 Tmux 的结对编程功能以后,还能够再利用您所喜好的运营商提供的语音服务进一步增强会话交互性。
调整 Tmux 以加强其同 Vim 的集成度
调整背景的配色方案
当我第一次经过 Tmux 打开 Vim 时,我发现 Vim 的颜色没有正确显示。正以下图所示,只有有字符的地方才有背景色。
这个问题是由于经过 Tmux 运行 Vim 须要配置一个特殊的终端参数(term parameter)。请将下面这行配置添加以你的 ~/.vim 文件中。
1
2
3
|
if exists('$TMUX')
set term=screen-256color
endif
|
在更新了配置文件 ~/.vimrc 之后,颜色应该就能够正确显示了。
调整光标的形状
在默认状况下,当经过 Tmux 运行 Vim 时,不管当前 Vim 是处于插入模式、可视模式仍是其余模式,光标的形状都是同样的。这样就很难判断当前的 Vim 模式是什么。若要避免这个问题,就须要让 Tmux 通知 iTerm 更新光标的形状。为此,须要将如下配置加入到文件 ~/.vimrc 中。
1
2
3
4
5
6
7
8
9
|
if exists('$ITERM_PROFILE')
if exists('$TMUX')
let &t_SI = "<Esc>[3 q"
let &t_EI = "<Esc>[0 q"
else
let &t_SI = "<Esc>]50;CursorShape=1x7"
let &t_EI = "<Esc>]50;CursorShape=0x7"
endif
end
|
在这里我要感谢 Andy Fowler,是他最早分享了调整光标的形状这个技巧。
调整粘贴时的文本缩进
在 Vim 中粘贴文本时可能会遇到这样的问题,有时文本的缩进会发生变化,特别是在粘贴大量的文本时,这个问题会更加明显。虽然能够经过在粘贴前执行 :set nopaste
来解决这个问题,可是这里还有一种更好的解决方法。就是把下面这段配置加入到配置文件 ~/.vimrc
中,这样 Vim 就会自动地阻止粘贴文本时的自动缩进。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
"
for tmux to automatically set paste and nopaste mode at the time pasting (as
"
happens in VIM UI)
function! WrapForTmux(s)
if !exists('$TMUX')
return a:s
endif
let tmux_start = "<Esc>Ptmux;"
let tmux_end = "<Esc>"
return tmux_start . substitute(a:s, "<Esc>", "<Esc><Esc>", 'g') . tmux_end
endfunction
let &t_SI .= WrapForTmux("<Esc>[?2004h")
let &t_EI .= WrapForTmux("<Esc>[?2004l")
function! XTermPasteBegin()
set pastetoggle=<Esc>[201~
set paste
return ""
endfunction
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
|
在这里我要感谢 Marcin Kulik,是他最早分享了这个技巧。
其余可以提高 Tmux 体验的工具或技巧
Tmuxinator (为项目自动建立会话)
假设你正在开发应用程序 A。在开发过程当中,常常要建立 Tmux 会话,会话中包含“server”、“editor”(用于编写代码)和“shell”(用于运行系统命令)这 3 个窗口。不只如此,在一天之中的某个特定的时间你还须要临时进入到应用程序 B 的开发工做中。因而你又不得不建立另外一个会话,虽然有略微的不一样(好比目录和某些命令),可是会话中仍是要包含应用程序 A 中的那 3 个窗口。可是有了 Tmuxinator,你就能够为每一个Tmux 会话声明一个配置,而后用 1 条命令就能建立出这个会话了。这功能太棒了,不是吗。
Tmuxinator 是一个 Ruby 的 gem 包,可用于建立 Tmux 的会话。它的工做方式是先在配置文件中定义会话中的细节,而后用 1 条命令建立出这些会话。下面就让咱们看看如何安装 Tmuxinator 以及如何添加配置来为指定项目开启一个会话。能够经过运行以下命令安装 Tmuxinator 的 gem 包。
1
|
$ gem install tmuxinator
|
安装好了 Tmuxinator 之后,就能够在系统 Shell 中运行 tmuxinator
或 mux
命令了。下面就让咱们为上述的应用程序(有 3 个窗口,分别是“servers”, “editor” 和 “shell”)来建立一个配置文件吧。下面这条命令的做用是为这个项目建立并打开一个配置文件。
1
|
$ tmuxinator new project_a
|
按下回车键后,就会自动打开文件 ~/.tmuxinator/project_a.yml
。为了实现项目 A 所需的配置,你须要把 project_a.yml
的内容更新为:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
name: project_a
root: <the-folder-of-project-A>
windows:
- server: <command-to-start-application-server>
- editor:
layout: even-horizontal
panes:
- vim
- <command-to-launch-tests-guard>
- shell: ''
|
一旦将上面的配置添加到了项目 A 的 Yaml 文件中,只须要运行下面这条命令就能够启动 Tmux 的会话了。
1
|
$ tmuxinator start project_a
|
固然若是愿意的话,你也可使用 Tmuxinator 命令的别名:
1
|
$ mux start project_a
|
大功告成了。如今,每当想进入项目 A 的编码工做时,就只须要运行 Tmuxinator 命令。
能够到这里查看Tmuxinator的官方文档。
美化 Tmux 的状态栏
默认状况下,Tmux的状态栏看起来是下图这个样子(图中绿底部分):
咱们能够根据须要改变状态栏的外观。对我来讲,我喜欢下图这种清爽的外观。
为了达到上图的效果,我将以下的配置加入到了配置文件 ~/.tmux.conf 中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 状态栏
# 颜色
set -g status-bg black
set -g status-fg white
# 对齐方式
set-option -g status-justify centre
# 左下角
set-option -g status-left '#[bg=black,fg=green][#[fg=cyan]#S#[fg=green]]'
set-option -g status-left-length 20
# 窗口列表
setw -g automatic-rename on
set-window-option -g window-status-format '#[dim]#I:#[default]#W#[fg=grey,dim]'
set-window-option -g window-status-current-format '#[fg=cyan,bold]#I#[fg=blue]:#[fg=cyan]#W#[fg=dim]'
# 右下角
set -g status-right '#[fg=green][#[fg=cyan]%Y-%m-%d#[fg=green]]'
```
|
总结
在这篇文章中咱们先介绍了 Tmux 的基本功能,而后介绍了 Tmux 中最棒的几个功能。这以后介绍了一些配置以及几个可以提高 Tmux 体验的工具。至此,诸位对 Tmux 的印象如何呢?大家是否也发现了什么其余有用的功能或配置?若是有的话欢迎留言告诉咱们。
感谢您阅读本文!
TN.(应该是做者的名字吧)