前言

上一次我们解决了tty中的中文显示和输入问题,fbterm的表现良好。可是在实际工作中,我们往往需要分屏同时进行一些操作和查看信息,有时还需要复制粘贴一些信息。

不使用tmux的尝试

vim也可以调用终端实现分屏。在命令行模式执行term,就可以打开一个竖直方向的终端,加上修饰vertical,即vertical term就可以打开一个水平方向的终端。
term在vim中仍被视为一个vim的进程,甚至也有不同的模式,可以使用vim的快捷键在不同的窗口跳转。使用Ctrl+D或者exit退出用户时默认退出了term。

在vim的term中也可以执行一定的复制粘贴操作,需要用快捷键Ctrl+\ Ctrl+N从Insert模式转换到Normal模式。但是只能从term复制内容而不能在term粘贴内容,尝试粘贴的时候会显示E21: Cannot make changes, 'modifiable' is off,按下i重新回到term中执行命令。

其实用vim来实现分屏是个不错的选择,设置一些快捷键之后可以比较方便。但是如果只是想同时运行多个命令就不得不先打开vim,但这实在是有点鸡肋。

Tmux

tmux是一个终端复用器,tmux就是terminal muliplexer的缩写,可以使窗口和会话解绑。

命令行的典型使用方式是,打开一个终端窗口(terminal window,以下简称”窗口”),在里面输入命令。用户与计算机的这种临时的交互,称为一次”会话”(session)。

会话的一个重要特点是,窗口与其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话结束,会话内部的进程也会随之终止,不管有没有运行完。

一个典型的例子就是,SSH 登录远程计算机,打开一个远程窗口执行命令。这时,网络突然断线 ,再次登录的时候,是找不回上一次执行的命令的。因为上一次 SSH 会话已经终止了,里面的进程也随之消失了。

为了解决这个问题,会话与窗口可以”解绑”:窗口关闭时,会话并不终止,而是继续运行,等到以后需要的时候,再让会话”绑定”其他窗口。

Tmux 就是会话与窗口的”解绑”工具,将它们彻底分离。

  1. 它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。

  2. 它可以让新窗口”接入”已经存在的会话。

  3. 它允许每个会话有多个连接窗口,因此可以多人实时共享会话。

  4. 它还支持窗口任意的垂直和水平拆分。

类似的终端复用器还有 GNU Screen。Tmux 与它功能相似,但是更易用,也更强大。

以上内容参考自<Tmux 使用教程 - 阮一峰的网络日志>

简单总结一下,就是通常的会话(也就是我们运行的命令和计算机进行交互)是与窗口绑定的,关闭窗口的时候会话就会终止,导致我们正在运行的命令也随之终止,而tmux将会话单独保存,可以指定不同的窗口连接会话。就像是本来用碗盛一碗水,碗摔碎了,水也就没了。有了tmux这个冰箱,把会话变成了冰,碗随便摔,冰不会没有,还会放到冰箱里贴上标签一直运行,等你想拿出来的时候可以重新拿一只碗来,什么东西都不会变。

安装和配置

pacman -S tmux即可安装tmux,配置文件需要自己创建,用户私人配置文件在~/.tmux.conf, 全局配置文件在 /etc/tmux.conf。

默认的tmux快捷键并没有想象中的友好,我们先参考archwiki上建议的一份配置文件进行vim风格化

#Prefix is Ctrl-a
set -g prefix C-a
bind C-a send-prefix
unbind C-b

set -sg escape-time 1
set -g base-index 1
setw -g pane-base-index 1

set -g mode-keys vi
set -g history-limit 10000

# y and p as in vim
bind Escape copy-mode
unbind p
bind p paste-buffer
bind-key -T copy-mode-vi 'v' send -X begin-selection
bind-key -T copy-mode-vi 'y' send -X copy-selection
bind-key -T copy-mode-vi 'Space' send -X halfpage-down
bind-key -T copy-mode-vi 'Bspace' send -X halfpage-up

# easy-to-remember split pane commands
bind | split-window -h
bind - split-window -v
unbind '"'
unbind %

# moving between panes with vim movement keys
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R

# moving between windows with vim movement keys
bind -r C-h select-window -t :-
bind -r C-l select-window -t :+

# resize panes with vim movement keys
bind -r H resize-pane -L 5
bind -r J resize-pane -D 5
bind -r K resize-pane -U 5
bind -r L resize-pane -R 5

接下来的就基于上面的配置进行简单的说明。

  • 首先是设置前缀键为Ctrl-a,然后设置按键风格为vim,可以使用hjkl进行移动。
  • copy-paste的模式,使用C-a Esc进入,通过vy来选择和复制,C-a p进行粘贴。
  • 将窗口分割的快捷键调整为C-a |竖直分割,C-a -水平分割。
  • C-a h,j,k,l进行各个pane的跳转
  • C-a H,J,K,L调整各个pane的大小

还有其他一些快捷键可以通过C-a ?查看,man上面也给出了不少说明。

对于256色的终端需要设置TERM变量以显示正确的颜色,具体看archwiki

一个简单省事的方式是直接在conf中加上set -g default-terminal "tmux-256color"

简单使用

  1. 新建会话tmux new -s my_session

  2. 在 Tmux 窗口运行所需的程序

  3. 按下快捷键Ctrl-a d将会话分离

  4. 下次使用时,重新连接到会话tmux attach-session -t my_session

一些涉及窗口操作的快捷键

Ctrl-a c  创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl-b p  切换到上一个窗口(按照状态栏上的顺序)。
Ctrl-b n  切换到下一个窗口。
Ctrl-b <number>  切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号。
Ctrl-b w  从列表中选择窗口。
Ctrl-b ,  窗口重命名。

具体怎么使用大家慢慢探索吧!