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

发布时间:2024年01月17日

承接上篇文章的整理,本篇将继续梳理汇总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

以水平方式切割屏幕展示

退出使用命令

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

以垂直方式切割屏幕展示

退出使用命令

:qa

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

缺点:视窗界面偏小

1.2命令使用参数p

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

vim  -p $(seq 1 10)

结果如图所示:?

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

1.3切换标签页

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

tabnext

此时窗口显示在2 文件

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

结果如下:

1.5编辑创建新文件

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

:tabedit a

?结果如图所示:

tabedit 缩写:tabe?

1.6关闭文件

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

:tabclose

?tabclose 缩写:tabc

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

:tabonly

?结果如图所示:

tabonly 缩写:tabo?

1.7命令不使用参数

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

vim a b c d

?这个时候使用命令:

:ls

可以看到当前的buffer有4个文件:

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

:tab ball

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

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

vim -o a b c d

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

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

:tabs

?

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

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

:tabdo tab ball

?

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

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

:tab split

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

然后使用命令:

:tabm 4

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

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

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

:tab drop 文件名

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

还有一种情况:目录下有文件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

?结果如图所示:

2.3vimdiff命令

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

vimdiff d e

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

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

vim -d d f

结果如图所示:

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

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

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

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

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

2.4diffput命令

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

:diffput

?此时文件该行就统一了:

diffput 缩写:dp?

2.5diffget命令

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

:diffget

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

diffget 缩写:do?

注意:

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

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

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

:9,16diffput
:8,25diffget

结果如下:

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

:wqa

?保存并退出全部文件。

注意

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

2.6diffsplit命令

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

:diffsplit 文件名

结果:

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

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

:vert diffsplit e

--vert是vertical的缩写

结果:

三、常用命令汇总合集

序列命令注释

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

6.追加文本

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

7.删除文本

x在命令模式下,将光标放在你想要删除的字符上,按下小写字母?x。这将删除当前光标所在位置的单个字符
nxn 为数字,连续向后删除 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 即可剪切
nddn 为数字。剪切光标所在的向下 n 行,例如 20dd 则是剪切 20 行(常用),用 p/P 可以粘贴。
:1,10d将 1-10 行剪切。利用 p 命令可将剪切后的内容进行粘贴。
:1, 10 m? 20将第 1-10 行移动到第 20 行之后。
x在命令模式下,将光标移动到要剪切的字符上,按下小写字母?x?来删除当前光标所在位置的单个字符,并将其存储在剪贴板中。要剪切多个字符,请连续按下?x?键直到删除所需的文本。

10.复制文本

yy复制游标所在的那一行,当前行
nyyn 为数字。复制光标所在的向下 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)

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

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

文章来源:https://blog.csdn.net/m0_71406734/article/details/135614307
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。