1
0
wiki/FormalSciences/ComputerScience/GettingStarted/3.CommandLineTools/Vim/1.Vim 入门.md
2024-10-14 16:48:38 +08:00

816 lines
27 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Vim 快速入门
description: Vim 是一个功能强大的文本编辑器,此文档提供了快速入门指南,包括基础操作、模式切换、文本编辑技巧等。
keywords:
- Vim
- 入门
- 编辑器
- 基础操作
- 模式
- 文本编辑
tags:
- FormalSciences/ComputerScience
- GettingStarted/CommandLineTools
- Vim
author: 7Wate
date: 2024-08-08
---
[Vim](http://www.vim.org/) 8.2 快速参考备忘单的有用集合,可帮助您更快地学习 vim 编辑器。
## 入门
### 运动图
```vim
/▶ 光标 ▽/目标
```
#### 左右动作
```vim
╭┈┈┈┈┈┈┈┈┈┈┈┈┈ |
├┈┈┈┈┈┈┈┈┈┈┈┈┈ 0 $ ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈╮
┆ ╭┈┈┈┈┈┈┈┈┈┈ ^ fe ┈┈┈┈┈┈┈┈╮ ┆
┆ ┆ ╭┈┈┈┈┈┈┈ Fo te ┈┈┈┈┈┈┈╮┆ ┆
┆ ┆ ┆╭┈┈┈┈┈┈ To 30| ┈┈┈╮ ┆┆ ┆
┆ ┆ ┆┆ ╭┈┈┈┈ ge w ┈┈┈╮ ┆ ┆┆ ┆
┆ ┆ ┆┆ ┆ ╭┈┈ b e ┈╮ ┆ ┆ ┆┆ ┆
┆ ┆ ┆┆ ┆ ┆ ╭h l╮ ┆ ┆ ┆ ┆┆ ┆
▽ ▽ ▽▽ ▽ ▽ ▽▼ ▼▽ ▽ ▽ ▽ ▽▽ ▽
echo "A cheatsheet from quickReference"
```
#### 上下动作
```vim
- SCREEN 1 START
╭┈┬┈┈┈┈┈┈┈┈┈▷ #!/usr/bin/python
┆ ┆ ╭┈┈┈▷
┆ ┆ ┆ print("Hello")
┆ ┆ { } ▶ print("Vim")
┆ ┆ ┆ print("!")
┆ ┆ └┈▷
┆ ┆ ╭┈┈┈┬┈┈┈▷ print("Welcome")
G gg H M L k jprint("to")
┆ ┆ └┈▷ print("Quick Reference")
┆ ┆ print("/vim")
┆ ┆
┆ ╰┈┈┈┈┈▷
- SCREEN 1 END
╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈▷ print("SCREEN 2")
```
### 动作
| 快捷方式 | 说明 |
| --------------------- | ------------- |
| `h` | `j` | `k` | `l` | 方向键 |
| `<C-u>` */* `<C-d>` | 上/下半页 |
| `<C-b>` */* `<C-f>` | 向上/向下翻页 |
#### 字 (词)
| 快捷方式 | 说明 |
| ------------ | ----------------- |
| `b` */* `w` | 上一个/下一个单词 |
| `ge` */* `e` | 上一个/下一个词尾 |
#### 行
| 快捷方式 | 说明 |
| -------------------- | ----------------- |
| `0` *(zero)* */* `$` | 行的开始/结束 |
| `^` | 行开头 *(非空白)* |
#### 字符串
| 快捷方式 | 说明 |
| ------------- | ------------------------------- |
| `Fe` */* `fe` | 移动到上一个/下一个 `e` |
| `To` */* `to` | 在上一个/下一个 `o` 之前/之后移动 |
| `|` */* `n|` | 转到第一个/`n` 列 |
#### 文档
| 快捷方式 | 说明 |
| ------------ | ----------------- |
| `gg` */* `G` | 第一行/最后一行 |
| `:n` | `nG` | 转到第 `n` 行 |
| `}` */* `{` | 下一个/上一个空行 |
#### 窗口
| 快捷方式 | 说明 |
| ---------------------- | -------------- |
| `H` */* `M` */* `L` | 上/中/下屏幕 |
| `zt` */* `zz` */* `zb` | 上/中/下这条线 |
### 插入模式
| 快捷方式 | 说明 |
| ---------------------- | -------------------- |
| `i` */* `a` | 在光标之前/之后插入 |
| `I` */* `A` | 插入行的开始/结束 |
| `o` */* `O` *(letter)* | 在下方/上方插入新行 |
| `s` */* `S` | 删除字符/行并插入 |
| `C` */* `cc` | 更改到/当前行的结尾 |
| `gi` | 在最后一个插入点插入 |
| `Esc` | `<C-[>` | 退出插入模式 |
### 保存和退出
| 快捷方式 | 说明 |
| ------------------- | ------------------- |
| `:w` | 保存 |
| `:q` | 关闭文件 |
| `:wq` | `:x` | `ZZ` | 保存并退出 |
| `:wqa` | 保存并退出所有文件 |
| `:q!` | `ZQ` | 强制退出 |
| `:qa` | 关闭所有文件 |
| `:qa!` | 强制退出所有文件 |
| `:w` new.txt | 写入 `new.txt` |
| `:sav` new.txt | 保存并编辑 `new.txt` |
| `:w` !sudo tee % | 写入只读文件 |
### 正常模式
| 快捷方式 | 说明 |
| --------------------- | ----------------- |
| `r` | 替换一个字符 |
| `R` | 进入替换模式 |
| `u` */* `3u` | 撤消更改 `1`/`3` 次 |
| `U` | 在一行上撤消更改 |
| `J` | 加入下一行 |
| `<C-r>` */* 5 `<C-r>` | 重做更改 `1`/`5` 次 |
### 剪切和粘贴
| 快捷方式 | 说明 |
| ------------- | ------------------- |
| `x` | 删除字符 *(剪切)* |
| `p` */* `P` | 在之后/之前粘贴 |
| `xp` | 交换两个字符 |
| `D` | 删除到行尾 *(剪切)* |
| `dw` | 删除单词 *(剪切)* |
| `dd` | 删除线 *(剪切)* |
| `ddp` | 交换两条线 |
| `yy` | 拉线 *(复制)* |
| `"*p` | `"+p` | 从系统剪贴板粘贴 |
| `"*y` | `"+y` | 粘贴到系统剪贴板 |
#### 在可视化模式下
| 快捷方式 | 说明 |
| ----------- | ------------------ |
| `d` *|* `x` | 删除选择 *(剪切)* |
| `s` | 替换选择 |
| `y` | Yank 选择 *(复制)* |
### 重复
| 快捷方式 | 说明 |
| -------- | -------------------------------- |
| `.` | 重复上一个命令 |
| `;` | 重复最新的 `f`、`t`、`F` 或 `T` |
| `,` | 重复最新的 `f`、`t`、`F` 或 `T` 颠倒 |
| `&` | 重复最后一个 `:s` |
| `@:` | 重复命令行命令 |
### 可视化模式
| 快捷方式 | 说明 |
| ----------- | ------------------ |
| `v` | 进入可视化模式 |
| `V` | 进入视线模式 |
| `<C-v>` | 进入可视化阻挡模式 |
| `ggVG` | 选择所有文本 |
| `>` */* `<` | 向右/向左移动文本 |
### 宏
| :- | - |
| ----- | --------------- |
| `qi` | 录制宏 `i` |
| `q` | 停止录制宏 |
| `@i` | 运行宏 `i` |
| `7@i` | 运行宏 `i` 7 次 |
| `@@` | 重复上一个宏 |
您可以为任何字母保存宏,而不仅仅是 `i`
## Vim 运算符
### 用法
| 快捷方式 | 说明 |
| -------- | ---- |
| `d` | w |
| 运算符 | 动作 |
将 [可用运算符](https://github.com/jaywcjlove/reference/blob/main/docs/vim.md#可用运算符) 与 [动作](https://github.com/jaywcjlove/reference/blob/main/docs/vim.md#动作) 结合使用以使用它们
### 可用运算符
| 快捷方式 | 说明 |
| -------- | --------------------- |
| `d` | 删除 |
| `y` | Yank *(复制)* |
| `c` | 更改 *(删除然后插入)* |
| `p` | 粘贴 |
| `=` | 格式代码 |
| `g~` | 切换案例 |
| `gU` | 大写 |
| `gu` | 小写 |
| `>` | 右缩进 |
| `<` | 左缩进 |
| `!` | 通过外部程序过滤 |
### 例子
| 组合 | 说明 |
| --------- | ----------------------- |
| `d`d | 删除当前行 |
| `d`j | 删除两行 |
| `d`w | 删除到下一个单词 |
| `d`b | 删除到单词的开头 |
| `d`fa | 删除直到 `a` 字符 |
| `d`/hello | 删除直到 `hello` |
| `c`c | 更改当前行,与 `S` 同义 |
| `y`y | 复制当前行 |
| `>`j | 缩进 2 行 |
| gg`d`G | 删除完整的文档 |
| gg`=`G | 缩进一个完整的文档 |
| gg`y`G | 复制整个文档 |
### 计数
```vim
[数字] <运算符> <动作>
<运算符> [数字] <动作>
```
------
| 组合 | 说明 |
| ----- | --------------- |
| 2`d`d | 删除 `2` 行 |
| 6`y`y | 复制 `6` 行 |
| `d`3w | 删除 `3` 字 |
| `d`5j | 向下删除 `5` 行 |
| `>`4k | 向上缩进 `4` 行 |
## Vim 文本对象
### 用法
| 快捷方式 | 说明 |
| -------- | ---------------------------- |
| `v` | i */* a |
| Operator | inner(内部) */* around(周围) |
文本块内部或周围使用 [operator](https://github.com/jaywcjlove/reference/blob/main/docs/vim.md#可用运算符) 进行操作
### 文本对象
| 快捷方式 | 说明 |
| -------- | ------------------- |
| p | 段落 |
| w | 单词 |
| W | WORD *(被空格包围)* |
| s | 句子 |
| [ ( { < | []、() 或 {} 块 |
| ] ) } > | []、() 或 {} 块 |
| ' " ` | 带引号的字符串 |
| b | 一个块 [( |
| B | [{中的一个块 |
| t | 一个 HTML 标签块 |
查看 `:help text-objects`
### 删除
| 快捷方式 | 说明 |
| -------- | --------------------- |
| `d`iw | 删除内词 |
| `d`is | 删除内句 |
| `d`i" | 引号中删除 |
| `d`a" | 删除引号 *(包括引号)* |
| `d`ip | 删除段落 |
### 选择
| 快捷方式 | 说明 |
| -------- | ------------------------------ |
| `v`i" | 选择内引号“`...`{.underline}” |
| `v`a" | 选择引号 `"..."`{.underline} |
| `v`i[ | 选择内括号 [`...`{.underline}] |
| `v`a[ | 选择括号 `[...]`{.underline} |
| `v`iw | 选择内词 |
| `v`ip | 选择内部段落 |
| `v`ipip | 选择更多段落 |
### 杂项
| 快捷方式 | 说明 |
| -------- | ------------------------ |
| `c`iw | 换内字 |
| `c`i" | 更改内部引号 |
| `c`it | 更改内部标签 (HTML) |
| `c`ip | 更改内部段落 |
| `y`ip | Yank 段落 |
| `y`ap | Yank 段落 *(包括换行符)* |
## Vim 多个文件
### Buffers (缓冲器)
| :- | - |
| ---------- | ------------------------ |
| `:e file` | 在新缓冲区中编辑文件 |
| `:bn` | 转到下一个缓冲区 |
| `:bp` | 转到上一个缓冲区 |
| `:bd` | 从缓冲区列表中删除文件 |
| `:b 5` | 打开缓冲区 #5 |
| `:b file` | 按文件转到缓冲区 |
| `:ls` | 列出所有打开的缓冲区 |
| `:sp file` | 打开和拆分窗口 |
| `:vs file` | 打开和垂直拆分窗口 |
| `:hid` | 隐藏此缓冲区 |
| `:wn` | 写入文件并移至下一个 |
| `:tab ba` | 将所有缓冲区编辑为选项卡 |
### 窗口
| :- | - |
| ------------------- | ---------------- |
| `<C-w>` `s` | 拆分窗口 |
| `<C-w>` `v` | 垂直拆分窗口 |
| `<C-w>` `w` | 切换窗口 |
| `<C-w>` `q` | 退出一个窗口 |
| `<C-w>` `T` | 拆分成一个新标签 |
| `<C-w>` `x` | 用下一个交换当前 |
| `<C-w>` `-` */* `+` | 减少/增加高度 |
| `<C-w>` `<` */* `>` | 减少/增加宽度 |
| `<C-w>` `|` | 最大宽度 |
| `<C-w>` `=` | 同样高和宽 |
| `<C-w>` `h` */* `l` | 转到左/右窗口 |
| `<C-w>` `j` */* `k` | 转到上/下窗口 |
### 选项卡
| 快捷方式 | 说明 |
| -------------- | -------------------------- |
| `:tabe [file]` | E 在新选项卡中编辑文件 |
| `:tabf [file]` | 如果在新选项卡中存在则打开 |
| `:tabc` | C 失去当前选项卡 |
| `:tabo` | 关闭 o 其他选项卡 |
| `:tabs` | 列出所有标签 |
| `:tabr` | 转到第一个 r 标签 |
| `:tabl` | 转到 last 选项卡 |
| `:tabm 0` | 我转到位置 `0` |
| `:tabn` | 转到 next 选项卡 |
| `:tabp` | 转到 p 上一个标签 |
#### 正常模式
| 快捷方式 | 说明 |
| -------- | ---------------- |
| `gt` | 转到 next 选项卡 |
| `gT` | 转到 p 上一个标签 |
| `2gt` | 转到标签编号 `2` |
## Vim 搜索和替换
### 搜索
| :- | - |
| -------- | ------------------------------------------------------------ |
| `/foo` | 向前搜索 |
| `/foo\c` | 向前搜索 *(不区分大小写)* |
| `?foo` | 向后搜索 |
| `/\v\d+` | 使用 [regex](https://github.com/jaywcjlove/reference/blob/main/docs/regex.md) 搜索 |
| `n` | 下一个匹配的搜索模式 |
| `N` | 上一个匹配的搜索 |
| `*` | 向前搜索当前单词 |
| `#` | 向后搜索当前单词 |
### 更换行
```vim
:[range]s/{pattern}/{str}/[flags]
```
------
| :- | - |
| ----------------- | ------------------------------------------------------------ |
| `:s/old/new` | 先更换 |
| `:s/old/new/g` | 全部替换 |
| `:s/\vold/new/g` | 全部替换为 [regex](https://github.com/jaywcjlove/reference/blob/main/docs/regex.md) |
| `:s/old/new/gc` | 全部替换 *(确认)* |
| `:s/old/new/i` | 先忽略大小写替换 |
| `:2,6s/old/new/g` | 在 `2`-`6` 行之间替换 |
### 替换文件
```vim
:%s/{pattern}/{str}/[flags]
```
------
| :- | - |
| ----------------- | ------------------------------------------------------------ |
| `:%s/old/new` | 先更换 |
| `:%s/old/new/g` | 全部替换 |
| `:%s/old/new/gc` | 全部替换 *(确认)* |
| `:%s/old/new/gi` | 全部替换 *(忽略大小写)* |
| `:%s/\vold/new/g` | 全部替换为 [regex](https://github.com/jaywcjlove/reference/blob/main/docs/regex.md) |
### 范围
| :- | - |
| ------- | --------------------- |
| `%` | 整个文件 |
| `<,>` | 当前选择 |
| `5` | 第 `5` 行 |
| `5,10` | 第 `5` 行到第 `10` 行 |
| `$` | 最后一行 |
| `2,$` | 第 `2` 行到最后 |
| `.` | 当前行 |
| `,3` | 接下来的 `3` 行 |
| `-3,` | 转发 `3` 行 |
### 全局命令
```vim
:[range]g/{pattern}/[command]
```
------
| :- | - |
| ------------ | --------------------------- |
| `: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.` | 复制每一行 |
### Inverse(逆) :g
```vim
:[range]v/{pattern}/[command]
```
------
| :- | - |
| ---------- | --------------------------------------- |
| `:v/foo/d` | 删除不包含 `foo` 的行 *(还有 `:g!/foo/d`)* |
### Flags(标志)
| :- | - |
| ---- | -------------- |
| `g` | 替换所有出现 |
| `i` | 忽略大小写 |
| `I` | 不要忽略大小写 |
| `c` | 确认每个替换 |
### 替换表达式(魔术)
| :- | - |
| ------------ | ------------------------------- |
| `&` *|* `\0` | 替换为整个匹配的 |
| `\1`...`\9` | 替换为 0-9 组 |
| `\u` | 大写下一个字母 |
| `\U` | 后面的大写字符 |
| `\l` | 小写下一个字母 |
| `\L` | 后面的字符小写 |
| `\e` | `\u`、`\U`、`\l` 和 `\L` 的结尾 |
| `\E` | `\u`、`\U`、`\l` 和 `\L` 的结尾 |
### 例子
```vim
: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> 包含删除
```
## Vimdiff
### 用法
```vim
vimdiff file1 file2 [file3]
vim -d file1 file2 [file3]
```
### 编辑
```vim
:[range]diffget [bufspec]
:[range]diffput [bufspec]
```
------
| 快捷方式 | 说明 |
| ------------------- | --------------- |
| `do` */* `:diffget` | 获取get差异 |
| `dp` */* `:diffput` | 放差价 |
| `:dif` | 重新扫描差异 |
| `:diffo` | 关闭差异模式 |
| `:1,$+1diffget` | 获取所有差异 |
| `ZQ` | 不做改动就退出 |
请参阅:[范围](https://github.com/jaywcjlove/reference/blob/main/docs/vim.md#范围)
### 折叠
| 快捷方式 | 说明 |
| ------------- | -------------------------- |
| `zo` */* `zO` | 打开 |
| `zc` */* `zC` | 关 |
| `za` */* `zA` | 切换 |
| `zv` | 这条线的打开折叠 |
| `zM` | 关闭所有 |
| `zR` | 打开所有 |
| `zm` | 折叠更多 *(折叠级别 += 1)* |
| `zr` | 少折叠 *(折叠级别 -= 1)* |
| `zx` | 更新折叠 |
### 跳跃
| 快捷方式 | 说明 |
| -------- | ---------- |
| `]c` | 下一个区别 |
| `[c` | 以前的区别 |
## 各种各样的
### Case
| 快捷方式 | 说明 |
| -------------- | --------------------- |
| `vU` | *大写* 字母 |
| `vu` | *小写* 字符 |
| `~` | *切换案例* 字符 |
| `viw` `U` | *大写* 字 |
| `viw` `u` | *小写* 字 |
| `viw` `~` | *切换案例* 字 |
| `VU` */* `gUU` | *大写* 行 |
| `Vu` */* `guu` | *小写* 行 |
| `V~` */* `g~~` | *切换案例* 线 |
| `gggUG` | *大写* 所有文本 |
| `ggguG` | *小写* 所有文本 |
| `ggg~G` | *切换大小写* 所有文本 |
### 跳跃
| 快捷方式 | 说明 |
| -------- | --------------------- |
| `<C-o>` | 返回上一个 |
| `<C-i>` | 向前 |
| `gf` | 转到光标中的文件 |
| `ga` | 显示十六进制、ASCII 值 |
### 其他命令行
| :- | - |
| -------------- | ------------------------------- |
| `:h` | 帮助打开帮助视图 |
| `:edit!` | 重新加载当前文件 |
| `:2,8m0` | 将行 `2`-`8` 移动到 `0` |
| `:noh` | 清除搜索亮点 |
| `:sort` | 排序行 |
| `:ter` | 打开终端窗口 |
| `:set paste` | 启用插入粘贴子模式 |
| `:set nopaste` | 禁用插入粘贴子模式 |
| `:cq` | 退出并出现错误 *(正在中止 Git)* |
### 导航
| 快捷方式 | 说明 |
| ------------- | ------------------- |
| `%` | 最近/匹配的 `{[()]}` |
| `[(` *|* `[{` | 上一个 `(``{` |
| `])` *|* `]{` | 下一个 `)``}` |
| `[m` | 上一个方法开始 |
| `[M` | 上一个方法结束 |
### 计数器
| 快捷方式 | 说明 |
| -------- | -------- |
| `<C-a>` | 增加数量 |
| `<C-x>` | 减少数量 |
### 选项卡
| 快捷方式 | 说明 |
| -------------------- | --------------------------------- |
| `:tag Classname` | 跳转到 Classname 的第一个定义 |
| `<C-]>` | 跳转到定义 |
| `g]` | 查看所有定义 |
| `<C-t>` | 回到最后一个标签 |
| `<C-o> <C-i>` | 后退前进 |
| `:tselect Classname` | 查找类名的定义 |
| `:tjump Classname` | 查找类名的定义 *(自动选择第一个)* |
### 格式化
| :- | - |
| ------- | ------------------ |
| `:ce 8` | `8` 列之间的中心线 |
| `:ri 4` | 在 `4` 列右对齐行 |
| `:le` | 左对齐线 |
查看 `:help formatting`
### 标记
| 快捷方式 | 说明 |
| ----------- | ------------------------------- |
| ``^` | 插入模式下光标的最后位置 |
| ``.` | 当前缓冲区的最后更改 |
| ``"` | 最后退出的当前缓冲区 |
| ``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` |
### 计算器
| 快捷方式 | 说明 |
| ---------------- | -------- |
| `<C-r>` `=` 7*7 | 显示结果 |
| `<C-r>` `=` 10/2 | 显示结果 |
在 INSERT 模式下执行此操作
### Shell
| :- | - |
| ------------ | ---------------- |
| `:!<shell>` | 解释 Shell 命令 |
| `:r!<shell>` | 读入 shell 的输出 |
| `:r!date` | 插入日期 |
| `:!!date` | 用日期替换当前行 |
### 命令行
| 快捷方式 | 说明 |
| ------------ | ------------------------ |
| `<C-r><C-w>` | 将当前单词插入命令行 |
| `<C-r>"` | 从 `注册` 粘贴 |
| `<C-x><C-f>` | 在插入模式下自动完成路径 |
### 技巧
删除重复行
```vim
:sort | %!uniq -u
```
对文件中的行进行编号
```vim
:%!cat -n
```
将整个文档复制到剪贴板
```vim
:%w !pbcopy # Mac OS X
:%w !xclip -i -sel c # GNU/Linux
:%w !xsel -i -b # GNU/Linux
```
## 理解 Vim
### 动词理解
```vim
d # 表示删除delete
r # 表示替换replace
c # 表示修改change
y # 表示复制yank
v # 表示选取visual select
```
动词代表了我们打算对文本进行什么样的操作
### 名词理解
```vim
w # 表示一个单词word
s # 表示一个句子sentence
p # 表示一个段落paragraph
t # 表示一个 HTML 标签tag
```
名词代表了我们即将处理的文本。引号或者各种括号所包含的文本称作一个文本块。
### 介词理解
```vim
i # 表示在...之内 inside
a # 表示环绕... around
t # 表示到...位置前 to
f # 表示到...位置上 forward
```
介词界定了待编辑文本的范围或者位置。
### 数词理解
数词指定了待编辑文本对象的数量,从这个角度而言,数词也可以看作是一种介词。引入数词之后,文本编辑命令的语法就升级成了下面这样:
```vim
动词 介词/数词 名词
```
下面是几个例子:
```vim
c3w # 修改三个单词change three words
d2w # 删除两个单词delete two words
```
另外,数词也可以修饰动词,表示将操作执行 `n` 次。于是,我们又有了下面的语法:
```vim
数词 动词 名词
```
示例
```vim
2dw # 两次删除单词(等价于删除两个单词): twice delete word
3x # 三次删除字符(等价于删除三个字符): three times delete character
```
### 组词为句理解
有了这些基本的语言元素,我们就可以着手构造一些简单的命令了。文本编辑命令的基本语法如下:
```vim
动词 介词 名词
```
下面是一些例子
```vim
dip # 删除一个段落: delete inside paragraph
vis # 选取一个句子: visual select inside sentence
ciw # 修改一个单词: change inside word
caw # 修改一个单词: change around word
dtx # 删除文本直到字符x(不包括字符x): delete to x
dfx # 删除文本直到字符x(包括字符x): delete forward x
```
## 另见
- [搞得像IDE一样的 Vim](https://jaywcjlove.github.io/vim-web) *(github.io)*
- [Vim 官方网站](http://www.vim.org/) *(vim.org)*
- [Devhints](https://devhints.io/vim) *(devhints.io)*
- [Vim cheatsheet](https://vim.rtorr.com/lang/zh_cn/) *(vim.rotrr.com)*
- [Vim documentation](http://vimdoc.sourceforge.net/htmldoc/) *(vimdoc.sourceforge.net)*
- [Interactive Vim tutorial](http://openvim.com/) *(openvim.com)*
> 来源:[Vim 备忘清单 & vim cheatsheet & Quick Reference](https://wangchujiang.com/reference/docs/vim.html);仅学术引用,著作权归作者所有。