前言
现代编辑器普遍都是图形用户界面(功能在界面上),配合鼠标操作,以视觉反馈为中心的线性操作,符合人类直觉认知路径。但存在操作链断裂、注意力流中断(视觉焦点在界面元素间跳跃)等本质缺陷。也就是说这种操作方式(鼠标/GUI)每次功能操作需等待系统响应,每次移动需离开键盘,而且功能键和反馈区也大都是分离的,这就需要我们的视角不断切换,这种我称之为事件驱动型(或人机交互型)。
VIM这类编辑器用的就比较少了,它通过模式化的语言可以构建连续的操作流,即将编辑行为转化为语义明确的指令组合。打破了事件反馈的循环,而且操作统一在键盘进行无需键鼠切换。使得可以随心所欲的顺畅操作,可称之为“意图驱动型”,起心动念间即可通过手传达到键盘并表现出来,无需等待,无需等待,无需等待!
-
效率曲线的微分方程对比
- 鼠标/GUI操作的效率函数呈对数增长:E(t)=k*ln(t),初期提升快但迅速进入平台期。
- Vim模式操作的效率函数遵循指数规律:E(t)=e^(λt),陡峭的学习曲线后产生编辑速度的奇点。这种差异源于模态编辑的叠加态特性——熟练者可在normal/insert/visual模式间量子隧穿,单次操作可同时影响多个代码位点。
-
认知神经科学的路径解析
- 鼠标操作依赖背侧视觉通路(where通路),需要持续的空间定位认知负荷
- Vim操作激活前运动皮层-基底节环路,将编辑指令编译为程序性记忆包。vim操作需要记忆,提前准备好。
vim的特性
Vim是1991年诞生的经典文本编辑器,作为Vi的增强版本,凭借高效性和可定制性在程序员群体中广受推崇。以下从核心设计、优势劣势、学习价值三个方面展开分析:
一、核心设计理念
-
多模式编辑:通过不同模式实现高效操作
- 普通模式:默认模式,用于导航与快速操作(复制/粘贴/删除)
- 插入模式:按
i
进入文本输入,类似传统编辑器 - 可视模式:支持字符/行/块三种文本选择方式
- 命令模式:通过命令执行复杂操作(如
:wq
保存退出)
-
键盘操作优先:减少手部移动和鼠标依赖,通过快捷键组合提升效率,特别适合编程和文本处理
ps: 有人真正入坑的原因是因为背部肌肉劳损,用鼠标久了,背后肌肉就痛,用键盘可以有效的改善(不过也有听说别人用键盘多了腱鞘炎的案例,总之,别久坐多活动)。而且有一说一,JetBrains家的产品原生的快捷键,不爽很多年了,比如删除行是ctrl+y,小手要拉着食指和小指到最大距离才能按,非常反人类。而且快捷键很多,ctrl/shift/alt/按键区/F区各种组合,手飞来飞去。
二、Vim的优势和劣势
Vim的优势
-
高效的键盘操作
- 全键盘操作:
hjkl
移动光标、dd
删除整行、yy
复制内容,无需鼠标(大大减少鼠标操作) - 组合命令:
d3w
删除3个单词,减少重复动作
- 全键盘操作:
-
跨平台与轻量化
- 支持Windows/Linux/macOS,服务器环境预装,远程开发标配
- 启动快、资源占用低,处理大文件更高效
-
强大的插件生态
- 扩展功能:
NERDTree
文件浏览、YouCompleteMe
代码补全,可打造类IDE环境 - 高度定制:通过
.vimrc
自定义快捷键、主题、语法高亮
- 扩展功能:
Vim的劣势
-
学习曲线陡峭
- 需记忆大量快捷键和模式逻辑,非常不直观,新手易挫败,需要养成一定的思维模式
- 比如你要把光标移动到当前屏幕的下半部分的某一行的某个单词上,你就需要关注行号/列号,这就很难受;如果你用到搜索那可能有重复的,一次也可能到不了那个位置,而且还可能跳出当前屏内容。
- 比如你要删除单词后4个单词,可以使用d4w,但这种要计算次数的操作就有点反人类了
- 比如查找某个单词,则往往不能一次就定位到,这也很别扭
- 初期效率可能低于VS Code等现代编辑器
- 需记忆大量快捷键和模式逻辑,非常不直观,新手易挫败,需要养成一定的思维模式
-
功能扩展依赖插件
- 原生功能有限,复杂功能(调试/项目管理)需插件支持,配置复杂,并且有一定的兼容性问题
-
对现代开发支持不足
- 缺乏原生图形调试工具,依赖
vimspector
等插件 - 新特性(如Tree-sitter语法解析)落后于Neovim
- 缺乏原生图形调试工具,依赖
三、学习的价值
-
适用场景
- 服务器环境:Linux/Unix系统中必备工具,命令行模式下编辑,运维/开发刚需
- 效率提升:熟练后编辑速度远超传统编辑器
-
健康与效率
- 减少鼠标依赖,降低重复性劳损风险
-
职业发展
- 被视为程序员基本功,尤其受开源社区和系统管理领域重视
学习成本及建议
学习成本
vim重要的是其模式操作的思想,哪个平台好用用哪个,一开始最好不要选择完全是vim的编辑器,选择一个以插件运行vim的编辑器,这种不会强制你完全以命令操作,可以使用鼠标/GUI,降低入门难度。比如Jetbrains家有专门的人维护IdeaVim插件,各方评价都相当不错,其他编辑器如VSCode都或多或少有问题。另外,在JetBrains家旗下的所有产品,都能通用该插件,复用性很好。而且该插件在窗口有个小开关,随时关闭,方便使用。兼容方面,插件有专门的菜单列出哪些快捷键是不兼容的,并且可以设置不兼容的归为IDE/Vim,非常人性化。
另外如果使用真正的Vim或者NeoVim,需要配置大量的插件,而且这些插件都容易有版本更新不及时,有bug,甚至停止维护的风险。即便使用LazyVim,LunarVim之类的配置好的,也有大量的使用成本,建议入坑前考虑清楚自己的情况的收益和投入。相比之下,IdeaVim算是入门成本低,坑少,收益高的方案了。请留意投入产出比!
大多人说Vim的操作复杂,其实真正上手时,基本的操作并没有那么难,先熟悉基本操作再慢慢扩展,可以一个指令一个指令的增加。Vim真正的陡峭在其配置和操作思想的复杂,虽说可以自由配置但却把一些编辑器内部的东西摆到了前台要使用者自己了解配置,虽说大部分指令都很简单,但架不住指令多啊,如何把操作跟指令组合映射起来,如何确定最短路径?这些其实都要提前准备好记在脑子里,否则就没有什么效率可言了。这两方面来说你知道的越多你越熟练效率越高,但显然这需要很多投入,这也是vim的难点。贪多嚼不烂,其实一开始用不到这么多功能。只要会基本操作,有什么需要用到的时候再去查就好了。建议在网上找一些比较全面的文档,先从基本的开始,最开始的入门还是比较简单的,然后慢慢练慢慢拓展,不得不说这是相对漫长的过程。
学习建议
建议优先掌握核心功能(模式切换/搜索替换),并结合现代编辑器灵活使用。 在核心功能熟悉后逐步扩展,总之根据需要来,对于不常用的功能慢慢学,甚至可以不学,这些功能带来的收益并没有那么大,鼠标也有鼠标的优势和必要的场景。
- 新手:从
vimtutor
开始,逐步掌握基础操作 - 进阶:通过
fzf
等插件优化工作流 - 权衡:IDE用户可仅学基础命令或用Vim插件模拟
第一部分 模式
第1章 Vim解决问题的方式
第2章 普通模式
第3章 插入模式
第4章 可视模式
第5章 命令行模式
快捷键可以算是普通模式的简化,但它又可以横跨几个模式,快捷键进一步提升了模式操作的效率
Vim 中的“修改”操作定义
Vim 的修改操作指对文本内容进行增删替换的行为,涵盖插入模式编辑、删除内容、替换字符/行等操作,需通过不同模式(普通模式、插入模式、命令模式)协作完成14。
一、进入插入模式(开始修改)
通过以下按键从普通模式进入插入模式,直接编辑文本:
i:在光标前插入内容57。
a:在光标后插入内容57。
o:在下方插入新行并进入插入模式57。
O(大写):在上方插入新行并进入插入模式57。
s:删除当前字符并进入插入模式4。
c + 动作(如 cw 删除单词并进入插入模式)45。
二、基础修改命令(普通模式)
操作类型 命令示例 功能描述
删除 x 删除光标处字符15
dw 删除当前单词15
dd 删除整行14
替换 r + 目标字符 替换单个字符(如 ra 替换为 a)45
R 进入持续替换模式,覆盖后续字符45
撤销/重做 u 撤销上一次操作14
Ctrl + r 重做被撤销的操作14
三、高级修改方法
- 行/全局替换(命令模式)
:s/old/new/g:替换当前行所有匹配的 old 为 new25。
:%s/old/new/g:全局替换所有匹配项25。
:.,$s/old/new/g:从当前行到文件末尾替换2。 - 批量行操作
d + 动作:如 dG 删除从当前行到文件末尾45。
yy + p:复制整行并粘贴到目标位置15。
四、保存修改后的文件
:w:保存文件但不退出78。
:wq 或 :x:保存并退出78。
:q!:强制不保存退出78。
总结流程
进入插入模式(i/a/o 等)直接修改文本57。
普通模式下使用 x、dd、r 等快速删除或替换14。
命令模式下执行全局替换或保存操作27。
通过组合模式切换和命令,可实现高效的文本修改
第二部分 文件
第6章 管理多个文件
第7章 打开及保存文件
切换标签页:
" 下一个标签页
nnoremap <M-l> :tabnext<CR>
" 上一个标签页
nnoremap <M-h> :tabprevious<CR>
" 新建标签页
nnoremap <M-t> :tabnew<CR>
窗口跳转:
" 使用 Ctrl + 方向键切换窗口
nnoremap <C-j> <C-W>j
nnoremap <C-k> <C-W>k
nnoremap <C-h> <C-W>h
nnoremap <C-l> <C-W>l
缓冲区(Buffers)管理
快速切换缓冲区:
" 下一个缓冲区
nnoremap <Tab> :bnext<CR>
" 上一个缓冲区
nnoremap <S-Tab> :bprevious<CR>
" 关闭当前缓冲区
nnoremap <Leader>bd :bd<CR>
一、基础窗口操作
- 窗口分割
命令 作用
:sp [文件名] 水平分割窗口(上下分屏)
:vsp [文件名] 垂直分割窗口(左右分屏)
Ctrl-w s 水平分割当前窗口
Ctrl-w v 垂直分割当前窗口 - 窗口切换
快捷键 作用
Ctrl-w h 切换到左侧窗口
Ctrl-w j 切换到下方窗口
Ctrl-w k 切换到上方窗口
Ctrl-w l 切换到右侧窗口
Ctrl-w w 循环切换所有窗口
Ctrl-w t 跳转到左上角(Top-Left)窗口 - 窗口关闭
命令/快捷键 作用
:q / :close 关闭当前窗口
Ctrl-w c 关闭当前窗口
Ctrl-w o 关闭其他所有窗口(仅保留当前) - 窗口大小调整
快捷键 作用
Ctrl-w + 增加窗口高度
Ctrl-w - 减少窗口高度
Ctrl-w > 增加窗口宽度
Ctrl-w < 减少窗口宽度
Ctrl-w = 等分所有窗口尺寸
" 更直观的窗口切换(类似IDE)
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
" 快速分屏
nnoremap <Leader>vs :vsp<CR>
nnoremap <Leader>sp :sp<CR>
" 窗口大小调整(按住 Alt + 方向键)
nnoremap <M-Left> :vertical resize -5<CR>
nnoremap <M-Right> :vertical resize +5<CR>
nnoremap <M-Up> :resize -5<CR>
nnoremap <M-Down> :resize +5<CR>
" 快速关闭窗口
nnoremap <Leader>q :q<CR>
第三部分 更快地移动及跳转
第8章 用动作命令在文档中移动
第9章 在文件间跳转
技巧56: 遍历跳转列表 - 时空穿梭的轨迹
跳转列表记录了你在所有文件中跨越 5 行以上的跳转轨迹(如 gg/G、/搜索、标签跳转等)
核心操作:
查看列表::jumps (显示带编号的跳转历史)
时间回溯: 向旧位置跳转(相当于「后退」)
重返未来: 向新位置跳转(相当于「前进」)
高阶特性:
窗口独立:每个窗口维护自己的跳转列表,分割窗口时会继承父窗口的列表
跨文件记忆:即使切换 buffer,跳转列表依然保留所有文件的轨迹
精准跳转::jump [编号] 可直接跳转到指定历史位置
调试技巧:
若发现跳转丢失,检查是否使用过 :clearjumps 清除了列表
跳转列表默认记录 100 条历史,可通过 set jumpoptions=stack=200 调整
技巧57: 遍历改变列表 - 代码演化的地标
改变列表自动记录文件修改位置(每次退出插入模式或执行修改命令时生成)
核心操作:
查看列表::changes (显示修改点的时间线)
逆向遍历:g; 跳转到上一个修改点
正向遍历:g, 跳转到下一个修改点
高阶特性:
文件绑定:每个文件独立维护自己的改变列表
时空标记:`. 直接跳转到最后一次修改的位置
混合导航:在普通模式按 gi 可直接回到上次插入位置并进入插入模式
典型场景:
1. 修改函数参数(第30行)
2. 调整类型定义(第150行)
3. 修复边界条件(第80行)
通过 g; 可快速在三个关键修改点循环跳转
导航策略矩阵:何时选用哪种方式?
场景 跳转列表 改变列表
跨文件查找代码 ✅ 优先使用 ❌ 仅当前文件
回溯近期修改点 ❌ 可能混杂跳转 ✅ 精准定位
找回意外关闭的位置 ✅ 完整历史 ✅ 最近修改点
代码审查 ❌ 轨迹复杂 ✅ 修改脉络清晰
终极技巧:将跳转列表看作「浏览器历史」,改变列表视为「书签集」,配合 "(最后退出插入的位置)和
.(最后修改位置)组成多维导航体系。
通过组合这些工具,可使代码浏览效率提升 3 倍以上。建议在实战中先刻意练习 2 周形成肌肉记忆,最终达到「心之所至,光标即达」的境界。
快速搜索
- 普通模式下快速搜索复制的内容
" cnoremap:表示在命令行模式(包括搜索模式)下定义映射。
" 如果你想定义一个快捷键来自动插入某个寄存器的内容,可以通过 Vim 的映射功能模拟输入。例如:
cnoremap <C-p> <C-r>+
使用方法:
- 按下 / 进入搜索模式。
- 按下 Ctrl+p,Vim 会自动插入寄存器 0 中的内容。
- 按下 Enter 完成搜索。
- 基本搜索命令
-
/ 和 ?
/pattern:向下搜索指定模式(按 Enter 确认)。
?pattern:向上搜索指定模式。n:跳转到下一个匹配项(与 / 或 ? 方向一致)。
N:跳转到上一个匹配项(反向跳转)。 -
* 和 #
*:向下精确搜索光标所在的单词(需完整匹配,如 \bword\b)。
#:向上精确搜索光标所在的单词。
g*/g#:模糊匹配(允许部分匹配,如 word 匹配 words)。
- 行内字符搜索(快速定位)
- f{char}:跳转到当前行下一个 {char} 处(如 fx 跳转到下一个 x)。
- F{char}:向前搜索(同 f,但方向相反)。
- t{char}:跳转到 {char} 前的位置(如 tx 停在 x 前)。
- T{char}:向前搜索并停在 {char} 后。
- ; 和 ,:重复最近的 f/F/t/T 命令(; 同方向,, 反向)。
- 正则表达式搜索
-
/\vpattern:启用 “very magic” 模式(简化转义,如 \v\d+ 匹配数字)。
-
/\c 和 /\C:强制忽略/区分大小写(如 /example\c)。
-
常用元字符:
- ^ 行首,$ 行尾
- . 任意字符,\s 空白符,\d 数字
- * 重复零次或多次,+ 重复一次或多次
- 搜索设置与增强
- 忽略大小写:
- :set ignorecase(全局生效)或 /pattern\c(临时生效)。
- 高亮匹配::set hlsearch,用 :nohl 临时关闭高亮。
- 增量搜索::set incsearch(输入时实时显示匹配结果)。
- 搜索历史
- q/ 或 q?:打开搜索历史窗口,选择过去的搜索词。
- / + 上下箭头:浏览历史记录。
- 可视模式与搜索结合
- 选中文本后按 */#:直接搜索选中的内容。
- y 复制后按 / + Ctrl+R 0:粘贴剪贴板内容作为搜索词。
- 使用 gn/gN 快速操作
- gn:选中下一个匹配项(进入可视模式)。
- gN:选中上一个匹配项。
- 示例:dgn 删除下一个匹配项。
- 多文件搜索(需插件或内置命令)
- :vimgrep /pattern/ files:跨文件搜索(如 :vimgrep /error/ **/*.py)。
- :cn/:cp:在搜索结果间跳转。
快速移动
在 Vim 中实现更丝滑的移动行操作,可以通过以下几种方式优化你的工作流:
- 基本移动
- 上下移动:
j:向下移动一行。
k:向上移动一行。
5j 或 5k:向下或向上移动 5 行(数字可以替换为你需要的行数)。 - 行首和行尾:
0:移动到行首。
^:移动到行首的第一个非空白字符。
$:移动到行尾。 - 基于段落的移动:
{:跳转到上一个空行(段落开头)。
}:跳转到下一个空行(段落结尾)。
- 屏幕滚动
- 整页滚动:
Ctrl + f:向下滚动一整页。
Ctrl + b:向上滚动一整页。 - 半页滚动:
Ctrl + d:向下滚动半页。
Ctrl + u:向上滚动半页。 - 平滑滚动:
Ctrl + e:向下滚动一行(屏幕内容上移)。
Ctrl + y:向上滚动一行(屏幕内容下移)。
- 快速跳转
-
跳转到指定行:
:行号:例如 :50 跳转到第 50 行。
gg:跳转到文件第一行。
G:跳转到文件最后一行。 -
% 跳到匹配的括号
-
基于内容的跳转:
/{关键词}:搜索关键词并跳转,按 n 跳转到下一个匹配项,N 跳转到上一个匹配项。
*:跳转到光标所在单词的下一个匹配项。
#:跳转到光标所在单词的上一个匹配项。 -
代码跳转
– gd(跳转到定义)
– gi(跳转到实现)
– gf(跳转到引用的文件)
- 相对行号
- 启用相对行号可以更方便地跳转:
在 Vim 中运行 :set relativenumber,显示相对行号。
例如,按下 10j 可以向下移动 10 行,相对行号会显示每行与当前行的距离。
- 插件增强
-
使用插件可以大幅提升移动的丝滑感:
vim-smoothie:提供平滑滚动效果。
安装后,可以使用 Ctrl + d 和 Ctrl + u 实现平滑滚动。 -
easymotion:快速跳转到屏幕内的任意位置。
安装后,按下 <Leader><Leader>w 可以高亮显示所有单词的首字母,按下对应字母即可跳转。 -
idea 中aceJump插件
1.该插件使用的默认快捷键是Ctrl+;
第一步:使用快捷键Ctrl+;,然后输入一个字母(例如a)。
第二步:跳转(例如输入k)。然后就可以跳转到K标记的位置了
- 自定义映射
通过自定义快捷键实现更高效的移动,在 .vimrc 中添加以下配置:
" 使用 Ctrl + j/k 快速上下移动 5 行
nnoremap <C-j> 5j
nnoremap <C-k> 5k
" 使用 H 和 L 跳转到行首和行尾
nnoremap H ^
nnoremap L $
- 其他技巧
- 标记和跳转:
m{a-z}:在当前行设置标记(例如 ma 设置标记为 a)。
`a:跳转到标记 a 所在行。
第四部分 寄存器
vim剪切板和系统剪切板
- 这两个剪切板目前来看不要直接配置互通, 否则d,x,c等都会覆盖掉原有拷贝值,导致复制丢失。
set clipboard+=unnamedplus
两个剪切板也需要保持互通,当一个剪贴板,降低操作复杂度,配置只有复制动作才同步到系统剪贴板,可以通过自定义映射来实现
nnoremap y "+y
vnoremap y "+y
复制粘贴
- 复制单词/粘贴/选中替换/剪切单词并输入
nnoremap <Leader>c viw"+y
nnoremap <Leader>p "+p
nnoremap <Leader>v viw"+p
nnoremap <Leader>x viwc
inoremap <C-p> <C-r>+
第10章 复制与粘贴
第11章 宏
第五部分 模式
第12章 按模式匹配及按原义匹配
第13章 查找
第14章 替换
第15章 global命令
第六部分 工具
第16章 通过ctags建立索引,并用其浏览源代码
第17章 编译代码,并通过Quickfix列表浏览错误信息
第18章 通过grep、vimgrep以及其他工具对整个工程进行查找
第19章 自动补全
第20章 利用Vim的拼写检查器,查找并更正拼写错误
第21章 接下来干什么