这一章我们来聊聊文本编辑神器 Vim,和窗口管理器Tmux,这两个神奇可以让我们的运维效率成倍提高。本章的最后我会推荐关于Linux的进阶学习资料。

Vim

Vim是Linux中最重要的编辑器之一,学会使用Vim后,我们可以不使用鼠标,完全通过操作键盘来编辑文本。也因为Vim的强大,几乎所有的IDE支持Vim模式(Intellij, VSCode, Leetcode, …),所以如果想成为一个开发效率更好的程序员,Vim是必学的技能之一。(Vim和Emacs并列成为类Unix系统用户最喜欢的编辑器)

Linux系统中自带vi文本编辑器,vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新特性在其中,比如可以高亮语法之类的。要下载vim,我们需要打开Terminal输入以下指令:

$ sudo apt install vim

Normal模式和Insert模式

启动vim有两种方式,可以直接启动vim或者用vim编辑现有的文件:

$ vim # 打开vim
$ vim file.txt # 用vim编辑file1.txt

vim和其他文本编辑器不同,它有三个不同的模式,分别是正常模式(Normal Mode),输入模式(Insert Mode)和命令模式(Command Mode)。进入vim后,我们的默认模式是Normal模式,在这个模式下,我们的按键都是功能键。可进行的操作可以是移动光标,复制粘贴内容,删除内容等等。

如果要进入Insert模式,我们可以输入 i,这时候就会发现vim的右下角显示 insert,这就代表我们就是输入模式了,在输入模式中就可以正常打字了。如果要回到Normal模式,我们按下ESC键即可。

以下是Normal模式中可进行的操作:

移动光标:

h向左移动
j向下移动
k向上移动
l向右移动
0移动到行首
$移动到行尾
gg移动到当前文件的第一行
G移动到当前文件最后一行
H移动到当前屏幕的第一行
M移动到当前屏幕的中间
L移动到当前屏幕的最后一行

插入内容:

i在光标左侧进入插入模式
I在光标所在行的行首输入正文
a在光标右侧输入内容
A在光标所在行的行尾输入内容
o在光标所在的下一行添增内容
O在光标所在的上一行添增新行, 光标位于新行的行首

删除内容:

x删除光标上的当前字符
dd删除一整行
D删除当行光标之后的内容
C删除光标内容的内容,并进入插入模式

其他:

y复制光标所选的内容
Y复制当前行
p粘贴复制的内容
v进入Virtual模式
V将当行的内容全选
/word在光标之下寻找word的字符串
?word在光标之上寻找一个叫做word的字符串
n重复前一个搜索的动作,常常在/word之后使用
N与n相反,反向进行前一个搜索动作。在/word之后使用N,就会向上寻找。
u复原前一个动作 *
Ctrl + r重做上一个动作 *

命令模式

在Normal模式下,我们输入 : (冒号) 就进入了命令模式,如果我们输入 :w,vim就会提示我们保存文件,但是不退出。

:q不保存,直接退出
:q!不保存,并强制退出
:w保存文件,但不退出
:w file.txt保存为file.txt文件,但不退出
:w!强制保存,不退出
:wq或x保存,并退出
:wq!强制保存,并退出
:e!放弃所有修改,从上次保存文件开始再编辑
:set number显示行数

高级功能

Normal模式下的其他指令:

>>向右增加一级缩进
<<向左增加一级缩进
22y将粘贴的内容复制22次
22O在当前行的上边添加22行空行

之后再教大家如何对多行同时进行操作,首先在Normal模式下,按下Ctrl + v,通过h, j, k, l选择多行,然后按下 I (大写的i) 就能在多行同时插入了:

配置Vim

Vim可以通过配置添加许多有用的功能,让vim更符合个人的开发习惯。它的全局配置一般在 /etc/vim/vimrc或者/etc/vimrc,当中的配置对全局用户有效。用户个人的配置在 ~/.vimrc 中。

如果只对单次编辑使用某个配置,可以在Normal模式中,输入冒号 ( : ) 进入命令模式,然后输入配置。比如要让vim显示行数,可以在命令模式中输入:

:set number

配置项有”开启“和”关闭“的设置,关闭就是在打开的前面加上前缀”no”:

set number # 开启
set nonumber # 关闭

以下是常用的配置选项

set number打开行数显示
set nonumber关闭行数显示
syntax on语法高亮
set showmode在底部显示,当前命令模式还是插入模式
set mouse=a支持使用鼠标
set autoindent按下回车键后,下一行的缩进和上一个缩进保持一致
set tabstep按下Tab键,Vim显示的空格数
set shiftwidth=4缩进数目<<, >>, ==

Tmux

Tmux是优秀的终端复用器 (terminal multiplexer),通过tmux用户可以在一个终端内管理多个分离的会话,窗口及面板,对于同时使用多个命令行,或管理多个任务是非常方便。类似的终端复用器还有GNU Screen,Tmux与它功能相似,但是更易用,也更强大。

会话是什么?

Tmux非常重要的作用之一就是管理多个会话,那会话是什么呢?正常情况下我们每次打开一个终端窗口,并在其中输入指令。那么这种临时的交互,就称为是一次“会话”(session)。

正常情况下,我们的窗口和其中启动的进程是连在一起的。打开窗口,会话开始;关闭窗口,会话也随之结束,而且会话中的进程也会终止,无论是否运行完成。

举一个经典例子,我们使用ssh登入远程服务器后,如果网络突然掉线,那么我们再次登入时,是无法找回之前的指令操作的。因为随着窗口的关闭,对应的会话也终止了,里面的进程自然随之消失了。

未来解决这个问题,我们需要把会话和窗口“解绑”:窗口关闭时,会话并不终止,而是保持运行,等需要的时候,再让会话“绑定”到其他窗口。而Tmux就是这么一个“解绑”窗口和会话的重要工具。

以下是Tmux的特点

  1. 允许在单个窗口中,同时访问多个对话。
  2. 让新窗口“接入”已经存在的会话。
  3. 允许每个会话有多个连接窗口,可实现多人实时共享会话。
  4. 支持窗口任意的垂直和水平拆分。

Ubuntu并不自带tmux,所以我们需要输入以下指令进行安装:

$ sudo apt-get install tmux # Ubuntu或Debian
$ sudo yum install tmux # CentOs或Fedora
$ brew install tmux # MacOS

安装完成后,输入tmux指令,就可以进入Tmux窗口了。Tmux的底部有一个状态栏,状态栏的右侧是窗口信息(编号和名称),右侧是系统信息。

按下 Ctrl + d 或者直接在命令行输入 exit 指令,就可以退出Tmux窗口。

Tmux窗口有很多的快捷键,所有的快捷键都需要前缀键。默认的前缀键是 Ctrl + b,只有先按下 Ctrl + b,快捷键才能生效。举例来说,帮助指令的快捷键是 Ctrl + b ?。那么在Tmux窗口下,先按下 Ctrl + b,再按下 ?,就能显示帮助信息。然后按下 EST 键或q键,就可以退出帮助。

会话管理

第一个启动的Tmux窗口编号为0,第二个窗口为1,以此类推。这节窗口对应的会话,就是0号会话、1号会话。如果想要给会话起名,可以使用以下命令:

$ tmux new -s <session-name>

在 Tmux 窗口中,按下 Ctrl + b d 或者输入 tmux detah 命令,就会将当前会话与窗口分离:

$ tmux detach

上面的命令执行后,就会退出当前 Tmux 窗口,但是会话和里面的进程仍然在运行。以下两个命令都可以查看当前所有的 Tmux 会话:

$ tmux ls 
$ tmux list-session

如果要接入某个存在的会话,则需要使用 tmux attach 指令:

$ tmux attach -t 0 # 接入会话编号 0
$ tmux attach -t <session-name>

如果想要杀死(删除)某个会话,使用 tmux kill-session:

$ tmux kill-session -t 0
$ tmux kill-session -t <session-name>

切换会话可以使用 tmux switch:

$ tmux switch -t 0 
$ tmux switch -t <session-name>

若要重命名会话,则需要使用 tmux rename-session:

$ tmux rename-session -t 0 <new-name>

以下是tmux重要指令的总结:

tmux new -s <session_name>新建一个特定名称的会话
tmux detach将当前会话与窗口分离
tmux ls / tmux list-session查看当前所有的Tmux会话
tmux attach -t <session_name>重新连接某个已存在的会话
tmux kill-session -t <session_name>删除某个会话
tmux switch -t <session-name>切换会话
tmux rename-session -t <old_session> <new_session>重新命名会话

会话相关的快捷键:

Ctrl + b d分离会话
Ctrl + b s列出所有会话
Ctrl + b $重命名当前会话

以下是最简的操作流程

  1. 新建会话:tmux new -s new_session
  2. 在 tmux 运行需要的程序
  3. 按下快捷键 Ctrl + b d 将会话分离
  4. 下次使用时,重新连接到会话 tmux attach-session -t new_session

窗格管理

Tmux可以在一个窗口中分出多个窗格 (pane),每个窗格可以运行不同的指令。以下是相关快捷键:

Ctrl+b %划分左右两个窗格
Ctrl+b “划分上下两个窗格
Ctrl+b <arrow key>切换到其他窗格,<arrow key>指向切换的方向
Ctrl+b ;切换到上一个窗格
Ctrl+b o切换到下一个窗格
Ctrl+b {当前窗格左移
Ctrl+b }当前窗格右移
Ctrl+b x关闭当前窗格

划分窗格的指令:

$ tmux split-window
$ tmux split-window -h

窗口管理

除了可以在一个窗口中分出多个窗格外,我们也能在Tmux中新建多个窗口,以下是相关快捷键:

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

以下是窗口相关的指令:

$ tmux new-window # 新建窗口
$ tmux select-window -t <window_name>/<window_number> # 切换窗口
$ tmux rename-window <new_name> # 重命名窗口

实践练习

使用tmux创建一个新的会话 new_session,在这个会话中,使用 vim 编辑一个 file1.txt 文件,然后分离会话之后,再重新连入会话。

进阶学习

想要进阶学习Linux的朋友,可以参考下面三本好书,让自己的Linux知识更加扎实!

  • 鸟哥的Linux私房菜:以诺当时学习Linux的第一本书,非常适合Linux新手
  • The Linux Command:书中代码示例丰富,讲解简明扼要。作者适时插入相关背景知识,能帮助我们增加对知识点来龙去脉的理解。
  • How Linux Works:此书系统讲述了Linux是如果运行的,帮助我们对Linux有更深入的认识。

References