由于最近经常需要在服务器端简单修改一些配置文件, 因此有必要了解一下VIM的基本操作. 此外, 目前的主流IDE基本都提供了VIM的键位映射, 虽然这些键位映射的模式并不能等同于VIM, 但大部分基本操作都是支持的. 因此掌握了VIM的基本操作还是能够在其他IDE上提高代码的编辑速度.
目前的个人体验是, VIM适合编辑不太依赖代码补全的项目, 例如Python. 对于需要切换输入法的场景, 例如写博客, 由于多了切换的步骤, 因此不适合VIM. 对于写LeetCode这种可能要手写代码的场景, 可以考虑使用VIM作为IDE.
VIM的一大特色就是需要进行大量的配置才能用的舒服. 以前觉得不适合使用VIM的场景实际上都能够配置解决. 例如中英文切换就可以通过插件自动切换.
由于VIM的操作实在是太多, 根本不可能完全的记住, 所以本文采取需求驱动的方法, 每次遇到一个需求时, 使用查询VIM的相关用法, 并记录再这里. 按照这样的规律进行学习可能更容易记住相关的操作. 所以下面的内容不会按照逻辑顺序组织, 而是按照时间顺序组织.

如上图所示, 给出了VIM大部分常见的操作, 同时每个按键也给了相应的含义, 这有助于记忆每个按键的功能.
对VIM了解的越多, 则从这张图中获得的信息越多
高价值参考资料
基础移动
| 常见需求 | 指令 | 说明 |
|---|---|---|
| 跳转到文件的指定行 | <N>G/:<N> |
/ |
| 跳转到指定字符 | f<a> / F<a> |
小写字母f正向跳转, 大写字母F反向跳转 |
| 删除一个单词 | cw |
w表示移动到单词的末尾位置 |
| 撤销上一个操作 | u |
/ |
| 全选 | yG |
即复制当前位置到末尾的全部内容 |
| 复制字符串 | f"yf" |
首先f"移动到字符串开始位置, 然后yf"复制到字符串结束的全部内容 |
| 删除字符串 | f"dt" |
首先f"移动到字符串开始位置, 然后dt"删除 |
| 标签跳转 | ma / 'a |
m定义标签, '跳转到标签的所在行 |
| 重新加载文件 | :e |
|
| 指定文件编码 | :set encoding=utf8 |
标签
VIM可以定义标签, 标签是文本中的一个位置, 可以快速跳转到标签所在的位置
使用指令ma 定义标签a, 使用mA定义标签A. 小写字母只能在单个文件内跳转, 跨文件跳转需要使用大写字母.
使用指令`a 跳转光标到标签a的位置, 使用指令 ‘a 跳转到标签a所在行的行首.
| 指令 | 作用 |
|---|---|
| :marks | 查看所有标签 |
| :delmarks a | 删除标签a |
| :delmarks! | 删除所有标签 |
寄存器
寄存器暂存复制和剪切的结果. 所有的寄存器都是以双引号"+字母的形式构成. 通常情况下使用的是无名寄存器""(即寄存器的名称为双引号). 如果想把结果放入某个具体的寄存器, 可以如下操作
| 指令 | 作用 |
|---|---|
"ayy |
将当前行放入寄存器a |
"ap |
粘贴寄存器a的内容 |
:reg |
显示全部寄存器的内容 |
宏
VIM可以将一组动作保存起来, 并在之后将其作为基本指令进行重放.
按下qa开始录制宏并将宏保存到寄存器a中. 之后可以输入任意的指令序列, 最后回到normal模式再次按下q结束录制.
使用@a重放a中记录的操作.
宏的名字空间和寄存器是独立的, 不会相互影响
例如在rebase代码时, 可能看到如下的代码
1 | pick commit4 |
如果想从第二行开始将所有的pick替换为s, 则可以在第二行开头的位置执行qaces<ESC>jq录制一个替换的宏, 然后输入2@a将这个宏直接重放两次
搜索和替换
在正常模式输入/进入搜索模式, 此时直接搜索需要的字符串, 即可在文本中进行搜索. 输入要查找的字符串并按下回车进入搜索模式, 此时按n查找下一个, 按N查找上一个. 查找过程支持正则表达式.
VIM使用:substitute指令进行搜索和替换, 这一指令通常简写为:s, :s将当前行的指定字符串替换为另外一个字符串, 格式如下
1 | :s/<find-this>/<replace-with-this>/<flags> |
以将字符串tthe替换为the为例, 不同模式具有如下的格式
| 指令 | 作用 |
|---|---|
:s/tthe/the |
在当前行第一个匹配的位置进行替换 |
:s/tthe/the/g |
在当前行进行全部替换 |
:15,42s/tthe/the/g |
在15行到42行之间的内容中进行替换 |
:%s/tthe/the/g |
全局替换 |
:%s/tthe/the/gc |
全局替换并并在每一处询问是否替换 |
键位映射
键位映射的基本指令是map指令. 在这个指令的基础上可以添加一些前缀来限定范围, 前缀列表如下:
| 前缀词 | 效果 |
|---|---|
| nore | 非递归映射 |
| n | 表示在普通模式下生效 |
| v | 表示在可视模式下生效 |
| i | 表示在插入模式下生效 |
| c | 表示在命令行模式下生效 |
因此norenmap表示在normal模式下的非递归映射.
把最常用的操作映射为最舒服的按键方式
IDEA使用VIM
IDEA系列的IDE均提供了VIM插件, 可以通过配置该插件实现使用VIM的效果. 首先需要安装如下的插件
- ideaVIM: 提供VIM的核心功能
- IdeaVimExtension: 提供中英文输入法自动切换功能
上述插件均可直接在插件市场下载. 安装完成后在IDE的右下角有一个VIM的图标,点击这个图片可以快速启用和关闭插件. 同样地, 需要写个配置文件来做相关的设置. 点击VIM图标可以打开配置文件, 输入如下内容:
1 | " 显示当前模式 |
配置文件来自博客: ideavim 配置说明.
VsCode配置VIM
- 下载插件
Vim - 下载输入法切换工具im-select, 将
- 将im-select放置到合适的位置(不需要是PATH路径)
- 打开设置, 搜索
vim进行配置 - 打开设置, 搜索
vimrc进行配置
一套配置下来也能用, 但是和Markdown All for One插件存在一些冲突, 因此用来写Markdown有些不合适
VIM基础配置
对于服务器上的VIM,因为大部分时候都是简单改配置,所以不需要太过复杂的配置文件,可以使用如下的简化版配置文件。VIM的配置位于用户目录的.vimrc文件, 建议在其中加入如下的内容
1 | syntax on " 开启语法高亮 |
如果只是使用VIM的键位映射, 那么就没必要进行配置了
参考资料
最后更新: 2026年04月16日 12:22
版权声明:本文为原创文章,转载请注明出处