Vim 笔记 ongoing
文档用途
此文档用于持续记录 vim 的各种用法.
参考资料
在当前窗口移动光标
| 快捷键 | 作用 | 备注 |
|---|---|---|
H | 将光标移动至窗口 顶部 | Home |
M | 将光标移动至窗口 中间 | Middle |
L | 将光标移动至窗口 底部 | Last Line |
根据光标位置改变显示区域
| 快捷键 | 作用 |
|---|---|
z z | 居中 |
z t | 使得光标位于顶部 |
z b | 使得光标位于底部 |
跳转到上次编辑的位置
| 快捷键 | 作用 |
|---|---|
g; | 跳转至上次编辑的地方 |
2g; | 跳转至上上次编辑的地方 |
gi | 跳转至上次进入 INSERT 模式的地方并开始编辑 |
TIP
g; 与 gi 有微妙的区别:g; 会跳转到上次发生改动的地方. (如果只是进入了 INSERT 模式但未改动, 则不算数).gi 会跳转到上次进入 INSERT 模式的地方, 不论上次是否真的做了改动.
光标与底边的最小距离
set scrolloff=3 " 光标距离底边最小始终有 3 行
set so=3 " 光标距离底边最小始终有 3 行, 简写将 tab 符号替换为空格
retab 命令会将 tab 符号替换为空格.
根据 tabstop 所设置的数值来决定 "一个 tab 符号被替换为几个空格".
实际使用中的技巧:
通过 ctrl+v 选中需要替换的行, 然后 :'<,'>retab.
将整个文档中的 tab 都替换为空格 :%retab.
根据周围的缩进来粘贴
在默认情况下, NORMAL 模式中使用 p 会按原样粘贴.
但有些时候我们复制了几行文本后, 希望粘贴时能和附近的文本保持相同的缩进.
此时可以使用快捷键 ] p 或 [ p (这两个快捷键有微小的区别).
VISUAL 模式常用快捷键
| 快捷键 | 作用 |
|---|---|
d / x | 删除高亮选中的文字 |
c / s | 改写文字,即删除高亮选中的文字并进入插入模式 |
o | 跳转到标记区的另外一端 |
~ | 转换大小写 |
u | 标记区转换为小写 |
U | 标记区转换为大写 |
INSERT 模式中的自动补全
ctrl+x 系列的快捷键通常用于补全.
| 快捷键 | 作用 | 备注 |
|---|---|---|
ctrl+x ctrl+n | 基于当前文件的关键词进行补全 | |
ctrl+x ctrl+f | 基于当前文件的路径进行文件名补全 | 写 markdown 时很有用 |
ctrl+x ctrl+d | 基于字典进行补全 | |
ctrl+x ctrl+k | 基于字典进行关键词补全 | |
ctrl+x ctrl+l | 基于整行进行补全 | |
ctrl+x ctrl+o | 基于特定语言的 Omni 补全, 常与插件配合 |
在 INSERT 模式中编辑
| 快捷键 | 作用 |
|---|---|
ctrl+w | 向前删除一个单词 (和命令行中的快捷键一样) |
ctrl+u | 删除当前行所有字符 (和命令行中的快捷键一样) |
ctrl+o | 临时退出插入模式,执行单条命令又返回插入模式 |
ctrl+d | 文字向前缩进 |
ctrl+t | 文字向后缩进 |
| 快捷键 | 作用 |
|---|---|
ctrl+r " | 插入匿名寄存器内容,相当于插入模式下 p 粘贴 |
ctrl+r = | 插入表达式计算结果,等号后面跟表达式 |
ctrl+r : | 插入上一次命令行命令 |
ctrl+r / | 插入上一次搜索的关键字 |
命令模式中的自动补全
:[输入命令的开头]<TAB>重复上一次改动
NORMAL 模式下按 . (英文句号).
例如希望给下面三行的结尾都添加分号 ;.
光标在第一行时, 输入 A;<Esc>.
然后再通过 j.j. 为后面两行的结尾添加分号.
var amiao = "amiao"
var nice = "nice"
var cat = "cat"2
3
行内查找字符
| 快捷键 | 功能 |
|---|---|
f{char} | 在当前光标的 右侧 查找目标字符, 光标移动至最近的字符 |
F{char} | 在当前光标的 左侧 查找目标字符, 光标移动至最近的字符 |
t{char} | 在当前光标的 右侧 查找目标字符, 光标移动至最近的字符 前 |
T{char} | 在当前光标的 左侧 查找目标字符, 光标移动至最近的字符 前 |
另外有两个快捷键用于配合行内查找.
| 快捷键 | 功能 |
|---|---|
; | 重复上一个 f F t T 命令 |
, | 反方向重复上一个 f F t T 命令 |
文件内查询文本
| 快捷键 | 功能 |
|---|---|
/pattern | 从光标处向文件尾搜索 pattern |
?pattern | 从光标处向文件头搜索 pattern |
n | 向同一方向执行上一次搜索 |
N | 向相反方向执行上一次搜索 |
* | 向前搜索光标下的单词 |
# | 向后搜索光标下的单词 |
TIP
可以先通过 VISUAL 模式选择一段文本, 再按下 *, 即可查询所选择的文本.
行尾的 ^M 问题
出问题的原因: 文件采用了 CRLF 行尾格式, 但是 vim 以 LF 行尾格式显示.
因此如果仅仅希望不看见 ^M, 则应该让 vim 以 CRLF 行尾格式来显示:
:e ++ff=dos如果希望将整个文件的行尾格式改为 LF, 则应该这么做:
:%s/\r//g 删除 DOS 换行符 ^M也可以这么做
:e ++ff=dos
:setl ff=unix
:w在单词间跳转光标
除了常见的 w e b 以及他们的大写形式外, 容易被忽略的 ge (以及 gE).ge 将会跳转至左侧单词的末尾. 当需要为前一个单词做补充时适用.
| 快捷键 | 光标位置 (通过下划线标注) |
|---|---|
| move cursor back-and-forth with shortcuts. | |
ge | move cursor back-and-forth with shortcuts. |
gE | move cursor back-and-forth with shortcuts. |
基础跳转命令 w e b 的示例
| 快捷键 | 光标位置 (通过下划线标注) |
|---|---|
| move cursor back-and-forth with shortcuts. | |
w | move cursor back-and-forth with shortcuts. |
W | move cursor back-and-forth with shortcuts. |
e | move cursor back-and-forth with shortcuts. |
E | move cursor back-and-forth with shortcuts. |
b | move cursor back-and-forth with shortcuts. |
B | move cursor back-and-forth with shortcuts. |
在行内跳转光标
| 快捷键 | 作用 |
|---|---|
0 | 跳转至行首 |
^ | 跳转至行内的第一个非空格字符 |
$ | 跳转至行尾 (包含换行符) |
g$ | 当某一行被 wrap 时, 跳转至显示行的行尾 |
g_ | 跳转至行尾的最后一个字符 (不包含换行符) |
gM | 跳转至一行的中间 |
gv | 重新选择上一次选中的文字 |
15| | 移动到当前行的 15列 |
当需要编辑一个被自动换行的长句时, 考虑使用 g$.
当需要复制一段直至行尾的文字, 又不想包含换行符时, g_ 很好用.
在更大范围跳转光标
| 快捷键 | 作用 |
|---|---|
) | 向前移动一个句子 (句号分隔) |
( | 向后移动一个句子 (句号分隔) |
} | 向下移动一个段落 (空行分隔) |
{ | 向上移动一个段落 (空行分隔) |
<enter> | 移动到下一行首个非空字符 |
+ | 移动到下一行首个非空字符 (同回车键) |
- | 移动到上一行首个非空字符 |
| 快捷键 | 作用 |
|---|---|
% | 跳转到 {} () [] 的匹配 |
[ { | 跳转到上一处未匹配的 { |
] } | 跳转到下一处未匹配的 } |
[ ( | 跳转到上一处未匹配的 ( |
] ) | 跳转到下一处未匹配的 ) |
' ' | 回到上次跳转的位置 |
在语义中跳转光标
| 快捷键 | 作用 |
|---|---|
ctrl+o | 跳转到上一个位置 |
ctrl+i | 跳转到下一个位置 |
ctrl+] | 跳转到当前光标文字下的超链接 |
ctrl+t | 返回到跳转之前的位置 |
g d | 跳转到局部定义 (光标下的单词的定义) |
g D | 跳转到全局定义 (光标下的单词的定义) |
g f | 打开名称为光标下文件名的文件 |
查看帮助信息
| 命令 | 作用 |
|---|---|
| :Tutor | 入门文档 |
| :h quickref | 快速帮助 |
| :h index | 查询 Vim 所有键盘命令定义 |
| :h summary | 帮助你更好的使用内置帮助系统 |
| :h CTRL-H | 查询普通模式下 CTRL-H 是干什么的 |
| :h i_CTRL-H | 查询插入模式下 CTRL-H 是干什么的 |
| :h windows | 窗口使用帮助 |
| :h tabpage | 标签页使用帮助 |
| :h :! | 查看如何运行外部命令 |
| :h tips | 查看 Vim 内置的常用技巧文档 |
| :version | 显示当前 Vim 的版本号和特性 |
命令历史记录
: " 进入命令模式
Ctrl+F " 查看命令历史
" 通过 j 和 k 来向上向下移动光标
" 通过回车键选择命令
查看某项设置
" 查看 backspace 的值, 以及在哪里被设置
:verbose set backspace?查看文档或定义
在 NORMAL 模式中, 光标位于目标文本上时, 使用 shift+k 跳转定义.
例如我们在编辑 vimrc 时就可以使用这个技巧, 查看每个配置项的作用.
对 mark 的操作
| 快捷键 | 作用 |
|---|---|
m a | 保存当前位置到书签 a ,书签名小写字母为文件内,大写全局 |
' a | 跳转到书签 a所在的行 |
' A | 跳转到全文书签 A |
' < | 跳到上次可视模式选择区域的开始 |
' > | 跳到上次可视模式选择区域的结束 |
| 命令 | 作用 |
|---|---|
| :marks | 显示所有书签 |
| :delm a | 删除缓冲区标签 a |
| :delm A | 删除文件标签 A |
| :delm! | 删除所有缓冲区标签 (小写字母), 不能删除文件标签和数字标签 |
| :delm A-Z | 删除所有文件标签 (大写字母) |
| :delm 0-9 | 删除所有数字标签 (.viminfo) |
| :delm A-Z0-9 | 删除所有文件标签和数字标签 |
对 Buffer 的操作
| 命令 | 作用 |
|---|---|
| :ls | 查案缓存列表 |
| :bn | 切换到下一个缓存 |
| :bp | 切换到上一个缓存 |
| :bd | 删除缓存 |
| :b 1 | 切换到1号缓存 |
| :b abc | 切换到文件名为 abc 开头的缓存 |
| ]b | 上一个 buffer |
| [b | 上一个 buffer |
| :bufdo CMD | 对所有 buffer 执行 CMD 命令 |
NOTE
例如可以通过 :bufdo e! 还原所有 buffer 中为保存的修改.
这种操作的使用场景可能是: 在工程内重命名了某个变量, 然后又希望放弃此次重命名.
对 Tab 的操作
实际使用中, :tabo 最常用.
| 命令 | 作用 |
|---|---|
| :tabc | 关闭当前的 tab |
| :tabo | 关闭所有其他的 tab |
| :tabs | 查看所有打开的 tab |
| :tabp | 前一个 |
| :tabn | 后一个 |
| :tabn n | 切换到第 n 个标签页 |
TIP
切换标签页最方便的办法是 ctrl+pgdn 和 ctrl+pgup.
但需要注释是否和 terminal 的快捷键有冲突.
Highlight Group
光标位于任意字符上时, :Inspect 查看对应的 Highlight group.
使用 :hi 查看所有的 highlight group 及其配色.
或者使用 :hi HIGHLIGHT_GROUP 查看某个 highlight group.
TIP
:hi 命令中无法搜索, 为此可以将其中的内容转发到一个新的 buffer 中::redir @a | silent hi | redir END | new | put a
分割窗口
| 命令 | 作用 |
|---|---|
:sp <filename> | 横向分窗口 |
:vsp <filename> | 纵向分窗口 |
:new <filename> | 横向分窗口 (创建空白页面) |
:vnew <filename> | 纵向分窗口 (创建空白页面) |
分屏的相关动作都是 ctrl+w 开始的, 然后再跟一个其他字母:
| 快捷键 | 作用 |
|---|---|
ctrl+w = | 让各窗口宽度, 高度均等 |
ctrl+w _ | 当前窗口高度扩展到最大 |
ctrl+w | | 当前窗口宽度扩展到最大 |
ctrl+w c | 关闭当前窗口 |
ctrl+w o | 仅保留当前窗口 |
ctrl+w w | 切换至下一个窗口 |
ctrl+w h/j/k/l | 按方向切换窗口 |
折叠文本
选中需要折叠的行后, 按下 z f 折叠文本.
当光标处于被折叠的行时, 按下 z o 展开文本, 按下 z d 删除折叠标记并展开文本.
当光标处于已有折叠标记的行时, 按下 z c 再次折叠文本.
| 快捷键 | 作用 |
|---|---|
z f | 新增折叠区域, f - fold |
z o | 展开折叠区域, o - open |
z c | 关闭折叠区域, c - close |
z d | 删除折叠区域, d - delete |
| % | % |
z m | 将整个 buffer 的折叠层级 +1 |
z M | 将整个 buffer 折叠起来 |
z r | 将整个 buffer 的折叠层级 -1 |
z R | 将整个 buffer 完全展开 |
还可以配合 text-object 工作, 例如:
| 快捷键 | 作用 |
|---|---|
z f i { | 折叠大括号内部的内容 |
z f a { | 折叠包括大括号在内的内容 |
NOTE
手动设置可折叠区域会比较麻烦, 建议通过 nvim-treesitter 来自动设置:
-- fold by treesitter
vim.o.foldmethod = "expr"
vim.o.foldexpr = "nvim_treesitter#foldexpr()"
vim.o.foldlevelstart = 99退出 vim
虽然我们都知道可以使用 :wq :q! 来退出 vim,
但更方便的方式是: 在 NORMAL 模式中按下 Z Z 或 Z Q.
| 快捷键 | 作用 |
|---|---|
:wq 或 Z Z | 保存并退出 |
:q! 或 Z Q | 放弃所有修改并退出 |
:e! | 放弃所有修改 |
wa | 保存所有文件 |
自动格式化
选中需要格式化的内容后, 点击 = 按键.
例如需要格式化整个文本, 就可以使用快捷键 ggVG=.
格式化单行文本 ==.
将光标所在的大括号内的文本格式化 =i}.
查找替换
常用操作
" 替换整个文件中所有的旧字符串
:%s/旧字符串/新字符串/g" 在 VISUAL 模式下选中一些字符后, 进入命令模式,
" 将会让替换范围被限制在被选中字符中.
'<,'>s/旧字符串/新字符串/g语法细节
" 语法非常类似于 sed 命令
:[addr]s/旧字符串/新字符串/[option]s 表示替换操作, 其为 substitute 的首字母.[addr] 表示检索范围.[option] 表示操作类型.
[addr] 的值 | 作用 |
|---|---|
1,n | 表示从第 1 行到 n 行 |
1 | 表示第一行 |
% | 表示整个文件, 同"1,$" |
.,$ | 表示从当前行到文件尾 |
| 省略时表示检索范围是当前行 |
[option] 的值 | 作用 |
|---|---|
g 或 globe | 表示全局替换 |
c 或 confirm | 表示进行确认 |
p | 表示替代结果逐行显示 (Ctrl+L 恢复屏幕) |
i 或 ignore | 表示不区分大小写 |
| 省略时仅对每行第一个匹配串进行替换 |
TIP
如果在源字符串和目的字符串中出现 / , < > 等特殊字符,
则需要前面加 \ 进行转义.
文件类型识别
vim 有些时候无法识别出文件类型 (因为有的文件名没有后缀).
此时可以在当前 vim 窗口中手动设置:
" 设置文件类型为 gitconfig.
:set filetype=gitconfig搜索结果高亮
" 开启搜索结果高亮
:set hls
" 关闭搜索结果高亮
:set nohlsTIP
vim 设置中, 在关键词前面加上 no 来表示相反的设置, 是个惯例.
不自动换行
vim 在显示特别长的一行时, 如果超过窗口宽度, 会默认将超出的部分显示在下一行.
有些时候我们并不希望自动换行显示, 此时可以执行 :set nowrap.
滚动与翻页
| 快捷键 | 作用 | 备注 |
|---|---|---|
ctrl+f | 整页向下翻页 | forward |
ctrl+b | 整页向下翻页 | backward |
ctrl+d | 向下翻半页 | page down |
ctrl+u | 向上翻半页 | page up |
ctrl+e | 向下滚动一行 | |
ctrl+y | 向上滚动一行 | |
z L | 屏幕向右滚动半页 | |
z H | 屏幕向左滚动半页 |
文本对象
| 类型 | 代表 | 备注 |
|---|---|---|
| 单词 | w | word |
| 句子 | s | sentence |
| 段落 | p | paragraph |
| XML 标签 | t | tag |
| 类型 | 代表 | 备注 |
|---|---|---|
| 小括号 | (, ), b | brackets |
| 中括号 | [, ] | square brackets |
| 大括号 | {, }, B | curly braces |
| 尖括号 | <, > | |
| 单引号 | ' | |
| 双引号 | " | |
| 反引号 | ` |
TIP
在空白的行中输入 d i p, 会删除连续的空白行.
TIP
操作文本对象时, 光标所在位置 不一定 需要位于 "目标文本对象" 内部.
例如按下 v i ( 时, 如果光标不位于任何小括号内部, 则会自动选中 "接下来的最近的" 小括号.
cursor position │ .....................
buffer line │ This is example text (with a pair of parentheses).
selection │ └───────── vi) ─────────┘TIP
当光标处于 多层 小括号内部时, 如果想选中 更外层 的小括号内的文本, 可以使用 v {n} i ) 快捷键.
cursor position │ ..............
buffer line │ This is example text (with (two pairs of) parentheses).
selection │ └───────── v2i) ──────────────┘
selection │ └── vi) ───┘大小写转换
| 快捷键 | 作用 |
|---|---|
~ / shift+` | 将当前光标所在的字符切换大小写 |
g u u | 将当前行全部转换为小写 |
g U U | 将当前行全部转换为大写 |
选中后再 g u | 将所选择的区域全部转换为小写 |
选中后再 g U | 将所选择的区域全部转换为大写 |
TIP
也可以配合 文本对象 使用.
例如 g u i w 会将当前光标所在的 word 全部转换为小写.
例如 g U i " 会将当前或下一个双引号内的字符全部转为换大写.
手动缩进
在 NORMAL 模式下按 >> 即可向 右 缩进一步.
相应地, 在 NORMAL 模式下按 << 即可向 左 缩进一步.
步长等于 vimrc 中所设置的 shiftwidth 的值.
实际使用中有一些实用技巧:
| 快捷键 | 效果 |
|---|---|
{n}>> | 缩进从当前行开始向下的连续几行 (总共 n 行), 例如 3>> |
>{n}j | 缩进从当前行开始向下的连续几行 (总共 n+1 行), 例如 >2j |
>{n}k | 缩进从当前行开始向上的连续几行 (总共 n+1 行), 例如 >2k |
>G | 缩进从当前行至 文件结尾 的所有行 |
>} | 缩进从当前行至 段落结尾 的所有行 |
TIP
NORMAL 模式下, 建议使用 V 选中多行之后再用 < 或 > 缩进.
在 INSERT 模式中, 也有缩进的快捷键:
| 快捷键 | 效果 |
|---|---|
ctrl+t | 向后缩进 |
ctrl+d | 向前缩进 |
Quickfix 窗口
| 命令 | 作用 |
|---|---|
| :copen | 打开 quickfix 窗口 (查看编译, grep 等信息) |
| :copen 10 | 打开 quickfix 窗口, 并且设置高度为 10 |
| :cclose | 关闭 quickfix 窗口 |
| :cfirst | 跳到 quickfix 中第一个错误信息 |
| :clast | 跳到 quickfix 中最后一条错误信息 |
| :cc [nr] | 查看错误 [nr] |
| :cnext | 跳到 quickfix 中下一个错误信息 |
| :cprev | 跳到 quickfix 中上一个错误信息 |
TIP
:cdo CMD 能够对 quickfix 列表批量执行命令.
例如可以通过 :cdo s/typ/typo/g 实现批量替换.
拼写检查
| 命令 | 作用 |
|---|---|
| :set spell | 打开拼写检查 |
| :set nospell | 关闭拼写检查 |
| 快捷键 | 效果 |
|---|---|
] s | 下一处错误拼写的单词 |
[ s | 上一处错误拼写的单词 |
z g | 加入单词到拼写词表中 |
z u g | 撤销上一次加入的单词 |
z = | 拼写建议 |
宏录制
| 快捷键 | 效果 |
|---|---|
q a | 开始录制名字为 a 的宏 |
q | 结束录制宏 |
@ a | 播放名字为 a 的宏 |
@ @ | 播放上一个宏 |
@ : | 重复上一个 ex 命令 (即冒号命令) |
TIP
录制宏之后, 可以选中行之后, 通过 :norm @q 来针对每一行执行宏.
未分类
| 快捷键 | 效果 |
|---|---|
g a | 显示光标下字符的 ascii 码或者 unicode 编码 |
g 8 | 显示光标下字符的 utf-8 编码字节序 |