tmux

tmux

tmux是什么?一个工具,是linux中的一种管理窗口的程序。
tmux提供了多标签和分割窗体的功能,提供了一个窗体组随时存储和恢复的功能。

基本概念
  • Session: 会话,一组窗口的组合,通常用来概括统一任务。有自己的名字。
  • Window:窗口,单个可见窗口,有自己的编号。
  • Pane: 窗格,被划分成小块的窗口。

借个图:

Mac下安装
1
brew install tmux
tmux基本操作

Prefix-Command前置操作:所有下面介绍的快捷键,都必须以前置操作开始。tmux默认的前置操作是CTRL+b。例如,我们想要新建一个窗体,就需要先在键盘上摁下CTRL+b,松开后再摁下n键。

下面所有的prefix均代表CTRL+b

pane

prefix % 水平分割
prefix : 竖直分割
prefix z 放大当前pane
prefix 方向键 切换
prefix ctrl+ 方向键
prefix : 竖直分割
prefix o 依次切换当前窗口下的各个pane。
prefix Space (空格键) 对当前窗口下的所有pane重新排列布局,每按一次,换一种样式。
prefix x 关闭当前使用中的pane。

Windows

prefix c 创建
prefix 数字 移动
Prefix p (p for previous):切换到上一个window。
Prefix n (n for next): 切换到下一个window。
Prefix 0 : 切换到0号window,依次类推,1、2、3…
Prefix w (w for windows):出当前session所有window,通过上、下键可以选择切换到指定window。
prefix & 关闭
prefix 重命名

Session

tmux ls
tmux attach 如果你已经创建了一个或多个会话,但是还没有运行 Tmux,那么可以输入如下命令以接入已开启的会话
tmux attach -t [name-of-session] 回到session
tmux new -s [name-of-session] 创建时命名
tmux new-session -s [name-of-session] 创建时命名
tmux kill-session -t [name-of-session] 关闭session
tmux a -t [name-of-session] a/attach 重新连接叫做name的session
tmux a 只有一个session会快速连接
tmux kill-session -a -t [name-of-my-session] 删除除了name意外的所有session
new -s [name-of-session] 创建一个新的会话
prefix + $ 重命名
prefix + d / exit 在只有一个window下输入
prefix + s 获取现有session的列表
主题美化

需要先安装相应主题。

https://github.com/VimrcMac/.tmux

1
2
3
4
5
6
7
8
# you may want to backup your existing ~/.tmux.conf first

mv ~/.tmux.conf ~/.tmux.conf.bak

cd
git clone https://github.com/gpakosz/.tmux.git
ln -s -f .tmux/.tmux.conf
cp .tmux/.tmux.conf.local .
Configuration

配置文件不存在的话需要创建: touch ~/.tmux.conf

Send prefix

把prefix的ctrl+b变为了ctrl+a,因为这样按起来方便些。基本上用tmux的都改了这个。

1
2
3
4
# Send prefix
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix
Use Alt-arrow keys to switch panes

不用按prefix,直接用alt+箭头在pane之间switch。实际用过之后才发现真是太方便了!

1
2
3
4
5
# Use Alt-arrow keys to switch panes
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D
Shift arrow to switch windows

不用按prefix,直接用shift+箭头在window之间switch。太方便了!

1
2
3
# Shift arrow to switch windows
bind -n S-Left previous-window
bind -n S-Right next-window
Mouse mode

开启鼠标模式。用鼠标就能切换window,pane,还能调整pane的大小,方便!

1
2
# Mouse mode
set -g mouse on
Set easier window split keys

这一部分是用来更方便切分pane的。prefix + v 代表竖着切,prefix + h 代表横着切。比起默认的切割方法不仅直观而且方便。

1
2
3
# Set easier window split keys
bind-key v split-window -h
bind-key h split-window -v
Easy config reload

下一次如果修改了.tmux.conf的设置的话,不用关掉tmux。直接用prefix+r,就能重新加载设置。

1
2
# Easy config reload
bind-key r source-file ~/.tmux.conf \; display-message ".tmux.conf reloaded. Your configuration has been updated."
在文本间移动光标

在 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
选择并复制文本

首先按下 Ctrl-b [ 进入复制模式,然后可以看到一小段高亮的文本出现在了屏幕的右上角 (“[0/0]”)
使用空格键(space)开始内容选取,回车键(Enter)进行拷贝,
然后使用 “ctrl-b ]” 进行粘贴。

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"
使用vim快捷键

使用 v 开始选择, y 复制

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"
高效的结对编程

Tmate 是一个 Tmux 的管理工具,使用它不但能够轻松地创建 Tmux 会话而且还能够通过互联网把该会话共享给其他人。若要使用 Tmate 共享 Tmux 会话,请按照以下步骤操作:

  • 安装tmate

    1
    brew update && brew tap nviennot/tmate && brew install mate
  • 开启一个新的会话

    1
    tmate
  • 从 Tmux 的会话中复制由 Tmate 产生的 SSH URL。请注意屏幕下方的信息“[tmate] Remote session: ssh …”
调整 Tmux 以增强其同 Vim 的集成度
调整背景的配色方案

将下面配置添加到 .vimrc 文件

1
2
3
if exists('$TMUX')
set term=screen-256color
endif
调整光标的形状

在默认情况下,当通过 Tmux 运行 Vim 时,无论当前 Vim 是处于插入模式、可视模式还是其他模式,光标的形状都是一样的。这样就很难判断当前的 Vim 模式是什么。若要避免这个问题,就需要让 Tmux 通知 iTerm 更新光标的形状。为此,需要将以下配置加入到文件 ~/.vimrc 中。

这里有问题,需要注意,如果您在Tmux会话中使用Vim,则需要双重转义t SI / t EI中的代码。 TODO

1
2
3
4
5
6
7
8
9
10

if exists('$ITERM_PROFILE')
if exists('$TMUX')
let &amp;t_SI = "\<Esc>[3 q"
let &amp;t_EI = "\<Esc>[0 q"
else
let &amp;t_SI = "\<Esc>]50;CursorShape=1x7"
let &amp;t_EI = "\<Esc>]50;CursorShape=0x7"
endif
end
调整粘贴时的文本缩进

在 Vim 中粘贴文本时可能会遇到这样的问题,有时文本的缩进会发生变化,特别是在粘贴大量的文本时,这个问题会更加明显。虽然可以通过在粘贴前执行 :set nopaste 来解决这个问题,但是这里还有一种更好的解决方法。就是把下面这段配置加入到配置文件 ~/.vimrc 中,这样 Vim 就会自动地阻止粘贴文本时的自动缩进。

https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

Tmuxinator

为项目自动创建会话。Tmuxinator 是一个ruby的gem包,客用户创建Tmux会话。Tmuxinator现在配置文件中定义会话中的细节,然后用命令创建这些会话。

  • 安装

    1
    gem install tmuxinator
  • 创建

    1
    2
    3
    # mux
    tmuxinator new project_a
    # 回车之后,会自动打开文件 `~/.tmuxinator/project_a.yml`
  • 更新配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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: ''
  • 启动会话

    1
    2
    3
    4
    5
    tmuxinator start project_a

    # or

    tmuxinator start project_a

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# .tmux.conf

# Send prefix
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix

# Use Alt-arrow keys to switch panes
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Dowœœn select-pane -D

# Shift arrow to switch windows
bind -n S-Left previous-window
bind -n S-Right next-window

# Mouse mode
set -g mouse on


# Set easier window split keys
bind-key v split-window -h
bind-key h split-window -v

# Easy config reload
bind-key r source-file ~/.tmux.conf \; display-message ".tmux.conf reloaded"

# Invoke reattach-to-user-namespace every time a new window/pane opens
set-option -g default-command "reattach-to-user-namespace -l bash"

# Use vim keybindings in copy mode
setw -g mode-keys vi

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

Iterm2 常用快捷键

1
2
3
4
5
6
7
8
9
10
⌘ + 数字 : 各 tab 标签切换
⌘ + f : 查找 ,所查找的内容会被自动复制 ,输入查找的部分字符,找到匹配的值按tab,即可复制
⌘ + d : 横着分屏
⌘ + shift + d : 竖着分屏
⌘ + r = clear : 换到新一屏,而不是 类似clear ,会创建一个空屏
ctrl + u :清空当前行,无论光标在什么位置
() + ⌘ + ; : [() 输入的命令开头字符],会自动列出输入过的命令
⌘ + shift + h : 会列出剪切板历史
⌘← / ⌘→ : 到一行命令最左边/最右边
⌘ + enter : 全屏

tmux 常用快捷键

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

Ctrl+b // 激活控制台;此时以下按键生效
系统操作
? // 列出所有快捷键;按q返回
d // 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
D // 选择要脱离的会话;在同时开启了多个会话时使用
Ctrl+z // 挂起当前会话
r // 强制重绘未脱离的会话
s // 选择并切换会话;在同时开启了多个会话时使用
: // 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器
[ // 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出
~ // 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息
窗口操作
c // 创建新窗口
& // 关闭当前窗口
数字键 // 切换至指定窗口
p // 切换至上一窗口
n // 切换至下一窗口
l // 在前后两个窗口间互相切换
w // 通过窗口列表切换窗口
, // 重命名当前窗口;这样便于识别
. // 修改当前窗口编号;相当于窗口重新排序
f // 在所有窗口中查找指定文本
面板操作
” // 将当前面板平分为上下两块
% // 将当前面板平分为左右两块
x // 关闭当前面板
! // 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板
Ctrl+方向键 // 以1个单元格为单位移动边缘以调整当前面板大小
Alt+方向键 // 以5个单元格为单位移动边缘以调整当前面板大小
Space // 在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled
q // 显示面板编号
o // 在当前窗口中选择下一面板
方向键 // 移动光标以选择面板
{ // 向前置换当前面板
} // 向后置换当前面板
Alt+o // 逆时针旋转当前窗口的面板
Ctrl+o // 顺时针旋转当前窗口的面板
-------------The End -------------