200字
VIM工具
2025-11-26
2025-11-26

文本编辑工具之神 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是指正则表达式

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默认就是命令模式

#命令模式----->插入模式

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

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

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


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

输入冒号即是扩展命令:


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

按esc键即可退出编辑模式

1.2.3 vim中插入颜色字符

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

1.3 扩展命令模式

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

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

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

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

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

#格式
: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第一个匹配的行为起始行,最后一行为结尾行

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

p				#输出(粘贴)
d				#删除
y				#复制

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

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

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

1.3.3 查找并替换

:s/查找的内容/替换后的内容/修饰符
:%s				代表全文查找替换(默认一行只替换第一次出现的内容)

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

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

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

1.3.4 定制vim的工作特性

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

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

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

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

1.3.4.1 行号

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

1.3.4.2 忽略字符的大小写

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

1.3.4.3 自动缩进

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

1.3.4.4 复制保留格式

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

1.3.4.5 显示Tab ^I和换行符$

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

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

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

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

1.3.4.6 高亮搜索

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

1.3.4.7 语法高亮

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

1.3.4.8 文件格式

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

1.3.4.9 Tab 用空格代替

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

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

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

1.3.4.11 设置缩进宽度

>>					#向右缩进 命令模式
<<					#向左缩进 命令模式

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

1.3.4.12 设置光标所在行的标识线(下划线)

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

1.3.4.13 加密

:set key=password			#加密文档
:set key=					#取消加密

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

1.3.4.14 帮助(vim的定制)

set 帮助

:help option-list
#帮助界面

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

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

1.4命令模式

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

1.4.1 退出vim

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

1.4.2 光标跳转

字符间跳转:

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

单词间跳转:

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

当前页跳转:

#大写
H				#页首
M				#页中间行
L				#页底

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

行首行尾跳转:

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

行间移动:

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

句间移动:

)				#下一句
(				#上一句

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

段落间移动:

}				#下一段
{				#上一段

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

命令模式翻屏:

ctrl+f			#向下翻一屏。PageDown也行
ctrl+b			#向上翻一屏。PageUp也可以
ctrl+d			#向下翻半屏
ctrl+u			#向上翻半屏

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

1.4.3 字符编辑

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

1.4.4 替换命令(replace)

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

1.4.5 删除命令(delete)

d				#删除命令,可结合光标跳转字符来删除指定范围

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

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

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

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

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

1.4.6 复制命令(yank)

y				#复制,类似没有删除的d命令

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

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

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

1.4.7 粘贴命令(paste)

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

1.4.8 改变命令(change)

c				#删除,并切换成插入模式

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

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

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

1.4.9 查找

/PATTERN			#从光标处向下查找
?PATTERN			#从光标处向上查找


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

1.4.10 撤销更改

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

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

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

1.4.11 高级用法

start position + command + end position

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

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

1.6 多窗口模式

1.6.1 多文件分割

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

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

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

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

1.6.2 单文件窗口分割

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

1.7 帮助(vim的指令)

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

vim 帮助程序

vimtutor

1.8 vim 总结图

175824-20161123224659425-328736487

image-20241027201638741

image-20241027201653359

评论