前言

  • 此前做过一篇极为浅的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