这一章我们来聊聊文本编辑神器 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的特点
- 允许在单个窗口中,同时访问多个对话。
- 让新窗口“接入”已经存在的会话。
- 允许每个会话有多个连接窗口,可实现多人实时共享会话。
- 支持窗口任意的垂直和水平拆分。
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 $ | 重命名当前会话 |
以下是最简的操作流程
- 新建会话:tmux new -s new_session
- 在 tmux 运行需要的程序
- 按下快捷键 Ctrl + b d 将会话分离
- 下次使用时,重新连接到会话 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有更深入的认识。