0x00 Tmux 介绍

Tmux是一个优秀的终端复用软件,使用它的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;
它支持:屏幕切分,而且具备丰富的命令行参数,使其可以灵活、动态的进行各种布局和操作。
你还可以通过 Tmux 使终端会话运行于后台或是按需接入、断开会话,这个功能非常实用

0x01 Tmux功能

Tmux 中最棒的功能 窗口(Window),窗格(Pane),会话(Session),快速在文本间移动光标或复制文本 ,非常轻巧的结对编程功能。

调整 Tmux 以增强其同 Vim 的集成度, 调整背景的配色方案, 调整光标的形状,调整粘贴时的文本缩进,用 Tmuxinator 自动创建会话 ,改变 Tmux 状态栏的颜色。
1.提供了强劲的、易于使用的命令行界面。
2.可横向和纵向分割窗口。
3.窗格可以自由移动和调整大小,或直接利用四个预设布局之一。
4.支持 UTF-8 编码及 256 色终端。
5.可在多个缓冲区进行复制和粘贴。
6.可通过交互式菜单来选择窗口、会话及客户端。
7.支持跨窗口搜索。
8.支持自动及手动锁定窗口。

0x02 Tmux的安装

安装环境:

CentOS Linux release 7.6.1810 (Core
Linux 3.10.0-957.5.1.el7.x86_64 2019 x86_64 x86_64 x86_64 GNU/Linux

1
2
3
4
5
6
7
8
9
10
11
12
#方法1
yum -y install ncurses-devel yum -y install ncurses-devel
yum install -y tmux Tmate

#方法2
$ yum install -y automake
$ git clone https://github.com/tmux/tmux.git
$ cd tmux
$ sh autogen.sh
$ ./configure && make

#运行:tmux即可

​​
tmux终端安装图

tmux终端安装图

0x03 Tmux的使用

打开后如上图所示:默认是以 Ctrl+B按键 激活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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#系统操作
? 列出所有快捷键;按q返回
d 脱离当前会话;这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话
D 选择要脱离的会话;在同时开启了多个会话时使用
Ctrl+z 挂起当前会话
r 强制重绘未脱离的会话
s 选择并切换会话;在同时开启了多个会话时使用
: 进入命令行模式;此时可以输入支持的命令,例如kill-server可以关闭服务器
[ 进入复制模式;此时的操作与vi/emacs相同,按q/Esc退出
~ 列出提示信息缓存;其中包含了之前tmux返回的各种提示信息


#窗口操作
c 创建新窗口
& 关闭当前窗口
数字键 切换至指定窗口
p 切换至上一窗口
n 切换至下一窗口
l 在前后两个窗口间互相切换
w 通过窗口列表切换窗口
, 重命名当前窗口;这样便于识别
. 修改当前窗口编号;相当于窗口重新排序
f 在所有窗口中查找指定文本
x 关闭当前光标处的小窗口


#面板操作
” 将当前面板平分为上下两块
% 将当前面板平分为左右两块
x 关闭当前面板
! 将当前面板置于新窗口;即新建一个窗口,其中仅包含当前面板
Ctrl+方向键 以1个单元格为单位移动边缘以调整当前面板大小
Alt+方向键 以5个单元格为单位移动边缘以调整当前面板大小
Space 在预置的面板布局中循环切换;依次包括even-horizontal、even-vertical、main-horizontal、main-vertical、tiled
q 显示面板编号
o 在当前窗口中选择下一面板
方向键 移动光标以选择面板
{ 向前置换当前面板
} 向后置换当前面板
Alt+o 逆时针旋转当前窗口的面板
Ctrl+o 顺时针旋转当前窗口的面板
t 钟表


#常用操作
ctrl + b 再按 " 上下分屏"
ctrl + b 再按 % 左右分屏
ctrl + b 再按 o 切换屏幕
ctrl + b 再按 x 关闭一个终端
ctrl + b 再按空格键 上下分屏与左右分屏切换
ctrl + b 再按 s 以菜单方式显示和选择会话。这个常用到,可以选择进入哪个tmux
ctrl + b 再按 q 显示分隔窗口的编号
ctrl + b 再按 t 显示钟表

​​
例如可以为一个特定的项目创建一个专用的 Tmux 会话,也可在tmux中进行建立指定会话:
1
2
3
4
5
6
7
8
9
10
:new -s <name-of-my-new-session>
#实际案例1
tmux #开启tmux
tmux ls #显示已有tmux列表(C-b s) 列出已有会话(list-sessions)
tmux attach-session -t 数字 #选择tmux

#实际案例2
$ tmux new -s <name-of-my-session>
$ tmux attach #列表中的每个会话都有一个 ID,该 ID 是从 0 开始的。
Ctrl-b + : #tmux 内部中按下

注意事项: 进入tmux面板后,一定要先按ctrl+b,然后松开,再按其他的组合键才能够生效。

0x04 Tmux配置

Tmux的配置文件:~/.tmux.conf (如果没有就自己建立即可644的权限)
每当开启一个新的会话时,Tmux 都会先读取 ~/.tmux.conf 这个文件,该文件中存放的就是对 Tmux 的的配置

  1. Tmux 的快捷键前缀(Prefix)修改
    首先我建议对调 Ctrl 键和 Caps-Lock 键的功能,因为在编码过程中,你需要频繁地按下 Ctrl 键,而由于 Caps-Lock 与手指在键盘的起始位置处于同一直线,所以按下 Caps-Lock 键会更加容易、便捷。

  2. 如果你希望新的配置项能够立即生效;
    将以下配置加入到 Tmux 的配置文件 ~/.tmux.conf 中:

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    unbind C-b
    set -g prefix C-a #快捷键前缀变更为 Ctrl-a

    #只需要按下 Ctrl-a r就可以重新加载配置并使新的配置生效
    bind R source-file ~/.tmux.conf ; display-message "Config reloaded.."

    # 在文本间快速移动光标,复制文本 Use vim keybindings in copy mode
    setw -g mode-keys vi

    # 将复制下来的文本发送到系统的剪贴板中
    # invoke reattach-to-user-namespace every time a new window/pane opens
    set-option -g default-command "reattach-to-user-namespace -l bash"

    #让复制文本的操作更像 Vim
    # 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"


    #调整背景的配色方案
    if exists('$TMUX')
    set term=screen-256color
    endif
    ​​

    #调整光标的形状
    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

    #调整粘贴时的文本缩进
    " 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()


    #美化 Tmux 的状态栏
    # 状态栏
    # 颜色
    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配置效果图