承接上篇文章的整理,本篇将继续梳理汇总vi/vim命令的其他用法!
目录
?
vim -o a b c
以水平方式切割屏幕展示
退出使用命令
:qa
vim -O a b c
以垂直方式切割屏幕展示
退出使用命令
:qa
优点:编辑一个文件的同时可以参考其他文件
缺点:视窗界面偏小
如果想编辑多个文件,但没有同屏显示的需求,可以使用vim的 tab pages 功能参数 -p,命令如下:
vim -p $(seq 1 10)
结果如图所示:?
这样每个文件会以标签页的方式打开,每个标签占满整个视窗范围,相较于切割屏幕为多个窗口的方式,可视范围更大一些。
如果要切换到?下一个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
如果要移动标签,比如我将第10个标签移动到第1个标签之后,使用命令:
:tabmove 标签移动的位置
--例如:
:tabmove 1
结果如下:
如果想编辑新的文件,比如文件a,可以使用命令:
:tabedit a
?结果如图所示:
tabedit 缩写:tabe?
如果想关闭文件,使用命令:
:tabclose
?tabclose 缩写:tabc
如果想只保留当前文件,关闭其他所有文件,可以使用命令:
:tabonly
?结果如图所示:
tabonly 缩写:tabo?
如果编辑多个文件的时候没有添加任何参数:
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 以标签页的形式打开文件,他就会在新的页标签打开该文件:
如果想知道两个文件b和c是否相同,可以计算它们的哈希函数,比如md5sum:
md5sum b c
然后对比结果就知道它们是否相同,如下所示:
如果想知道文件的内容具体的差异,可以使用diff命令,比如对比文件d和e:
diff d e -y
?结果如图所示:
如果想对比的时候进行编辑,可以是使用命令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 :
此时两个文件该行就保持一致。
这种方式在两个文件之间切换修改效率很低,因为对比的时候,两个文件往往只需要在一个差异点使用d 或 e 的内容,可以使用快捷命令来实现,用CTRL+w+h命令切换到左侧窗口,比如d文件的第10行,希望将5复制过去,那么就可以使用命令:
:diffput
?此时文件该行就统一了:
diffput 缩写:dp?
同样在第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只适合两个文件的应用。
如果已经打开了一个文件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 。这将删除当前光标所在位置的单个字符 |
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] |
| |
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 | |
: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)
最后感谢大家的查看,希望对你们都有帮助,如果喜欢的话就点赞+关注支持一下吧!
我会持续总结梳理自己的学习笔记和分享项目工作经验,以及总结并分享工作中遇到问题的解决方案,感谢你们的陪伴!!!