diff --git a/wiki/getting-started/Vim/Vim 入门.md b/wiki/getting-started/Vim/Vim 入门.md new file mode 100644 index 00000000..0ffec944 --- /dev/null +++ b/wiki/getting-started/Vim/Vim 入门.md @@ -0,0 +1,810 @@ +--- +title: Vim 快速入门 +description: Vim 快速入门 +keywords: +- Vim +- 入门 +tags: +- Vim +sidebar_position: 1 +author: 7Wate +date: 2022-11-16 +--- + +[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 j ▶ print("to") +┆ ┆ └┈▷ print("Quick Reference") +┆ ┆ print("/vim") +┆ ┆ +┆ ╰┈┈┈┈┈▷ +┆ - SCREEN 1 END +╰┈┈┈┈┈┈┈┈┈┈┈┈┈┈▷ print("SCREEN 2") +``` + +### 动作 + +| 快捷方式 | 说明 | +| --------------------- | ------------- | +| `h` | `j` | `k` | `l` | 方向键 | +| `` */* `` | 上/下半页 | +| `` */* `` | 向上/向下翻页 | + +#### 字(词) + +| 快捷方式 | 说明 | +| ------------ | ----------------- | +| `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` | `` | 退出插入模式 | + +### 保存和退出 + +| 快捷方式 | 说明 | +| ------------------- | ------------------- | +| `: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` | 加入下一行 | +| `` */* 5 `` | 重做更改`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` | 进入视线模式 | +| `` | 进入可视化阻挡模式 | +| `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` | 将所有缓冲区编辑为选项卡 | + +### 窗口 + +| :- | - | +| ------------------- | ---------------- | +| `` `s` | 拆分窗口 | +| `` `v` | 垂直拆分窗口 | +| `` `w` | 切换窗口 | +| `` `q` | 退出一个窗口 | +| `` `T` | 拆分成一个新标签 | +| `` `x` | 用下一个交换当前 | +| `` `-` */* `+` | 减少/增加高度 | +| `` `<` */* `>` | 减少/增加宽度 | +| `` `|` | 最大宽度 | +| `` `=` | 同样高和宽 | +| `` `h` */* `l` | 转到左/右窗口 | +| `` `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//,//d # 从 包含删除 +``` + +## 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` | *切换大小写* 所有文本 | + +### 跳跃 + +| 快捷方式 | 说明 | +| -------- | --------------------- | +| `` | 返回上一个 | +| `` | 向前 | +| `gf` | 转到光标中的文件 | +| `ga` | 显示十六进制、ASCII值 | + +### 其他命令行 + +| :- | - | +| -------------- | ------------------------------- | +| `:h` | 帮助打开帮助视图 | +| `:edit!` | 重新加载当前文件 | +| `:2,8m0` | 将行 `2`-`8` 移动到 `0` | +| `:noh` | 清除搜索亮点 | +| `:sort` | 排序行 | +| `:ter` | 打开终端窗口 | +| `:set paste` | 启用插入粘贴子模式 | +| `:set nopaste` | 禁用插入粘贴子模式 | +| `:cq` | 退出并出现错误 *(正在中止 Git)* | + +### 导航 + +| 快捷方式 | 说明 | +| ------------- | ------------------- | +| `%` | 最近/匹配的`{[()]}` | +| `[(` *|* `[{` | 上一个 `(` 或 `{` | +| `])` *|* `]{` | 下一个`)`或`}` | +| `[m` | 上一个方法开始 | +| `[M` | 上一个方法结束 | + +### 计数器 + +| 快捷方式 | 说明 | +| -------- | -------- | +| `` | 增加数量 | +| `` | 减少数量 | + +### 选项卡 + +| 快捷方式 | 说明 | +| -------------------- | --------------------------------- | +| `:tag Classname` | 跳转到 Classname 的第一个定义 | +| `` | 跳转到定义 | +| `g]` | 查看所有定义 | +| `` | 回到最后一个标签 | +| ` ` | 后退前进 | +| `: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` | + +### 计算器 + +| 快捷方式 | 说明 | +| ---------------- | -------- | +| `` `=` 7*7 | 显示结果 | +| `` `=` 10/2 | 显示结果 | + +在 INSERT 模式下执行此操作 + +### Shell + +| :- | - | +| ------------ | ---------------- | +| `:!` | 解释 Shell 命令 | +| `:r!` | 读入shell的输出 | +| `:r!date` | 插入日期 | +| `:!!date` | 用日期替换当前行 | + +### 命令行 + +| 快捷方式 | 说明 | +| ------------ | ------------------------ | +| `` | 将当前单词插入命令行 | +| `"` | 从 `注册` 粘贴 | +| `` | 在插入模式下自动完成路径 | + +### 技巧 + +删除重复行 + +```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);仅学术引用,著作权归作者所有。 diff --git a/wiki/getting-started/Vim/Vim 参考手册.md b/wiki/getting-started/Vim/Vim 参考手册.md new file mode 100644 index 00000000..43a23b45 --- /dev/null +++ b/wiki/getting-started/Vim/Vim 参考手册.md @@ -0,0 +1,352 @@ +--- +title: Vim 参考手册 +description: Vim 参考手册 +keywords: +- Vim +- 参考手册 +tags: +- Vim +sidebar_position: 3 +author: 7Wate +date: 2022-11-16 +--- + +## [Vim Cheat Sheet](https://vim.rtorr.com/) + +## 全局 + +```vim +:h[elp] 关键字 - 打开关键字帮助 +:sav[eas] 文件名 - 另存为 +:clo[se] - 关闭当前窗口 +:ter[minal] - 打开一个shell窗口 +K - 打开光标所在单词的man页面 +``` + +***Tip** 在终端中运行 vimtutor 以学习最基础的 Vim 命令。* + +## 移动光标 + +```vim +h - 左移光标 +j - 下移光标 +k - 上移光标 +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 - 移动屏幕使光标居中 +Ctrl + e - 向下移动屏幕一行(保持光标不动) +Ctrl + y - 向上移动屏幕一行(保持光标不动) +Ctrl + b - 向上滚动一屏 +Ctrl + f - 向下滚动一屏 +Ctrl + d - 向下滚动半屏 +Ctrl + u - 向上滚动半屏 +``` + +## 插入模式 - 插入/追加文本 + +```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 - 退出插入模式 +``` + +## 编辑文本 + +```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 +v - 进入可视化模式, 移动光标高亮选择, 然后可以对选择的文本执行命令(比 y - 复制) +V - 进入可视化模式(行粒度选择) +o - 切换光标到选择区开头/结尾 +Ctrl + v - 进入可视化模式(矩阵选择) +O - 切换光标到选择区的角 +aw - 选择当前单词 +ab - 选择被 () 包裹的区域(含括号) +aB - 选择被 {} 包裹的区域(含花括号) +at - 选择被 <> 标签包裹的区域(含<>标签) +ib - 选择被 () 包裹的区域(不含括号) +iB - 选择被 {} 包裹的区域(不含花括号) +it - 选择被 <> 标签包裹的区域(不含<>标签) +Esc - 退出可视化模式 +``` + +***Tip** 也可以使用 ( 和 { 分别代替 b 和 B* + +## 可视化模式命令 + +```vim +> - 向右缩进 +< - 向左缩进 +y - 复制 +d - 剪切 +~ - 大小写切换 +u - 将选中文本转换为小写 +U - 将选中文本转换为大写 +``` + +## 寄存器 + +寄存器被存储在 ~/.viminfo 中, 在下次重启vim时仍会加载 + +```vim +:reg[isters] - 显示寄存器内容 +"xy - 复制内容到寄存器 x +"xp - 粘贴寄存器 x 中的内容 +"+y - 复制内容到系统剪贴板寄存器 +"+p - 粘贴系统剪贴板寄存器的内容 +``` + +特殊寄存器: + +```vim +0 - 上次复制 +" - 未命名寄存器,上次复制或删除 +% - 当前文件名 +# - 轮换文件名 +* - 剪贴板内容 (X11 primary) ++ - 剪贴板内容 (X11 clipboard) +/ - 上次搜索的pattern +: - 上次执行的命令 +. - 上次插入的文本 +- - 上次剪切的短于一行的文本 += - 表达式寄存器 +_ - 黑洞寄存器 +``` + +## 标记 + +```vim +:marks - 标记列表 +ma - 设置当前位置为标记 a +`a - 跳转到标记 a 的位置 +y`a - 复制当前位置到标记 a 的内容 +`0 - 跳转到上次 Vim 退出时的位置 +`" - 跳转到上次编辑该文件时的位置 +`. - 跳转到上次修改的位置 +`` - 跳转回上次跳转前的位置 +:ju[mps] - 列出跳转历史记录 +Ctrl + i - 跳转至跳转历史中较晚的位置 +Ctrl + o - 跳转回跳转历史中较早的位置 +:changes - 列出修改历史记录 +g, - 跳转至修改历史中较晚修改的位置 +g; - 跳转至修改历史中较早修改的位置 +Ctrl + ] - 跳转到当前光标位置对应的 tag +``` + +**Tip** 可以使用反引号(`)或单引号(')跳转至标记位置。使用单引号会跳转至该标记所在行行首(首个非空白字符)。 + +## 宏 + +```vim +qa - 录制宏 a +q - 停止录制宏 +@a - 执行宏 a +@@ - 重新执行上次执行的宏 +``` + +## 剪切, 复制, 粘贴 + +```vim +yy - 复制当前行 +2yy - 复制 2 行 +yw - 复制当前单词 +yiw - 复制光标处的单词 +yaw - 复制光标处的单词及其前后的空格 +y$ or Y - 复制, 从光标位置到行末 +p - 在光标后粘贴 +P - 在光标前粘贴 +gp - 在光标后粘贴并把光标定位于粘贴的文本之后 +gP - 在光标前粘贴并把光标定位于粘贴的文本之后 +dd - 剪切当前行 +2dd - 剪切 2 行 +dw - 剪切当前单词 +diw - 删除光标处的单词 +daw - 删除光标处的单词及其前后的空格 +d$ or D - 剪切, 从光标位置到行末 (同 D ) +x - 剪切当前字符 +``` + +## 文字缩进 + +```vim +>> - 将当前行向右缩进,宽度由 shiftwidth 控制 +<< - 将当前行向左缩进,宽度由 shiftwidth 控制 +>% - 向右缩进 () 或 {} 内的区域 (光标需置于括号上) +>ib - 向右缩进 () 内的区域 +>at - 向右缩进 <> 标签内的区域 +3== - 自动缩进 3 行 +=% - 自动缩进 () 或 {} 内的区域 (光标需置于括号上) +=iB - 自动缩进 {} 内的区域 (光标需置于括号上) +gg=G - 自动缩进整个缓冲区 +]p - 粘贴并调整缩进至当前行 +``` + +## 退出 + +```vim +:w - 保存 +:w !sudo tee % - 使用 sudo 保存当前文件 +:wq or :x or ZZ - 保存并退出 +:q - 退出(修改未保存时警告) +:q! or ZQ - 不保存强制退出 +:wqa - 保存所有标签页并全部退出 +``` + +## 查找/替换 + +```vim +/pattern - 查找 pattern +?pattern - 向上查找 pattern +\vpattern - pattern 中的非字母数字字符被视为正则表达式特殊字符 (不需转义字符) +n - 查找下一个 +N - 查找上一个 +:%s/old/new/g - 替换全部 +:%s/old/new/gc - (逐个)替换 +:noh[lsearch] - 移除搜索结果的高亮显示 +``` + +## 多文件搜索 + +```vim +:vim[grep] /pattern/ {`{file}`} - 在多个文件中搜索 pattern +e.g. :vim[grep] /foo/ **/* +:cn[ext] - 移动至下一个 +:cp[revious] - 移动至上一个 +:cope[n] - 打开搜索结果列表 +:ccl[ose] - 关闭 quickfix 窗口 +``` + +## 标签 + +```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 - 使游标所在视窗全宽并移至最上 (最上水平视窗) +``` + +## Diff + +```vim +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 模式 +``` + +折叠命令(e.g. za)只作用于当前级别。使用大写字母(e.g. zA)令命令作用于全部级别。 + +可以直接在终端运行 vimdiff 查看文件间的不同。也可以将该程序设为 git difftool 的选项之一。 diff --git a/wiki/getting-started/Vim/Vim 帮助文档.md b/wiki/getting-started/Vim/Vim 帮助文档.md new file mode 100644 index 00000000..485617aa --- /dev/null +++ b/wiki/getting-started/Vim/Vim 帮助文档.md @@ -0,0 +1,34 @@ +--- +title: Vim 帮助文档 +description: Vim 帮助文档 +keywords: +- Vim +- 文档 +tags: +- Vim +sidebar_position: 2 +author: 7Wate +date: 2022-11-16 +--- + +[Vim 中文文档计划](https://github.com/yianwillis/vimcdoc) + +## 关于 + +[Vim](https://www.vim.org/) 是一个功能非常强大,且具有很强扩展性的编辑器。而且 Vim 本身带有一个完备的帮助系统。本项目的目的就是将 Vim 的这些文档翻译成中文,以 便更多的人认识及更好地使用这个非常强大的编辑器。文档分成用户手册和参考手册两部 分,你既可以象使用教程那样循序渐进,也可以快速地查阅来获取帮助。 + +## 在线阅读 + +可在线阅读帮助文档的 HTML 版。 + +https://yianwillis.github.io/vimcdoc/ + +为了最佳阅读效果,请确保你的系统安装了 'Noto Sans Mono CJK SC' 或 NSimsun 字 体,否则可能有字体不能完全对齐的情况。 + +## 下 载 + +https://github.com/yianwillis/vimcdoc/releases 提供发布版本的下载。 + +- PDF 用户手册和参考手册 +- tar.gz 包 +- Win32 UTF8 版本的中文自动安装程序 (原有的 ANSI 版本不再提供) diff --git a/wiki/getting-started/Windows 开发/_category_.json b/wiki/getting-started/Windows 开发/_category_.json index e7f77f24..4b51f50f 100644 --- a/wiki/getting-started/Windows 开发/_category_.json +++ b/wiki/getting-started/Windows 开发/_category_.json @@ -1,8 +1,8 @@ { - "label": "开发者工具", + "label": "Windows 开发", "position": 2, "link": { "type": "generated-index", - "title": "开发者工具" + "title": "Windows 开发" } } \ No newline at end of file