『运维备忘录』之 Vim 命令详解

运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大家喜欢。

今天我们要讲的是 Vim


一、简介

Vim文本编辑器,是由 vi 发展演变过来的文本编辑器,使用简单、功能强大、是 Linux众多发行版的默认文本编辑器。 

vi ( visual editor ) 编辑器通常被简称为vi,它是Linux和Unix系统上最基本的文本编辑器,类似于Windows系统下的notepad (记事本) 编辑器。Vim (Vi improved)是 vi 编辑器的加强版,比 vi 更容易使用。vi 的命令几乎全部都可以在vim上使用。

文章开头我先对 Vim 相关的一些基础词语做个解释,后面都会有详细的说明,方便大家理解。

官方网站:https://www.vim.org/

1.1. 动词理解

动词代表了我们打算对文本进行什么样的操作。

d  # 表示删除delete
r  # 表示替换replace
c  # 表示修改change
y  # 表示复制yank
v  # 表示选取visual select

1.2. 名词理解

名词代表了我们即将处理的文本。引号或者各种括号所包含的文本称作一个文本块。

w  # 表示一个单词word
s  # 表示一个句子sentence
p  # 表示一个段落paragraph
t  # 表示一个 HTML 标签tag

1.3. 介词理解

 介词界定了待编辑文本的范围或者位置。

i  # 表示在...之内 inside
a  # 表示环绕... around
t  # 表示到...位置前 to
f  # 表示到...位置上 forward

1.4. 数词理解

数词指定了待编辑文本对象的数量,从这个角度而言,数词也可以看作是一种介词。引入数词之后,文本编辑命令的语法就升级成了下面这样:

动词 介词/数词 名词

# 示例
c3w  # 修改三个单词:change three words
d2w  # 删除两个单词:delete two words

另外,数词也可以修饰动词,表示将操作执行 n 次。于是,我们又有了下面的语法:

数词 动词 名词 

# 示例
2dw # 两次删除单词(等价于删除两个单词): twice delete word
3x  # 三次删除字符(等价于删除三个字符): three times delete character

二、Vim 键位操作

按键说明
l        右移光标
gj       下移光标(折行文本)
gk       上移光标(折行文本)
H        移动到当前页面顶部
M        移动到当前页面中间
L        移动到当前页面底部
w        移动到下个单词开头
W        移动到下个单词开头(单词含标点)
e        移动到下个单词结尾
E        移动到下个单词结尾(单词含标点)
b        移动到上个单词开头
B        移动到上个单词开头(单词含标点)
ge       移动到上个单词结尾
gE       移动到上个单词结尾(单词含标点)
%        

跳转到配对的符号(默认支持的配对符号组: '()', '{}', '[]'

在vim中使用 :h matchpairs 获得更多信息)

0移动到行首
^        移动到行首的非空白符
$        移动到行尾
g_       移动到行内最后一个非空白符
gg       移动到文件第一行
G        移动到文件最后一行
5gg or 5G移动到第五行
gd       跳转到局部定义
gD       跳转到全局定义
fx       移动到字符 x 下次出现的位置
tx       移动到字符 x 下次出现的位置的前一个字符
Fx       移动到字符 x 上次出现的位置
Tx       移动到字符 x 上次出现的位置的后一个字符
;        重复之前的f、t、F、T操作
,        反向重复之前的f、t、F、T操作
}        移动到下一个段落 (当编辑代码时则为函数/代码块)
{        移动到上一个段落 (当编辑代码时则为函数/代码块)
zz       移动屏幕使光标居中
zt       移动屏幕使光标位于屏幕顶部
zb       移动屏幕使光标位于屏幕底部
Ctrl + e 向下移动屏幕一行(保持光标不动)
Ctrl + y 向上移动屏幕一行(保持光标不动)
Ctrl + b 向上滚动一屏
Ctrl + f 向下滚动一屏
Ctrl + d 向下滚动半屏
Ctrl + u 向上滚动半屏

 Tips:命令前追加数字表示命令的重复次数, 比如 4j 表示向下移动四行

三、Vim 基础编辑

按键说明
r       替换当前字符
R       在 ESC 按下之前,替换多个字符
J       将下一行合并到当前行, 并在两部分文本之间插入一个空格
gJ      将下一行合并到当前行, 两部分文本之间不含空格
gwip    重新调整段落
g~      大小写转换操作修饰符
gu      小写操作修饰符
gU      大写操作修饰符
cc      将光标所在的行删除, 然后进入插入模式
c$ or C 将光标处到行尾删除, 然后进入插入模式
ciw     将光标所在的单词删除, 然后进入插入模式
cw or ce从光标位置开始, 修改单词
s       删除当前字符, 然后进入插入模式
S       清空当前行, 然后进入插入模式 (同cc)
xp      当前字符后移
u       撤销
U       撤销上一次的改动行的操作
Ctrl + r重做(取消撤销)
.       再次执行上个命令

四、Vim 插入模式

按键说明
i              从光标前开始插入字符
I              从行首开始插入字符
a              从光标后开始插入字符
A              从行尾开始插入字符
o              在当前行之下另起一行, 开始插入字符
O              在当前行之上另起一行, 开始插入字符
ea             从当前单词末尾开始插入
Ctrl + h       在插入模式下,删除光标前的字符
Ctrl + w       在插入模式下,删除光标前的单词
Ctrl + j       在插入模式下,另起一行
Ctrl + t       在插入模式下,向右缩进,宽度由 shiftwidth 控制
Ctrl + d       在插入模式下,向左缩进,宽度由 shiftwidth 控制
Ctrl + n       在插入模式下,在光标之前插入自动补全的下一个匹配项
Ctrl + p       在插入模式下,在光标之前插入自动补全的上一个匹配项
Ctrl + rx      插入寄存器 x 的内容
Ctrl + ox      暂时进入正常模式以发出一个正常模式命令 x
Esc or Ctrl + c退出插入模式

五、Vim 可视化模式

按键说明
v              进入可视化模式, 移动光标高亮选择, 然后可以对选择的文本执行命令(比 y - 复制)
V              进入可视化模式(行粒度选择)
o              切换光标到选择区开头/结尾
Ctrl + v       进入可视化模式(矩阵选择)
O              切换光标到选择区的角
aw             选择当前单词
ab             选择被 () 包裹的区域(含括号)
aB             选择被 {} 包裹的区域(含花括号)
at             选择被 <> 标签包裹的区域(含<>标签)
ib             选择被 () 包裹的区域(不含括号)
iB             选择被 {} 包裹的区域(不含花括号)
it             选择被 <> 标签包裹的区域(不含<>标签)
Esc or Ctrl + c退出可视化模式
>              向右缩进
<              向左缩进
y              复制
d              剪切
~              大小写切换
u              将选中文本转换为小写
U              将选中文本转换为大写

Tips:也可以使用 ( 和 { 分别代替 b 和 B 。

六、Vim Ctrl-c + Ctrl v 神器

按键说明
yy     复制当前行
2yy    复制 2 行
yw     复制当前单词
yiw    复制光标处的单词
yaw    复制光标处的单词及其前后的空格
y$ or Y复制, 从光标位置到行末
p      在光标后粘贴
P      在光标前粘贴
gp     在光标后粘贴并把光标定位于粘贴的文本之后
gP     在光标前粘贴并把光标定位于粘贴的文本之后
dd     剪切当前行
2dd    剪切 2 行
dw     剪切当前单词
diw    删除光标处的单词
daw    删除光标处的单词及其前后的空格
:3,5d  删除 3 至 5 行
:g/{pattern}/d删除所有包含 pattern 的行
:g!/{pattern}/d删除所有不包含 pattern 的行
d$ or D剪切, 从光标位置到行末 (同 D )
x剪切当前字符

Tips:也可以使用以下字符来指定范围:
:.,$d - 从当前行到文件末尾
:.,1d - 从当前行到文件开头
:10,$d - 第 10 行到文件末尾 

七、Vim 保存和退出

按键说明
:w保存
:q关闭文件
:wq | :x | ZZ保存并退出
:wqa保存并退出所有文件
:q! | ZQ强制退出
:qa关闭所有文件
:qa!强制退出所有文件
:w new.txt写入new.txt
:sav new.txt保存并编辑new.txt
:w !sudo tee %写入只读文件

八、Vim 查找和替换

按键说明
/foo向前搜索
/foo\c向前搜索 (不区分大小写)
?foo向后搜索
/\v\d+使用 regex 搜索
n下一个匹配的搜索模式
N上一个匹配的搜索
*向前搜索当前单词
#向后搜索当前单词
%整个文件
’<,’>当前选择
5第 5 行
5,10第 5 行到第 10 行
$最后一行
2,$第 2 行到最后
.当前行
,3接下来的 3 行
-3,转发 3 行
& | \0替换为整个匹配的
\1...\9替换为 0-9 组
\u大写下一个字母
\U后面的大写字符
\l小写下一个字母
\L后面的字符小写
\e\u、\U、\l 和 \L 的结尾
\E\u、\U、\l 和 \L 的结尾
:s/old/new更换行:先更换
:s/old/new/g更换行:全部替换
:s/\vold/new/g更换行:全部替换为 regex
:s/old/new/gc更换行:全部替换_(确认)_
:s/old/new/i更换行:先忽略大小写替换
:2,6s/old/new/g更换行:在 2-6 行之间替换
:%s/old/new更换文件:先更换
:%s/old/new/g更换文件:全部替换
:%s/old/new/gc更换文件:全部替换 (确认)
:%s/old/new/gi更换文件:全部替换 (忽略大小写)
:%s/\vold/new/g更换文件:全部替换为 regex
:g/foo/d删除包含 foo 的行
:g!/foo/d删除不包含 foo 的行
:g/^\s*$/d删除所有空行
:g/foo/t$将包含 foo 的行复制到 EOF
:g/foo/m$将包含 foo 的行移动到 EOF
:g/^/m0反转文件
:g/^/t.复制每一行

实例说明:

:s/a\|b/xxx\0xxx/g               # 将 "a b"      修改为 "xxxaxxx xxxbxxx"
:s/test/\U& file/                # 将 "test"     修改为 "TEST FILE"
:s/\(test\)/\U\1\e file/         # 将 "test"     修改为 "TEST file"
:s/\v([abc])([efg])/\2\1/g       # 将 "af fa bg" 修改为 "fa fa gb"
:s/\v\w+/\u\0/g                  # 将 "bla bla"  修改为 "Bla Bla"
:s/\v([ab])|([cd])/\1x/g         # 将 "a b c d"  修改为 "ax bx x x"
:%s/.*/\L&/                      # 将 "HTML"     修改为 "html"
:s/\v<(.)(\w*)/\u\1\L\2/g        # 将单词的每个首字母大写
:%s/^\(.*\)\n\1/\1/              # 删除重复行
:%s/<\/\=\(\w\+\)\>/\U&/g        # 将 HTML 标记转换为大写
:g/^pattern/s/$/mytext           # 查找文本并将其附加到末尾
:g/pattern/norm! @i              # 在匹配行上运行宏
/^\(.*\)\(\r\?\n\1\)\+$          # 查看重复行
/\v^(.*)(\r?\n\1)+$              # 查看重复行(非常神奇)
:v/./,/./-j                      # 将空行压缩成空行
:g/<p1>/,/<p2>/d                 # 从 <p1> 到 <p2> 包含删除

九、Vim diff 文件比对

用法:

$ vimdiff file1 file2 [file3]
$ vim -d file1 file2 [file3]

按键说明:

按键说明
zf              定义折叠修饰符
zd              删除光标位置的折叠
za              展开 & 关闭光标位置的折叠
zo              展开光标位置的折叠
zc              关闭光标位置的折叠
zr              展开同级的所有折叠
zm              关闭同级的所有折叠
zi              开启 & 关闭折叠功能
]c              光标移至下一处差异
[c              光标移至上一处差异
do or :diffg[et]将另一缓冲区中的差异合并至当前缓冲区
dp or :diffpu[t]将当前缓冲区中的差异推送至另一缓冲区
:diffthis       令当前窗口成为 diff 模式的窗口之一
:dif[fupdate]   强制刷新 diff 的高亮与折叠
:diffo[ff]      令当前窗口退出 diff 模式

Tips:可以直接在终端运行 vimdiff 查看文件间的不同。也可以将该程序设为 git difftool 的选项之一。

十、Vim 标记

按键说明
`^插入模式下光标的最后位置
`.当前缓冲区的最后更改
`"最后退出的当前缓冲区
`0在上次编辑的文件中
''返回当前缓冲区中跳出的行
``返回当前缓冲区中跳转的位置
`[到先前更改或拉出的文本的开头
`]到之前更改或拉出的文本的结尾
`<到最后一个可视化选择的开始
`>到最后一个可视化选择的结尾
ma将此光标位置标记为a
`a跳转到光标位置a
'a跳转到位置为 a 的行首
d'a从当前行删除到标记 a 的行
d`a从当前位置删除到标记 a 的位置
c'a将文本从当前行更改为 a 行
y`a将文本从当前位置拉到 a 的位置
:marks列出所有当前标记
:delm a删除标记a
:delm a-d删除标记a、b、c、d
:delm abc删除标记a、b、c

Tips:可以使用反引号(`)或单引号(')跳转至标记位置。使用单引号会跳转至该标记所在行行首(首个非空白字符)。 

十一、Vim 标签

按键说明
:tabnew or :tabnew {page.words.file}在新标签中打开文件
Ctrl + wT                           将窗口变成标签
gt or :tabn[ext]                    切换到下一个标签
gT or :tabp[revious]                切换到上一个标签
#gt                                 切换到第 # 个标签
:tabm[ove] #                        移动标签到第 # 位(下标从 0 开始)
:tabc[lose]                         关闭当前标签
:tabo[nly]                          关闭其他标签
:tabdo command                      在所有标签中执行命令 (例如 :tabdo q 关闭所有标签)

十二、Vim 多文件编辑

按键说明
:e[dit] 文件名    新建缓冲区打开 filename
:bn[ext]          切换到下个缓冲区
:bp[revious]      切换到上个缓冲区
:bd[elete]        关闭缓冲区
:b[uffer]#        切换到第 # 个缓冲区
:b[uffer] file    用文件名切换缓冲区
:ls or :buffers   列出所有打开的缓冲区
:sp[lit] 文件名   新建缓冲区打开 filename 并水平分割窗口
:vs[plit] 文件名  新缓冲区打开 filename 并垂直分割窗口
:vert[ical] ba[ll]垂直分割窗口编辑所有缓冲区
:tab ba[ll]       标签页编辑所有缓冲区
Ctrl + ws         水平分割窗口
Ctrl + wv         垂直分割窗口
Ctrl + ww         在窗口间切换
Ctrl + wq         关闭窗口
Ctrl + wx         当前窗口与下一个窗口交换位置
Ctrl + w=         令所有窗口高 & 宽一致
Ctrl + wh         切换到左侧窗口
Ctrl + wl         切换到右侧窗口
Ctrl + wj         切换到下侧窗口
Ctrl + wk         切换到上侧窗口
Ctrl + wH         使游标所在视窗全高并移至最左 (最左垂直视窗)
Ctrl + wL         使游标所在视窗全高并移至最右 (最右垂直视窗)
Ctrl + wJ         使游标所在视窗全宽并移至最下 (最下水平视窗)
Ctrl + wK         使游标所在视窗全宽并移至最上 (最上水平视窗)

十三、Vim 宏

按键说明
qa录制宏 a
停止录制宏
@a执行宏 a
@@重新执行上次执行的宏

实例说明:

假设文件包含以下内容:

Hello world
My name is Vim
I am an editor

先在你想在每行末尾添加“!”号。为此,可以使用宏来录制和重放该命令,对于多文本和内容较多的文本操作有很大的帮助。通过以下步骤录制宏:

  1. 将光标置于第一行末尾的单词
  2. 键入“qa”来启动录制宏,并按下“A!”向光标所在位置添加“!”号
  3. 按下“j”将光标移动到下一行
  4. 按下“q”停止录制宏

录制完宏后执行以下命令执行宏:

:%norm!@a

 这将应用宏到整个文件,将“!”添加到每行的末尾。文件现在如下所示:

Hello world!
My name is Vim!
I am an editor!

十四、Vim 常用小技巧

14.1. 删除重复行

:sort | %!uniq -u

14.2. 对文件中的行进行编号

:%!cat -n

14.3. 将整个文档复制到剪贴板

:%w !xclip -i -sel c   # GNU/Linux
:%w !xsel -i -b        # GNU/Linux

14.4. 空格和制表符转换

:set noexpandtab  # 将所有空格转换为制表符
:set expandtab    # 将所有制表符转换为空格

14.5. 保存文件前显示差异

:w !diff % -

这个强烈推荐。

我们可能遇到过这样的情况:我修改了这个文件,但是忘记都做了哪些修改了,并且我担心其中有些地方可能修改错了。解决此问题的方法是查看缓冲区和文件之间的差异。上述命令可以查看。

14.6. 显示拼写错误

:set spell

更多小技巧欢迎大家在评论区分享,让我们一起努力,谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/461800.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RNA二级结构基础知识+一些绘制程序及用法

整理笔记翻出来的&#xff0c;以下所有程序的测试时间都是2019年11月&#xff0c;不保证现在是否能用。基本都来自论文。 此外&#xff0c;这些程序都属于能用&#xff0c;但是对长序列&#xff08;>3000&#xff09;或者复杂序列不够友好的。 &#xff08;后来我自己写了…

巴尔加瓦算法图解:算法运用(上)

目录 树反向索引傅立叶变换 并行算法MapReduce函数 树 如果能将用户名插入到数组的正确位置就好了&#xff0c;这样就无需在插入后再排序。为此&#xff0c;有人设计了一种名为二叉查找树(binary search tree)的数据结构。 每个node的children 都不大于两个。对于其中的每个…

PKI - 借助Nginx 实现Https 服务端单向认证、服务端客户端双向认证

文章目录 Openssl操系统默认的CA证书的公钥位置Nginx Https 自签证书Nginx Https 使用CA签发证书客户端使用自签证书供服务端验证客户端使用 根证书 签发客户端证书 供服务端验证 Openssl https://www.openssl.net.cn/ openssl是一个功能丰富且自包含的开源安全工具箱。 它提…

【Linux系统学习】3.Linux用户和权限

Linux用户和权限 1.认知root用户 1.1 root用户&#xff08;超级管理员&#xff09; 无论是Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。 在Linux系统中&#xff0c;拥有最大权限的账户名为&#xff1a;root&#xff08;超级管理员&#xff09; 而在前期&#…

个人IP塑造与短视频带货,人人都是吸金的网红博主

一、教程描述 网红带货&#xff0c;就是网络红人通过推荐和分享&#xff0c;间接销售产品的一种方式。网红带货并不是直接带货&#xff0c;而是需要打造自己&#xff0c;用时下热门的话讲叫塑造IP&#xff0c;一般通过旅行、工作、日常服装搭配等这些行为&#xff0c;输出自己…

一周学会Django5 Python Web开发-Django5创建项目(用命令方式)

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计11条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

【C语言】SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)

一、SYSCALL_DEFINE3与系统调用 在Linux操作系统中&#xff0c;为了从用户空间跳转到内核空间执行特定的内核级操作&#xff0c;使用了一种机制叫做"系统调用"&#xff08;System Call&#xff09;。系统调用是操作系统提供给程序员访问和使用内核功能的接口。例如&…

24 SEMC相关

文章目录 24.1 SEMC 简介24.2 SEMC 框图剖析24.2.1 通讯引脚24.2.1.1 SEMC 的片选信号24.2.1.2 数据选通信号 DQS 24.2.2 存储器控制器24.2.3 IP 命令和 AXI 命令24.2.4 驱动时钟 24.4 SEMC 初始化配置结构体24.4.1 dqsMode24.4.2 cmdTimeoutCycles24.4.3 busTimeoutCycles24.4…

【C语言自定义类型详解进阶】结构体(补充结构体的对齐和位段,一口气看完系列,央妈都点赞的博文)

目录 1.结构体 1.1 结构的基础知识 1.2 结构的声明 1.2.1特殊的声明&#xff08;匿名结构体类型&#xff09; 1.3结构体变量的定义 1.4关于匿名结构体类型的补充 1.5结构体的自引用 1.6结构体变量的初始化 2.结构体内存对齐&#xff08;重点&#xff09; 2.1偏移量补…

MySQL篇----第十六篇

系列文章目录 文章目录 系列文章目录前言一、数据库中的事务是什么?二、SQL 注入漏洞产生的原因?如何防止?三、为表中得字段选择合适得数据类型四、存储时期前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇…

Qt PCL学习(二):点云读取与保存

注意事项 版本一览&#xff1a;Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容&#xff1a;Qt PCL学习&#xff08;一&#xff09;&#xff1a;环境搭建 0. 效果演示 1. pcl_open_save.pro QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgets// 添加下行代码&#…

昆仑万维发布天工 2.0 大语言模型及AI助手App;AI成功破解2000年前碳化古卷轴

&#x1f989; AI新闻 &#x1f680; 昆仑万维发布天工 2.0 大语言模型及AI助手App 摘要&#xff1a;昆仑万维近日推出了新版MoE大语言模型“天工 2.0”和相应的“天工 AI 智能助手”App&#xff0c;宣称为国内首个面向C端用户免费的基于MoE架构的千亿级参数大模型应用。天工…