运维人员不仅要熟悉操作系统、服务器、网络等只是,甚至对于开发相关的也要有所了解。很多运维工作者可能一时半会记不住那么多命令、代码、方法、原理或者用法等等。这里我将结合自身工作,持续给大家更新运维工作所需要接触到的知识点,希望大家喜欢。
今天我们要讲的是 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 | 😡 | ZZ | 保存并退出 |
:wqa | 保存并退出所有文件 |
:q! | ZQ | 强制退出 |
:qa | 关闭所有文件 |
:qa! | 强制退出所有文件 |
:w new.txt | 写入new.txt |
:sav new.txt | 保存并编辑new.txt |
:w !sudo tee % | 写入只读文件 |
八、Vim 查找和替换
按键 | 说明 |
/foo | 向前搜索 |
/fooc | 向前搜索(不区分大小写) |
?foo | 向后搜索 |
/vd+ | 使用regex搜索 |
n | 下一个匹配的搜索模式 |
N | 上一个匹配的搜索 |
* | 向前搜索当前单词 |
# | 向后搜索当前单词 |
% | 整个文件 |
’ | 当前选择 |
5 | 第5行 |
5,10 | 第5行到第10行 |
$ | 最后一行 |
2,$ | 第2行到最后 |
. | 当前行 |
,3 | 接下来的3行 |
-3, | 转发3行 |
&| | 替换为整个匹配的 |
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/xxxxxx/g # 将 "a b" 修改为 "xxxaxxx xxxbxxx"
:s/test/U& file/ # 将 "test" 修改为 "TEST FILE"
:s/(test)/U1e file/ # 将 "test" 修改为 "TEST file"
:s/v([abc])([efg])/21/g # 将 "af fa bg" 修改为 "fa fa gb"
:s/vw+/u/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/U&/g # 将 HTML 标记转换为大写
:g/^pattern/s/$/mytext # 查找文本并将其附加到末尾
:g/pattern/norm! @i # 在匹配行上运行宏
/^(.*)(r?n1)+$ # 查看重复行
/v^(.*)(r?n1)+$ # 查看重复行(非常神奇)
:v/./,/./-j # 将空行压缩成空行
:g//,//d # 从 到 包含删除
九、Vimdiff 文件比对
用法:
$ 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 |
q | 停止录制宏 |
@a | 执行宏 a |
@@ | 重新执行上次执行的宏 |
实例说明:
假设文件包含以下内容:
Hello world
My name is Vim
I am an editor
先在你想在每行末尾添加“!”号。为此,可以使用宏来录制和重放该命令,对于多文本和内容较多的文本操作有很大的帮助。通过以下步骤录制宏:
- 将光标置于第一行末尾的单词
- 键入“qa”来启动录制宏,并按下“A!”向光标所在位置添加“!”号
- 按下“j”将光标移动到下一行
- 按下“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.fwqtg.net