Linux系统使用超详细(十)~vi/vim命令②

承接上篇文章的整理,本篇将继续梳理汇总vi/vim命令的其他用法!

目录

一、使用vim编辑多个文件

1.1命令使用参数o和O

1.2命令使用参数p

1.3切换标签页

1.4移动标签页

1.5编辑创建新文件

1.6关闭文件

1.7命令不使用参数

二、文件对比

2.1md5sum函数

2.2diff命令

2.3vimdiff命令

2.4diffput命令

2.5diffget命令

2.6diffsplit命令

三、常用命令汇总合集

1.终端启动

2.vi/vim窗口打开文件

3.退出

4.查看

5.光标移动

6.追加文本

7.删除文本

8.撤销

9.剪切文本

10.复制文本

11.连接行

12.粘贴文本

13.查找替换

14.多个文件切换

15.行号


 

一、使用vim编辑多个文件

1.1命令使用参数o和O

  • 使用参数 o (小写)
vim -o a b c

以水平方式切割屏幕展示

Linux系统使用超详细(十)~vi/vim命令②_第1张图片

退出使用命令

:qa
  • 使用参数 o (大写)
vim -O a b c

以垂直方式切割屏幕展示

Linux系统使用超详细(十)~vi/vim命令②_第2张图片

退出使用命令

:qa

优点:编辑一个文件的同时可以参考其他文件

缺点:视窗界面偏小

1.2命令使用参数p

如果想编辑多个文件,但没有同屏显示的需求,可以使用vim的 tab pages 功能参数 -p,命令如下:

vim  -p $(seq 1 10)

结果如图所示: 

Linux系统使用超详细(十)~vi/vim命令②_第3张图片

这样每个文件会以标签页的方式打开,每个标签占满整个视窗范围,相较于切割屏幕为多个窗口的方式,可视范围更大一些。

1.3切换标签页

如果要切换到 下一个tab,可以使用命令:

tabnext

此时窗口显示在2 文件

Linux系统使用超详细(十)~vi/vim命令②_第4张图片

tabnext 缩写:tabn 

如果想切换到某一个确定的标签,可以输入命令:

tabn 序号
--比如切换到第6个标签
tabn 6

一种更快的方式是在命令模式下直接输入 gt (意思是:goto tab),就可以切换过去;

gt  前面可以加上数字,比如 :2gt  切换到第2个标签,跳转到第8个标签,输入 :8gt

如果要切换到上一个标签,可以使用命令:

:tabprev

tabprev 缩写: tabp

也可以使用更快的方式,在命令模式下直接输入  gT ,就可以切换过去;

如果要切换到第一个标签,使用命令:

:tabfirst

tabfirst 缩写:tabf

如果要切换到最后一个标签,使用命令: 

:tablast

1.4移动标签页

如果要移动标签,比如我将第10个标签移动到第1个标签之后,使用命令:

:tabmove 标签移动的位置
--例如:
:tabmove 1

结果如下:

Linux系统使用超详细(十)~vi/vim命令②_第5张图片

1.5编辑创建新文件

如果想编辑新的文件,比如文件a,可以使用命令:

:tabedit a

 结果如图所示:

Linux系统使用超详细(十)~vi/vim命令②_第6张图片

tabedit 缩写:tabe 

1.6关闭文件

如果想关闭文件,使用命令:

:tabclose

 tabclose 缩写:tabc

如果想只保留当前文件,关闭其他所有文件,可以使用命令:

:tabonly

 结果如图所示:

Linux系统使用超详细(十)~vi/vim命令②_第7张图片

tabonly 缩写:tabo 

1.7命令不使用参数

如果编辑多个文件的时候没有添加任何参数

vim a b c d

 这个时候使用命令:

:ls

可以看到当前的buffer有4个文件:Linux系统使用超详细(十)~vi/vim命令②_第8张图片

如果这个时候想把这些buffer切换为tab页的方式,可以使用命令:

:tab ball

 将所有buffer以标签页的方式打开,这样buffer里面的内容都会以tab标签页的方式打开,结果如下:

Linux系统使用超详细(十)~vi/vim命令②_第9张图片

如果打开文件的时候以水平切割的方式打开:

vim -o a b c d

Linux系统使用超详细(十)~vi/vim命令②_第10张图片

这个时候要切换为tab标签页的方式,可以使用快捷键 CTRL+w+T 

Linux系统使用超详细(十)~vi/vim命令②_第11张图片

查看当前的标签页状态:输入以下命令查看当前的标签页状态:

:tabs

 Linux系统使用超详细(十)~vi/vim命令②_第12张图片

这将显示当前所有打开的标签页以及它们的编号和文件名。

展开所有标签页:执行以下命令来展开所有标签页所包含的文件:

:tabdo tab ball

 Linux系统使用超详细(十)~vi/vim命令②_第13张图片

这将对每个标签页执行 :tab ball 命令,使其展开为单独的窗口。

tab pages 还支持相同文件在不同标签中打开,比如当前我正在编辑文件a,使用命令:

:tab split

将打开一个镜像文件,如下所示:

Linux系统使用超详细(十)~vi/vim命令②_第14张图片

然后使用命令:

:tabm 4

 将镜像文件移动到文件d和e之间,如下所示:

Linux系统使用超详细(十)~vi/vim命令②_第15张图片

如果编辑文件d和e,我需要参考a的话,不需要频繁在第一个标签和它们之间切换,这个时候只需要在相邻标签之间切换即可,这样就很方便并提高效率。同时对于a的修改,我添加一个数字1和字母 b,它和第一个标签内容是同步的。如下所示:

Linux系统使用超详细(十)~vi/vim命令②_第16张图片

Linux系统使用超详细(十)~vi/vim命令②_第17张图片

如果不希望同样的文件在多个标签被打开,那么在打开文件的时候使用命令:

:tab drop 文件名

比如我现在要打开文件e,但是这个文件e已经在标签页打开了,那么我在使用tab drop的时候,它就不会打开新的文件。但是我要是打开新的文件f,因为标签页内f文件没有被打开,所以会在新的页面打开,如下所示:

Linux系统使用超详细(十)~vi/vim命令②_第18张图片

还有一种情况:目录下有文件a和Index,而文件a的内容有index这个单词,如下所示:

这个时候我们可以把光标移动到index这个单词,

然后按下快捷键 gf 就可以快速打开对应的文件,如下所示:

index文件内容:

如果希望在tab标签页打开index文件,可以使用CTRL+w+gf 以标签页的形式打开文件,他就会在新的页标签打开该文件:

二、文件对比

2.1md5sum函数

如果想知道两个文件b和c是否相同,可以计算它们的哈希函数,比如md5sum:

md5sum b c

然后对比结果就知道它们是否相同,如下所示:

2.2diff命令

如果想知道文件的内容具体的差异,可以使用diff命令,比如对比文件d和e:

diff d e -y

 结果如图所示:

Linux系统使用超详细(十)~vi/vim命令②_第19张图片

2.3vimdiff命令

如果想对比的时候进行编辑,可以是使用命令vimdiff,比如对d和e文件进行编辑:

vimdiff d e

这样就会以对比的模式,以垂直切割窗口的方式来显示两个文件的差异:

Linux系统使用超详细(十)~vi/vim命令②_第20张图片

同样可以使用 vim -d 的方式打开两个文件:

vim -d d f

结果如图所示:

Linux系统使用超详细(十)~vi/vim命令②_第21张图片

对比发现,相同的行会折叠起来,比如d e文件前三行是相同的,所以被折叠起来,可以使用 zo 来打开折叠,使用zc 恢复折叠。

这两个文件总共有五处有差异,有差异的行会进行背景颜色高亮标注 。如果想在这些差异点之间进行跳转的话,可以使用 ]c 跳转到下一个差异点,使用2]c 跳转到下两个差一点,使用  [c 跳转到上一个差一点。

当跳转到需要修改的差异点之后就可以进行编辑。比如:

现在将e文件里面缺少10 的一行修改为10,用CTRL+w+l命令切换到右侧窗口,然后输入10 :

Linux系统使用超详细(十)~vi/vim命令②_第22张图片

此时两个文件该行就保持一致。

2.4diffput命令

这种方式在两个文件之间切换修改效率很低,因为对比的时候,两个文件往往只需要在一个差异点使用d 或 e 的内容,可以使用快捷命令来实现,用CTRL+w+h命令切换到左侧窗口,比如d文件的第10行,希望将5复制过去,那么就可以使用命令:

:diffput

 此时文件该行就统一了:Linux系统使用超详细(十)~vi/vim命令②_第23张图片

diffput 缩写:dp 

2.5diffget命令

同样在第19行,使用命令:

:diffget

 此时会将e文件的内容复制过来:

Linux系统使用超详细(十)~vi/vim命令②_第24张图片

diffget 缩写:do 

注意:

如果差异有多行,diffget 和 diffput 作用范围也是多行;

diffget 和 dfiiput 在visual 模式即高亮模式下面无效;

如果两个文件差异点比较多,每次diffget和diffput就会很慢, 那么就可以设定一个范围进行一个批量修订,比如:在第 9行和第 16行之间用diffput,在第 18行到25行之间使用diffget,命令如下:

:9,16diffput
:8,25diffget

结果如下:

Linux系统使用超详细(十)~vi/vim命令②_第25张图片

修改完毕之后,使用命令:

:wqa

 保存并退出全部文件。

注意

diffget和diffput只适合两个文件的应用。

2.6diffsplit命令

如果已经打开了一个文件d,现在想打开另一个文件来对比的话,可以使用命令:

:diffsplit 文件名

结果:

Linux系统使用超详细(十)~vi/vim命令②_第26张图片

这样就以水平切割窗口方式打开了d和e文件;

如果以垂直切割窗口方式打开了d和e文件,使用命令:

:vert diffsplit e

--vert是vertical的缩写

结果:

Linux系统使用超详细(十)~vi/vim命令②_第27张图片

三、常用命令汇总合集

序列 命令 注释

1.终端启动

vi 直接启动vi
vim 直接启动vim
vi  文件名 打开vi并创建文件
vim 文件名 打开文件并创建文件
vim file 打开单个文件
vim file1 file2 file3 ... 打开多个文件

2.vi/vim窗口打开文件

:open file 在vim窗口打开一个新文件
:split file 在新窗口打开文件

3.退出

:wq 保存并退出
:q! 强制退出并丢弃更改文件
:w 保存但不退出
:q 对未修改的文件或已保存的文件实现退出操作
ZZ 如果修改过,保存当前文件,然后退出;=wq
ZQ 不保存,强制退出。效果等同于 :q!
:w [filename] 将编辑的数据储存成另一个档案(类似另存新档)
:r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面
:n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。
:! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如
『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息

4.查看

:args 查看当前打开的文件列表,当前正在编辑的文件会用 [] 括起来。
:ls 列出当前打开的文件列表,其中包含了当前打开的文件的信息,如编号、文件名和状态等。
:buffers 显示当前缓冲区的信息,包括缓冲区编号、文件名、是否被修改等。

5.光标移动

h或 向左箭头键(←) 向左移动一个字符
j或 向下箭头键(↓) 向下移动一个字符
k或 向上箭头键(↑) 向上移动一个字符
l或 向右箭头键(→) 向右移动一个字符
w(小写) 向前移动到下一个单词的开头
W(大写) 向前移动到下一个以空格分隔的单词的开头,忽略标点符号和其他非空白字符。
b 向后移动到前一个单词的开头
B 向后移动到前一个以空格分隔的单词的开头,忽略标点符号和其他非空白字符。
e 向前移动到当前或下一个单词的末尾
0(数字零)或功能键[Home] 移动到当前行的行首
^ 移动到当前行第一个非空白字符的位置
$或功能键[End] 移动到当前行的行尾。
G 单独使用 G 命令会将光标定位到文件的最后一行
numberG 跳转到指定的行号,将 number 替换为目标行号,然后按下 G 键。例如,要跳转到文件的第 10 行,可以输入 10G
ctrl f 或page down 屏幕『向下』移动一页
ctrl b 或page up 屏幕『向上』移动一页
ctrl d

屏幕『向下』移动半页

ctrl u 屏幕『向上』移动半页
+ 光标移动到非空格符的下一行
- 光标移动到非空格符的上一行
n n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。
H 光标移动到这个屏幕的最上方那一行的第一个字符
M 光标移动到这个屏幕的中央那一行的第一个字符
L 光标移动到这个屏幕的最下方那一行的第一个字符
gg 移动到这个档案的第一行,相当于 1G
n n 为数字。光标向下移动 n 行(常用)

6.追加文本

a  在光标所在位置的后面追加文本,按下小写字母 a 进入插入模式
A 在当前行的行尾追加文本,按下大写字母 A 进入插入模o
o(小写字母) 在当前行的下方追加新行,并进入插入模式。
O(大写字母)  在当前行的上方追加新行,并进入插入模式。

7.删除文本

x 在命令模式下,将光标放在你想要删除的字符上,按下小写字母 x。这将删除当前光标所在位置的单个字符
nx n 为数字,连续向后删除 n 个字符。删除当前光标开始向后三个字符
X 删除当前字符的前一个字符,X=dh
dh 删除前一个字符
dl  删除当前字符, dl=x
dw 在命令模式下,将光标放在你想要删除的单词上,按下 dw。这将删除从光标所在位置到单词末尾的所有字符,包括空格分隔符。
dj 删除上一行
dk 删除下一行
10d 删除当前行开始的 10 行
:1,10d 删除 1-10 行
:1,$d 删除所有行
:11,$d 删除 11 行及以后所有的行
d1G 删除光标所在到第一行的所有数据
dG 删除光标所在到最后一行的所有数据
d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符
dd 在命令模式下,将光标放在你想要删除的行上,按下 dd。这将删除整行文本。
#dd 在命令模式下,将光标移动到你想要删除的行上。输入数字 #,代表你要删除的行数。例如,如果想删除当前行和下面的两行,就输入 3。常用于删除指定行数的文本
D  在命令模式下,将光标放在你想要删除的行内某个位置上,按下大写字母 D。这将删除从光标位置到行尾的所有字符。D=d$
d$ 删除当前字符之后的所有字符(本行)
:n1,n2d 命令 在命令模式下,输入 :n1,n2d,其中 n1 和 n2 是要删除的行号范围。这将删除指定行号范围内的所有行。
Visual 模式 进入可视模式(按下大写字母 V)后,通过移动光标选择要删除的文本块。然后按下 d 命令来删除选中的文本。
kdgg 删除当前行之前所有行(不包括当前行)
jdG(jd shift + g) 删除当前行之后所有行(不包括当前行)
J(shift + j)  删除两行之间的空行,实际上是合并两行。

8.撤销

u 撤销(Undo),复原前一个动作。
U 撤销对整行的操作
:undo [n]  进入命令模式,按下 Esc 键确保处于命令模式,输入 :undo [n] 命令,并按下回车键,[n] 是一个可选参数,表示要撤销的步骤数,默认为 1,将撤销指定数量的编辑操作
:e! :e 表示重新加载当前文件。! 表示强制重新加载,忽略未保存的更改。将丢弃所有未保存的更改并还原文件为上次保存的版本
Ctrl + r  重做(Redo),即撤销的撤销
:earlier [n]

[n] 是一个可选参数,表示要撤销到的特定操作或保存点。将撤销到指定的操作或保存点之前的状态

9.剪切文本

v/V+d 正常模式下按 v(逐字)或 V(逐行)进入可视模式,然后用 jklh 命令移动即可选择某些行或字符,再按 d 即可剪切
ndd n 为数字。剪切光标所在的向下 n 行,例如 20dd 则是剪切 20 行(常用),用 p/P 可以粘贴。
:1,10d 将 1-10 行剪切。利用 p 命令可将剪切后的内容进行粘贴。
:1, 10 m  20 将第 1-10 行移动到第 20 行之后。
x 在命令模式下,将光标移动到要剪切的字符上,按下小写字母 x 来删除当前光标所在位置的单个字符,并将其存储在剪贴板中。要剪切多个字符,请连续按下 x 键直到删除所需的文本。

10.复制文本

yy 复制游标所在的那一行,当前行
nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行
yG 复制游标所在行到最后一行的所有数据
y0 复制光标所在的那个字符到该行行首的所有数据
y$ 复制光标所在的那个字符到该行行尾的所有数据
yW 从当前光标位置到下一个单词的开头。
y^ 从当前光标位置到文本行的第一个非空字符。
:1,10 co 20 将 1-10 行插入到第 20 行之后
:1,$ co $ 将整个文件复制一份并添加到文件尾部

11.连接行

J 在命令模式下,将光标放在要连接的第一行的末尾处(即行尾),然后按下大写字母 J 键。这将删除第一行的换行符,并将其与下一行合并为一行。
:join 在命令模式下,输入 :join 命令,然后按下回车键。这将连接当前行和下一行,并将它们合并为一行。

12.粘贴文本

p 在当前光标后粘贴, 如果之前使用了 yy 命令来复制一行,那么就在当前行的下一行粘贴
shift+p  在当前行前粘贴

13.查找替换

/word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可!按 n 查找下一个,按 N 查找前一个。
?word 向光标之上寻找一个字符串名称为 word 的字符串。反向查找,按 n 查找下一个,按 N 查找前一个。

:%s/pattern/replacement/g

等同

: [定址]s/旧/新/[g]

命令替换:不加定址只会替换光标所在的一行中匹配上的字符;

定址:  

1     只替换第一行

1,5   第一行到第五行

%     全部行

5,$   第五行到最后一行

$-3   倒数第四行

$-9,$ 倒数第10行到最后一行

加上 g   是整行所有匹配到的字符都替换

不加 g   是替换(定址)选中行的第一个匹配项

#替换所有的root为ROOT
:%s/root/ROOT/g
#替换所有行的第一个root为ROOT
:%s/root/ROOT/
#替换光标当前行的root为ROOT
:s/root/ROOT/g
#替换第一行的第一个root为ROOT
:1s/root/ROOT/
#替换后10行的/为\
:$-9,$s/\//\\/g

:1,$s/word1/word2/g 

 :%s/word1/word2/g

从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !

:1,$s/word1/word2/gc 

 :%s/word1/word2/gc

从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代
 .*[]^%/?~$ 文本查找中的特殊字符,需要转义
:set ignorecase 忽略大小写的查找
:set noignorecase 不忽略大小写的查找
* 或 #键 查找很长的词,如果一个词很长,键入麻烦,可以将光标移动到该词上,按 * 或 #键即可以该单词进行搜索,相当于 / 搜索。而 #命令相当于? 搜索。
:set hlsearch 高亮搜索结果,所有结果都高亮显示,而不是只显示一个匹配。
:set nohlsearch 关闭高亮搜索显示
:nohlsearch 关闭当前的高亮显示,如果再次搜索或者按下 n 或 N 键,则会再次高亮
:set incsearch 逐步搜索模式,对当前键入的字符进行搜索而不必等待键入完成。
:set wrapscan 重新搜索,在搜索到文件头或尾时,返回继续搜索,默认开启。

14.多个文件切换

:bn 切换到下一个文件
:bp 切换到上一个文件
:next 或 :n  切换到下一个文件
:previous 或 :N  切换到上一个文件

15.行号

:set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号
:set nonu

取消行号

有关vi和vim命令的使用方法就梳理汇总到此了,上述大部分命令我均以进行练习实验,是可靠使用的,如果内容编辑有错误的地方还请评论区留言。同时非常感谢两位博主的优秀文章,我的总结中有一些部分是参考了他们的文章内容,还有很多命令我没有实验,大家如果感兴趣或者有需要的可以亲自实验,博主文章链接我放这里:

Vim 命令、操作、快捷键(收藏大全) - 知乎 (zhihu.com)

Linux vi/vim | 菜鸟教程 (runoob.com)

最后感谢大家的查看,希望对你们都有帮助,如果喜欢的话就点赞+关注支持一下吧!

我会持续总结梳理自己的学习笔记和分享项目工作经验,以及总结并分享工作中遇到问题的解决方案,感谢你们的陪伴!!!

你可能感兴趣的:(Linux,linux,vim,运维)