0


『运维备忘录』之 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 暂时进入正常模式以发出一个正常模式命令 xEsc 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将此光标位置标记为aa跳转到光标位置a'a跳转到位置为 a 的行首d'a从当前行删除到标记 a 的行da从当前位置删除到标记 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录制宏 aq 停止录制宏@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

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

标签: 运维 编辑器 linux

本文转载自: https://blog.csdn.net/yip1228/article/details/136035505
版权归原作者 流浪字节π 所有, 如有侵权,请联系我们删除。

“『运维备忘录』之 Vim 命令详解”的评论:

还没有评论