文本编辑工具之神 vim

1.1 vi和vim简介

​ 在Linux中我们经常需要修改文本文件,或其他纯文字的文件(比如配置开发发给你的java项目的服务器地址等等)

​ 这时我们需要一个专业,功能强大的工具了

Linux中文本编辑器种类:

  • 全屏编辑器:nano(字符工具),gedit(图形化工具,需要安装桌面),vi,vim
  • 行编辑器:sed

vi:全名为Visual editor,文本编辑器,是Linux系统必备的工具之一。功能强大,但学习曲线较为陡峭,学习难度大

vim:全名为Visual editor iMproved,和vi使用方法一致。是vi的plus版。功能更为强大,不在系统安装的默认包中

1.2 初步使用 vim

1.2.1 vim 命令格式

提示:PATTERN是指正则表达式

1
2
3
4
5
6
7
8
9
10
11
vim [选项] <文件名>
#选项
+N #打开文件后跳转至第N行的行首,只有+则是跳转最后一行
+/PATTERN #让光标处于被pattern第一个匹配到的字符所在行行首

-b file #二进制方式打开文件
-d file1 file2 #比较多个文件,相当于 vimdiff
-m file #只读的形式打开文件
-e file #进入ex编辑模式(行编辑模式,只能使用命令进行修改)
-y file #无模式,类似windows的记事本一样操作,供于不想学的用户
ctrl+o:wq|q! #无模式中用于保存退出|不保存强制退出

注:

  • 如果该文件存在,文件被打开后会显示内容
  • 如果该文件不存在,当第一次保存时会创建它

1.2.2 三种主要模式和转换

vim 是一个模式编辑器,每个按键在不同的模式下都会有不同的效果

三种模式:

  • 命令模式(普通模式):默认模式,可以移动光标,剪切/粘贴文本
  • 编辑模式:用于修改文本
  • 扩展命令模式:保存,退出等扩展命令操作

三种模式之间的切换:

​ vim 是一个模式编辑器,不同的模式下,相同的按键,是不同的意思

插入模式和扩展命令模式不能直接切换,需要通过命令模式中转

打开vim默认就是命令模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#命令模式----->插入模式

i #insert,在光标所在处输入
I #在当前光标所在行的行首输入

a #append,在光标所在处后面输入(往后移一个字符再输入)
A #在当前光标所在行的行尾输入

o #在当前光标所在行的下方打开一个新行
O #在当前光标所在行的上方打开一个新行


#命令模式----->扩展命令模式

输入冒号即是扩展命令:


#编辑模式----->命令模式

按esc键即可退出编辑模式

1.2.3 vim中插入颜色字符

1
2
3
4
5
6
切换至编辑模式
使用ctrl+v+[键,显示^[
然后输入颜色信息,包括快捷键的输入全称例如:^[[32mhello^[[0m
(hello可以换成其它内容)
切换至扩展命令模式,保存退出
cat查看颜色字符

1.3 扩展命令模式

1.3.1 扩展命令模式的基本命令

:是切换到扩展模式后带的,不会在其中写出来

1
2
3
4
5
6
7
8
9
10
11
12
w				#保存文件,写入磁盘
wq #保存并退出
x #保存并退出
X #加密,vi中无此功能
q #退出
q! #强制退出(不保存修改退出)
r file #读文件内容到当前文件中(会添加至当前行的下一行)
w file #将当前文件内容另存为(不指定文件名则用文件现在的名字)
!command #执行!后接的指令,按enter确认后重新跳转回vim
r!command #不会在终端中执行指令,而是直接将输出结果贴在光标下一行

#注:如果 w 另存为的路径下有同名文件,会导致覆盖问题出现

1.3.2 地址定界(指定一个范围)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#格式
:start_pos,end_pos CMD

#具体输入格式
N #具体第N行,例如2表示定位到第2行
M,N #M代表起始行,N代表结尾行
M,+N #M代表起始行,从光标所在行开始+N行为结尾行
M,-N #M代表起始行,从光标所在行开始-N行为结尾行
M;+N #M代表起始行,从M开始N行。例如2,+3就是第2行到第5行
M;-N #M代表起始行,从M开始-N行。一般搭配其它符号使用

. #当前行
$ #最后一行
.,$-1 #当前行到倒数第二行
% #全文,相当于1,$

/pattern #从光标处开始向下查找,直至到匹配内容的第一行停止
/pat1/,/pat2/ #pat1匹配到的为首行,pat2匹配到的为结尾行
N,/pat/ #从指定行开始,pat第一个匹配到的为结尾行
/pat,$ #从光标处开始,pat第一个匹配的行为起始行,最后一行为结尾行

地址定界后可以跟上对应的操作

1
2
3
4
5
6
7
8
9
10
11
12
p				#输出(粘贴)
d #删除
y #复制

w file #将范围内的行另存为指定文件中,若没指定文件名则使用当前文件名
r file #在指定的位置插入读取的文件中所有内容

t行号 #将前面指定的行复制到N行后
copy行号 #将前面指定的行复制到N行后

m行号 #将前面指定的行移动(剪切)到N行后
move行号 #将前面指定的行移动(剪切)到N行后

1.3.3 查找并替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
:s/查找的内容/替换后的内容/修饰符
:%s 代表全文查找替换(默认一行只替换第一次出现的内容)

查找的内容:可以使用基本正则表达式
替换的内容:不能使用模式,但可以使用\1,\2,……等后向引用符号。用于与捕获组的内容进行复用。
比如\2/\1的意义是将捕获的两个内容反过来,2传递给前面的替换。/用于间隔
&:代表前面查找到的所有内容

#修饰符
i #忽略大小写
g #全局替换(整行)
gc #全局替换,但每次替换前先询问

#分隔符不一定得用/,也可以被#,@等字符替换

1.3.4 定制vim的工作特性

​ 扩展命令模式的配置只对当前vim进程有效,当关闭后就清空了,需要再手动设置。

但我们可将配置存放在文件中持久保存

​ 写配置文件必须保证能识别,不能使用命令模式的简写。必须写全称

1
2
/etc/vimrc		#vim全局配置
~/.vimrc #vim个人配置

1.3.4.1 行号

1
2
:set number | :set nu			#显示行号
:set nonumber | :ser nonu #取消显示行号

1.3.4.2 忽略字符的大小写

1
2
:set ignorecase | :set ic		#忽略字符大小写
:set noignorecase | :set noic #不忽略字符大小写

1.3.4.3 自动缩进

1
2
:set autoindent | set ai		#启用自动缩进
:set noautoindent | set noai #禁用自动缩进

1.3.4.4 复制保留格式

1
2
:set paste						#复制时保留格式
:set nopaste #禁用复制时保留格式的选项

1.3.4.5 显示Tab ^I和换行符$

在vim中 Tab键 使用 ^I 来显示(这是大写i)

行尾(换行符) 使用 $ 来显示

空格 使用 . 来显示(需要另外开启显示空格)

1
2
:set list						#显示系统字符
:set nolist #隐藏系统字符

1.3.4.6 高亮搜索

1
2
:set hlsearch | :set hl			#高亮显示搜索结果
:set nohlsearch | :set nohl #取消高亮显示搜索结果

1.3.4.7 语法高亮

1
2
:syntax on						#语法高亮
:syntax off #关闭语法高亮

1.3.4.8 文件格式

1
2
:set fileformat=dos | :set ff=doc		#启用windows格式
:set fileformat=unix | :set ff=unix #启用unix格式

1.3.4.9 Tab 用空格代替

1
2
:set expandtab | :set et			#使用空格代替Tab,默认8个空格
:set noexpandtab | :set noet #禁用空格代替Tab

1.3.4.10 Tab用指定空格的个数代替

1
:set tabstop=N | :set ts=N			#指定N个空格代替Tab

1.3.4.11 设置缩进宽度

1
2
3
4
>>					#向右缩进 命令模式
<< #向左缩进 命令模式

:set shiftwidth=4 #设置缩进为4个字符

1.3.4.12 设置光标所在行的标识线

1
2
:set cursorline | :set cul			#给光标所在行加 下划线
:set nocursorline | :set nocul #取消光标下划线

1.3.4.13 加密

1
2
3
4
:set key=password			#加密文档
:set key= #取消加密

#加密并不会让文件显示已编辑。所以此时使用x保存会导致命令认为文件没被更改。直接退出,导致密码被丢弃。而wq能保存是因为退出之前必定先保存一次,所以使用wq才能将加密保存进文档

1.3.4.14 帮助(vim的定制)

set 帮助

1
2
3
4
5
6
7
8
:help option-list
#帮助界面

:set
#显示所有已被用户修改过,与默认值不同的选项

:set all
#显示所有选项的当前值

1.4命令模式

​ 命令模式,又称普通模式。功能强大,但在此模式下输入的命令不会在屏幕上显示,所以得记住自己输入了什么,以及非常多的快捷键(区分大小写!!!)

1.4.1 退出vim

1
2
ZZ			#保存退出
ZQ #不保存退出

1.4.2 光标跳转

字符间跳转:

1
2
3
4
5
6
#小写			hjkl
h/← #左
l/→ #右
j/↓ #下
k/↑ #上
Nh | Nl | Nj | Nk #向对应方向跳转N个长度

单词间跳转:

1
2
3
4
w				#下一个单词的词首
e #当前或下一个单词的词尾
b #当前或前一个单词的词首
Nw | Ne | Nb #一次跳N个单词

当前页跳转:

1
2
3
4
5
6
7
8
9
#大写
H #页首
M #页中间行
L #页底

#小写
zt #将光标所在 当前行 移到 屏幕顶端
zz #将光标所在 当前行 移到 屏幕中间
zb #将光标所在 当前行 移到 屏幕底端

行首行尾跳转:

1
2
3
^				#跳转至行首的第一个非空白字符(除了空格以外的字符)
0 #跳转至行首(不管是不是空格)
$ #跳转至行尾

行间移动:

1
2
3
NG | :N			#跳转至指定行。 10G和:10 都是 跳转至第10行
G #最后一行
gg | 1G #第一行

句间移动:

1
2
3
4
5
)				#下一句
( #上一句

#一个句子的定义是以'.','!','?'结尾,后面跟着换行符、空格或制表符
#不识别中文

段落间移动:

1
2
3
4
}				#下一段
{ #上一段

#段落的判断是两段话之间有没有空一行。有空的这一行就会被认定为段落。在修改代码文件中更加适用

命令模式翻屏:

1
2
3
4
5
6
ctrl+f			#向下翻一屏。PageDown也行
ctrl+b #向上翻一屏。PageUp也可以
ctrl+d #向下翻半屏
ctrl+u #向上翻半屏

#翻页方向只针对vim的显示。不与文件的加载顺序相关(文件反过来读取不会识别)

1.4.3 字符编辑

1
2
3
4
5
x				#剪切光标处的字符
Nx #剪切光标处起始的N个字符
xp #交换光标所在处的字符及其后面字符的位置。本质是剪切后粘贴
~ #大小写相互转换。长按可以从左往右一直转换。只会与字母进行交互
J #删除当前行的换行符,将下一行接到当前行。会给一个空格间隔

1.4.4 替换命令(replace)

1
2
r				#只替换光标所在处的一个字符,先敲r,再输入想要替换的新字符
R #切换成REPLACE模式(-- REPLACE -- 提示),按ESC回到命令模式。该模式下只能用方向键来移动光标

1.4.5 删除命令(delete)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
d				#删除命令,可结合光标跳转字符来删除指定范围

d$ | D #从光标处删除到行尾
d^ #从光标处删除到非空行首
d0 #删除光标处到行首

dw #从光标处删除到下一个单词的词首
de #从光标处删除到当前单词词尾或下一单词的词尾
db #从光标处删除到当前单词词首或下一单词的词首

dG #从光标处删除到末尾
dgg #从光标处删除到起始处
dd #删除光标所在行

Ndd #从当前行开始,删N行

#删除的内容其实是被剪切了,还存在缓冲区。可以使用p键粘贴出来

1.4.6 复制命令(yank)

1
2
3
4
5
6
7
8
9
10
11
12
y				#复制,类似没有删除的d命令

y$ #从光标处复制到行尾
y0 #从光标处复制到行首
y^ #从光标处复制到非空行首

yy | Y #复制整行
Nyy | NY #从当前行开始往后复制N行,N表示正整数

yw #从光标处复制到下一个单词的词首
ye #从光标处复制到当前单词词尾或下一个单词的词尾
yb #从光标处复制到当前单词词首或下一个单词的词首

1.4.7 粘贴命令(paste)

1
2
p				#缓冲区存的如果为整行,则粘贴在当前光标所在行的下方;否则直接粘贴在光标后面
P #缓冲区存的如果为整行,则粘贴在当前光标所在行的上方;否则直接粘贴在光标前面

1.4.8 改变命令(change)

1
2
3
4
5
6
7
8
9
10
11
12
c				#删除,并切换成插入模式

c$ | C #从光标处删除到行尾,切换成插入模式
c^ #从光标处删除到非空行首,切换成插入模式
c0 #从光标处删除到行首,切换成插入模式

cc #删除当前行并切换成插入模式
Ncc #从当前行开始往后删除N行,然后切换成插入模式

cw #从光标处删除到下一个单词的词首,切换成插入模式
ce #从光标处删除到当前单词词尾或下一个单词的词尾,切换成插入模式
cb #从光标处删除到当前单词词首或下一个单词的词首,切换成插入模式

1.4.9 查找

1
2
3
4
5
6
7
/PATTERN			#从光标处向下查找
?PATTERN #从光标处向上查找


#
n #让光标跳转到与命令 同方向 的下一个对应值
N #让光标跳转到与命令 反方向 的下一个对应值

1.4.10 撤销更改

1
2
3
4
5
6
7
8
u					#撤销最近的更改,相当于windows中ctrl+z
Nu #撤销之前的N次更改
U #撤销光标落在这行后 所有关于此行的更改

ctrl+r #还原最后的"撤销操作",相当于windows中的ctrl+y

. #重复前一次操作
N. #重复前一次操作N次,N为正整数

1.4.11 高级用法

start position + command + end position

从哪开始 要做什么 到哪里结束

1
2
3
4
5
6
7
8
9
10
11
start command end

0y$ #复制整行,0-$是从行首到行尾
di" #光标在""之间的话,则删除""之间的内容,i"代表""内部的内容
yi( #光标在""之间的话,则删除()之间的内容
vi[ #光标在[]之间的话,则删除[]之间的内容
dtx #从光标处开始删除字符直到遇见第一个 x 字符(不包括x)
dfx #从光标处开始删除字符直到遇见第一个 x 字符(包括x)
ytx #从光标处开始复制字符知道遇见第一个 x 字符(不包括x)
yfx #从光标处开始复制字符知道遇见第一个 x 字符(包括x)
10iabc ESC #在光标处插入10个abc

1.5 可视化模式

​ 在末行有”– VISUAL –”指示时,表示现在处于可视化模式中

可视化模式中允许选择的文本块:

  • v 面向字符, – VISUAL –
  • V 面向整行,– VISUAL LINE –
  • ctrl-v 面向块,– VISUAL BLOCK –

可视化键可用于与移动键结合使用

例如:w ) } 箭头 G 等

被高亮显示的文字可被删除,复制,变更,过滤,搜索,替换等

1
2
3
4
5
6
7
8
#例:在行首插入#号
1、光标移动到指定的第一行行首
2、按下 ctrl+v 进入可视化模式
3、向下移动光标,选中希望操作的每一行第一个字符
4、输入大写字母 I 切换至插入模式
5、输入 #
6、按下 ESC 键
#等待片刻,vim就会自动给你刚开选择的所有行行首加上#

1.6 多窗口模式

1.6.1 多文件分割

1
2
3
4
5
6
#打开多个文件,但每次窗口只显示一个文件的内容
vim file1 file2...

#多文件之间切换
:next(:n) #下一个文件
:prev(:N) #上一个文件
1
2
3
4
5
6
7
8
9
#打开多个文件,并在窗口上同时显示
vim -o | -O file1 file2...
-o #上下分割
-O #左右分割(vim only)

:wqall #退出(所有)——关闭所有窗口
ctrl+w,方向键 #在窗口间切换(↑即去当前窗口的上方窗口)

#不能同时使用o和O,这两个选项是互斥的

1.6.2 单文件窗口分割

1
2
3
4
5
6
ctrl + w,s			#split,水平分割,上下分屏
ctrl + w,v #vertical,垂直分割,左右分屏
ctrl + w,q #取消相邻窗口
ctrl + w,o #取消全部窗口
:wqall #退出全部窗口
ctrl+w,方向键 #在窗口间切换

1.7 帮助(vim的指令)

1
2
3
4
:help				#帮助
:help topic #topic 是指主题。例:help yy 就是查看yy命令的用法
:help index #列出所有主题(命令)
:q #退出help

vim 帮助程序

1
vimtutor

1.8 vim 总结图

175824-20161123224659425-328736487

image-20241027201638741

image-20241027201653359