前言
此前做过一篇极为浅的
Vim入门介绍,但是当时理解不够深刻,仅作为一个快速入门的教程,且快捷键覆盖既不广也不好记本篇文章是对
vim的模式系统以及快捷键结构的总结,试图提供一个更简洁的记忆技巧如果使用
neovim,可以使用which-key更直观地学习和记忆快捷键vim可以使用vim-which-key插件
模式系统
帮助命令
- 通过
:h intro.txt查看最基本的介绍 - 通过
:h vim-modes查看各种编辑模式的介绍 - 通过
:h mode()查看所有编辑模式的记号 - 通过
:mod[e]查看当前所在模式的记号 - 通过
:h mode-switching更直接地查看不同的模式之间如何切换
普通模式
- 普通模式即
NORMAL,是最常用的模式,光标移动、进入其它模式、复制删除粘贴等快捷命令均通过普通模式执行 - 在普通模式下,通过
i/I, a/A, o/O进入插入模式,分别对应光标左侧插入、行首插入、光标右侧插入、行末插入、新的下一行插入、新的上一行插入 - 在普通模式下,通过
v/V/<C-v>进入VISUAL模式,分别对应字符视图、行视图、块视图 - 在普通模式下,通过
:, /, ?, !进入COMMAND模式,分别对应命令、向前搜索、向后搜索、筛选命令模式 - 在普通模式下,通过键入
operator进入O-PENDING模式,即等待输入模式 - 在普通模式下,通过
R和gR进入替换模式,分别对应普通替换和虚拟替换 - 至于
SELECT和EX模式,它们并不常用
视图模式、插入模式、命令模式、等待模式、替换模式
- 视图模式即
VISUAL,用于选择一部分文本进行统一的操作 - 插入模式即
INSERT,用于输入文本 - 命令模式即
COMMAND,用于执行命令 - 等待模式即
O-PENDING,用于继续键入motion或其它快捷键 - 替换模式即
REPLACE,并非插入而是替换字符- 普通替换模式将每个字符视作单个字符
- 虚拟替换模式将
tab展开为空格,在视觉上看起来像按列来替换
- 在上述模式下,通过
<Esc>或<C-c>退出到普通模式
选择模式和Ex模式
选择模式并不常用,是之前推广到
Windows系统时作出的兼容,例如使用鼠标进行拖动选择但现在已经很少使用,上次见到是在展开
snippet时的占位符里Ex模式更少用,它源自Unix的Ex编辑器,当时Vim是它的可视化模式,Ex通过纯命令行的方式来进行更快捷的文本操作可以通过
:vi退出Ex模式
映射系统
帮助命令
- 通过
:h map.txt查看映射模式文档 - 通过
:h map-modes或:h map-table查看所有映射模式的记号 - 通过
:h map-commands查看所有用于映射的命令 - 通过
:h key-notation或:h keycodes查看所有的前缀键 - 通过
:h map-arguments查看特殊键 - 通过
:h mouse查看鼠标相关事件 - 快捷键本身(
<>包围的部分)是不区分大小写的,例如<C-a>和<c-A>都表示Ctrl+a - 映射参数是区分大小写的
快捷键映射
- 映射模式包含
n、i、c、v、x、s、o、t,分别表示普通模式、插入模式、命令模式、视图+选择模式、视图模式、选择模式、等待模式、终端模式 - 终端模式
t在Vim 8.0+以及Neovim中支持 - 此外,
l模式属历史遗留的LANG模式,专用于特殊字符的映射,例如一些有注音的字符等 - 使用
vimscript的映射命令还支持[nore]map!与[nore]map,前者包含i与c,后者包含nvso,但其实都没什么用 - TODO:
Neovim的映射方式 noremap:一般来说,应该使用noremap而不是map,表示不会递归定义导致循环映射
键代码
因为历史遗留原因,终端会将部分不同的组合键映射到同一个
ASCII码,它们其中一个被映射则会影响所有键码相同的组合键使用
<C-v>并键入,会打印下一次输入的键位记号<S-x>:shift的组合键<C-x>:ctrl的组合键<M-x>与<A-x>:Meta键(Unix说法)和Alt键(Win或Mac说法)的组合键<M-C-x>:ctrl+alt的组合键<Nul>与**<Nop>**:空字符、空操作,用于禁用某些原生快捷键,在使用上在大多数情况下等价,更推荐使用<Nop><Nul>与<C-@>等价<NL>与**<CR>**:换行符和回车符,在使用上大多数情况下等价,更推荐使用<CR>此外,<CR>还与<Return>和<Enter>等价<BS>:退格符,和<C-h>等价<Tab>:制表符,和<C-i>等价<Space>:空格<Esc>:退出键,和<C-[>等价<Up><Down><Left><Right>:上下左右键<F1>-<F12>:F键<Home><End><PageUp><PageDown>:对应Home、End、PgUp、PgDn键不同终端貌似对
F键的组合键的映射不同,在我的终端映射为<F13>-<F48>,建议通过<C-v>测试<Leader>:用户自定义的前导键(默认\)<LocalLeader>:缓冲区本地前导键<Cmd>:仅neovim中可以使用的在不离开当前模式下(即后台)运行的前缀,其后必须至少包含一个<CR>或其等价键注意由于键位不区分大小写,如果要绑定和大写字母相关的快捷键,更常用的是结合
<Leader>键,例如<Leader>C,在<>外部的字符是区分大小写的
映射参数
<Plug>:是插件作者和用户之间的统一插件接口<silent>:静默执行<expr>:表达式映射,执行Vimscript/Lua表达式<buffer>:仅当前缓冲区有效的局部映射<nowait>:不等待更长匹配,立即触发
鼠标相关事件
- 不想作介绍,详见帮助文档
abbre
- 详见
:h ab