前言
上一次我们解决了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 就是会话与窗口的”解绑”工具,将它们彻底分离。
它允许在单个窗口中,同时访问多个会话。这对于同时运行多个命令行程序很有用。
它可以让新窗口”接入”已经存在的会话。
它允许每个会话有多个连接窗口,因此可以多人实时共享会话。
它还支持窗口任意的垂直和水平拆分。
类似的终端复用器还有 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
进入,通过v
和y
来选择和复制,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"
。
简单使用
新建会话
tmux new -s my_session
在 Tmux 窗口运行所需的程序
按下快捷键
Ctrl-a d
将会话分离下次使用时,重新连接到会话
tmux attach-session -t my_session
。
一些涉及窗口操作的快捷键
Ctrl-a c 创建一个新窗口,状态栏会显示多个窗口的信息。
Ctrl-b p 切换到上一个窗口(按照状态栏上的顺序)。
Ctrl-b n 切换到下一个窗口。
Ctrl-b <number> 切换到指定编号的窗口,其中的<number>是状态栏上的窗口编号。
Ctrl-b w 从列表中选择窗口。
Ctrl-b , 窗口重命名。
具体怎么使用大家慢慢探索吧!