1. VIM的特性
Vim 是一款高度可定制的文本编辑器,具有以下特点:
- 多模式编辑:Vim 采用多模式设计,主要包括普通模式(Normal Mode)、插入模式(Insert Mode)、命令模式(Command Mode)和可视模式(Visual Mode),每种模式都有其特定的功能。
- 高效操作:通过键盘快捷键和命令,用户可以快速执行各种编辑操作,无需频繁切换鼠标和键盘,从而提高编辑效率。
- 可扩展性:Vim 支持插件扩展,用户可以根据自己的需求安装各种插件,以增强编辑器的功能。
- 跨平台:Vim 可以在多种操作系统上运行,包括 Linux、macOS、Windows 等。
- 丰富的文档和社区支持:Vim 拥有庞大的用户社区和丰富的文档资源,用户可以轻松找到相关的帮助和教程。
2. VIM的模式
- Normal(default): 普通模式,Vim 将键盘输入视为命令,而不是直接插入文本。此模式提供了强大的文本编辑功能,例如移动光标、删除文本、复制粘贴等。
- Insert: 插入模式,Vim 会将键盘输入直接插入到文件中。
进入Insert模式:
- 按 i 进入 Insert 模式,位置: 当前光标前插入
- 按 a 进入 Insert 模式,位置: 当前光标后插入
- 按 I 进入 Insert 模式,位置: 光标当前行开头插入
- 按 A 进入 Insert 模式,位置: 光标当前行末尾插入
- 按 o 进入 Insert 模式,位置: 光标当前行下方插入新行
- 按 O 进入 Insert 模式,位置: 光标当前行上方插入新行
退出Insert模式:
- 按键返回到 Normal 模式 - Visual: 可视模式,用于选择文本范围,对选中文本进行操作。
进入Visual模式:
- 按 v 进入 Visual模式, 逐个字符选择
- 按 V 进入 Visual-Line模式, 逐行选择
- 按 Ctrl+v 进入 Visual-Block模式,逐列选择
可用命令:
- 方向键(h j k l)选择文本
-y复制 选中的文本
-d删除 选中的文本
->缩进 选中的文本
-<反缩进 选中的文本
-:对选中文本执行Ex命令
退出Insert模式:
- 按键返回到 Normal 模式 - Command: 命令模式
3. VIM的命令
3.1 撤销、恢复
| 按键 | 描述 |
|---|---|
u | 撤销 |
Ctrl-r | 恢复撤销 |
3.2 插入操作
i, I, a, A, o, O 相同点是:都会进入Insert模式,不同是:光标的位置不同。
i光标前、I行首、a光标后、A行尾、o下一行、O上一行
3.2.1 插入 Insertion
| 按键 | 操作步骤 | 描述 |
|---|---|---|
i | 操作:i 输入字符 <ESC> | 在光标所在处进入插入模式 |
I | 操作:I 输入字符 <ESC> | 在光标所在行,行首非空字符 进入插入模式 |
gI | 操作:gI 输入字符 <ESC> | 在光标所在行,行首第一个字符 进入插入模式 |
注意: 按下
将进入NORMAL模式, 或取消不想要的和部分完成的命令。
3.2.2 追加 Appending
| 命令 | 使用说明 | 详细描述 |
|---|---|---|
a | a 输入字符 | 在光标后追加字符 |
A | A 输入字符 | 在光标行尾追加字符 |
3.2.3 另开新行 Open
o 在光标下方打开一行,并进入Insert模式.O 在光标上方打开一行,并进入Insert模式.
3.3 删除操作 Delete
| 命令 | 说明 | 示例 |
|---|---|---|
d$ 或 D | 删除至行尾 | d$ |
d0 | 删除至行首 | d0 |
dG | 删除至文件末尾 | dG |
dgg | 删除至文件开头 | dgg |
dd | 删除多行,缺省值 1 | 3dd 向下删除 3 行 |
dw | 删除多个单词,缺省值 1 | 3dw 向后删除 3 单词,至下个单词开头 |
di" | 删除"引号内的内容" | 游标移动到修改所在行,键入di",会自动删除就近匹配的第一个双引号内的文本 |
x | 删除多个字符 向后,缺省值 1 | 3x 向后删除 3 字符 |
X | 删除多个字符 向前,缺省值 1 | 3X 向前删除 3 字符 |
3.4 修改操作 Change
除 x 外,其他删除的操作可以照搬到 修改操作c, 两者的区别是修改会进入Insert模式,而删除会保留在Normal模式。
| 命令 | 说明 | 示例 |
|---|---|---|
c$ 或 C | 删除至行尾,并进入Insert模式 | c$ |
c0 | 删除至行首,并进入Insert模式 | d0 |
cG | 删除至文件末尾,并进入Insert模式 | dG |
dgg | 删除至文件开头,并进入Insert模式 | cgg |
cc | 删除多行,并进入Insert模式,缺省值 1 | 3cc 向下删除 3 行 |
cw | 删除多个单词,并进入Insert模式,缺省值 1 | 3cw 向后删除 3 单词,至下个单词开头 |
ci" | 删除"引号内的内容", 并进入Insert模式 | 游标移动到修改所在行,键入ci",会自动删除就近匹配的第一个双引号内的文本 |
3.5 抽取 Yank
始终在
Normal模式
命令 说明 示例 y复制光标所在的一个字符 yyw复制从光标到下一个字开头的中间内容 ywye复制从光标到当前字结尾的中间内容 yey$复制从光标到当前行结尾的中间内容 y$y0复制从光标到当前行首的中间内容 y0yy复制光标所在一整行内容 yyygg复制至文件开头 yggyi"复制"引号内的内容" 游标移动到复制所在行,键入 yi",会复制就近匹配的第一个双引号内的文本
自定义复制:按 v进入Visual模式,再通过 hjkl 选择内容,再按 y 对内容进行复制,最后通过 p 在合适位置进行粘贴。
3.6 粘贴 Paste
puts (pastes):通过
yyye命令复制的内容、通过dddw删除的内容等,都可以通过p将其粘贴到其他位置。
在光标字符后,粘贴内容 p
3.7 搜索 Search
/<search phrase> 向下搜索 n 反向搜索 N
| 命令 | 使用说明 | 详细描述 |
|---|---|---|
/ | /目标字符串 | n: 向下搜索,下一个 N: 反向搜索,上一个 |
? | ?目标字符串 | n: 反向搜索,上一个 N: 向下搜索,下一个 |
% | 光标移动到 { [ (字符时, 然后键入%字符 | 光标会移动与之对应的 } ] ) |
3.8 替换 Substitute
命令格式是:
:[range]s/{old-string|pattern}/{string}/[flags][range]指定行范围,%表示全文件1,10表示1-10行'<,'>可视模式选中范围{old-string|pattern}表示旧字符串,也可以使用正则{string}新字符串[flags]标志,g表示全局替换c交互1,10跨行可自由组合
- 单行内替换
:s/old/new 当前行,匹配到的 第一个 old,替换为new:s/old/new/g 当前行,匹配到的 所有 old,替换为new
- 跨行替换
:1,10s/old/new/g 1-10行, 匹配到的所有old,替换为new:'<,'>s/old/new/g 在可视模式**选中的区域**, 匹配到所有old,全部替换为new(操作步骤为:v进入可视模式visual, jkhl移动光标进行区域选择, :s/old/new/g 替换)。
- 全文件替换
:%s/old/new/g **全文件**替换
- 交互替换(c confirm确认)
:s/old/new/c 替换时会弹出确认,每次替换前都会询问是否替换
- 正则表达式替换(有问题)
:s/$\d\+$/[new-\1]/g
3. VIM选项设置 Set
命令格式如下::set options[x xx]
选项options:nu number 显示行号ic ignorecase 搜索、替换时, 忽略大小写(ic ignorecase)is incsearch 显示搜索短语的部分匹配结果hls hlsearch 高亮 (highlight) 所有匹配(search)的字符串
可以通过option前增加
no来关闭相应option, 例如:set noic
4. 用例
4.1 批量注释代码
4.1.1 方式一:可视模式-行 + :s 进行替换
注释代码
- 将光标移动到需要注释的代码的起始行。
- 按下
V(大写v, 即Shift + v) 进入可视模式(行选择模式)。 - 使用方向键(
↓或j)选择需要注释的多行。 - 输入以下命令之一:
- 添加单行注释:在命令模式下输入
:s/^/#/(适用于 # 注释,如 Python、Shell 等) - 添加其他注释符号:例如,对于
//注释(如 C/C++、JavaScript),输入:s/^/\/\//
- 添加单行注释:在命令模式下输入
取消注释
- 将光标移动到需要取消注释的代码的起始行。
- 按下
V(大写v, 即Shift + v) 进入可视模式,选择多行。 - 输入以下命令:
- 删除单行注释:在命令模式下输入
:s/^#// - 删除其他注释符号:例如,对于
//注释,输入:s/^\/\///
- 删除单行注释:在命令模式下输入
4.1.2 方式二:可视模式-列 + I或 A
注释代码
即,列插入
#(I所选列前面插入A后面插入)
Ctrl+v进入列可视模式。- 使用方向键(
↓或h j k l)选择需要注释的所有行的首列。 - 选择好列后,按下
I(大写 i)进入插入模式,并在所选列的前面插入字符。 - 按下
Esc键退出插入模式,完成插入操作。
第3步,将按下 I 改成 A, 将在所选列的后面插入字符。
取消注释
列删除字符
#
Ctrl+v进入列可视模式。- 使用方向键(
↓或h j k l)选择需要取消注释行首#列。 - 选择好列后,按下
x(小写 x)或x删除选中的所有列。
4.2 修改引号、括号内的内容
ci' ci" ci( ci[ ci{
4.3 快速找到引号、括号的闭口
光标移动到 { [ (字符时, 然后键入%字符 | 光标会移动与之对应的 } ] )
4.4 列替换
Ctrl+v列视图 + r 替换所选列内容
Ctrl+v进入列可视模式。- 使用方向键(
↓或h j k l)选择需要取消注释行首#列。 - 选择好列后,按下
r(小写 r), 光标变成下划线,等待字符输入。 - 输入字符,完成替换。
4.5 跨文件内容拷贝
通过
:split <file-path>,垂直切分,打开多个文件
vim打开第一个文件A;- 键入
: split B-file, 打开第二个文件; - 从源文件
y复制字符; :wincmd j向下切换窗口(根据目标窗口跟当前窗口的相对位置, 决定输入h j k l, 也可以换成快捷键Ctrl + w + <hjkl>)- 进入目标文件后,通过方向键移动到目标位置,
p粘贴内容。