# Vim 高阶用法实战笔记:从能用好到用得爽
## 一、为什么还要学 Vim这几年 IDE 越来越强大VSCode 加上插件基本能搞定一切。但作为驱动工程师经常要 SSH 到服务器上改代码、调设备树、看内核日志那些场景下 Vim 是唯一确定可用的编辑器。我之前的状态是能用但不爽。移动靠方向键删除用退格复制粘贴全靠鼠标。最近趁项目间隙把 Vim 的文档和教程啃了一遍才发现以前的操作效率低得离谱。这篇文章整理的是我觉得**最值得花时间掌握的技巧**不是那种网上随处可见的基础教学。## 二、模式思维Vim 的灵魂很多人学 Vim 学不下去是因为没理解“模式”这件事。Vim 不是那种“输入什么就显示什么”的编辑器它把键盘分成了不同“语境”| 模式 | 什么时候用 | 怎么进 | 怎么出 || :--- | :--- | :--- | :--- || **普通模式** | 浏览代码、复制删除、跳转 | 默认就是 | 按 Esc 从任何模式回来 || **插入模式** | 写代码 | i a o I A O | Esc || **可视化模式** | 选中一块代码操作 | v V Ctrlv | Esc || **命令模式** | 保存、搜索、替换 | : | Enter 或 Esc |心法很简单**在普通模式里移动在插入模式里写在可视模式里选在命令模式里操作**。不要一直待在插入模式那是很多人的误区。## 三、移动让光标飞起来这部分是我最大的收获。以前用方向键一格一格挪现在可以“指哪打哪”。### 3.1 别碰方向键把左手放回 h j k l 上刚开始别扭一周后就回不去了- h 左、j 下、k 上、l 右更进阶的是 w b ew 跳到下一个单词开头b 往回跳e 跳到单词结尾。读代码的时候配合着用效率提升非常明显。### 3.2 行内快速定位0 到行首$ 到行尾^ 到行首第一个非空字符。这些属于基础不多说。重点推荐 f 和 t- f{char}跳到当前行下一个 {char} 的位置- t{char}跳到当前行下一个 {char} 的前一位比如有一行 status read_register(REG_ADDR);想跳到 read_register 的开头直接按 fr 就到了不用按好几下 w。### 3.3 跨文件跳转gg 到文件头G 到文件尾:42 跳到第 42 行。% 在括号之间来回跳写 C 代码的时候找匹配大括号非常方便。Ctrlo 和 Ctrli 来回跳转看代码的时候顺着调用链跳进去看完一个 Ctrlo 就能回来。## 四、编辑组合拳才是精髓Vim 最强的不是某个快捷键而是“动词 名词”的组合逻辑。d 是删除deletey 是复制yankc 是修改change。这三个动词跟不同的移动命令组合- dw 删除一个单词- d$ 删到行尾- d0 删到行首- dG 删到文件末尾- di( 删掉括号里的内容**强烈推荐**i 表示 inside- da( 删掉括号以及里面的内容a 表示 around- ci 修改双引号里的内容- yip 复制当前段落这套组合学会后编辑代码的感觉从“一个字一个字敲”变成了“一块一块挪”。## 五、可视模式批量操作的大杀器v 进入字符选择V 选整行Ctrlv 列选择。列选择是我之前完全不知道的功能知道了以后直接封神。**场景 1给多行加注释**Ctrlv 选中第一列按 I 输入 // 按 Esc所有选中的行都加上了注释。加 # 也一样。**场景 2对齐操作**Ctrlv 选中一列按 d 删除按 I 插入新内容。**场景 3批量缩进**V 选多行按 缩进按 取消缩进。按 . 可以重复上一次缩进操作。## 六、搜索与替换改代码就像做手术### 6.1 搜索/pattern 向下搜?pattern 向上搜。搜完之后 n 下一个N 上一个。* 和 # 直接搜索光标下的单词看代码的时候定位符号定义极其顺手。默认搜完会高亮:noh 取消高亮我把它映射到了 F5。### 6.2 替换:s/old/new/g 替换当前行所有。加 % 变成 :%s/old/new/g 替换整个文件。更实用的是范围替换- :10,20s/old/new/g —— 只换 10 到 20 行- :,s/old/new/g —— 只换可视模式选中的区域- :%s/old/new/gc —— 每个替换都问一下确认后再换### 6.3 正则替换驱动开发很常用改设备树或者给变量批量改名的时候正则替换能省很多事- :%s/\(.*\)_old/\1_new/g —— 把 xxx_old 改成 xxx_new- :%s/^/ / —— 每行开头加 4 个空格## 七、宏录制把重复工作自动化这个功能我以前知道但一直没用直到某次要给 30 多个函数加日志打印录了个宏一键搞定。**操作步骤**1. qa —— 开始录制到寄存器 a2. 做一系列操作比如加一行 printk3. q —— 停止录制4. a —— 执行一次5. 100a —— 执行 100 次**实战例子**给每行末尾加逗号- qa 开始录- A, 行尾加逗号- j 下一行- q 停止- 100a 批量执行调试驱动的时候经常要批量改日志宏或者寄存器操作录一个宏用 a 反复执行效率提升非常夸张。## 八、多文件与窗口别在一个文件里憋着看内核代码的时候经常要同时看好几个文件窗口管理必须顺手。### 8.1 窗口分割- :sp 水平分屏- :vsp 垂直分屏- Ctrlw w 切换窗口- Ctrlw h/j/k/l 往指定方向切我习惯把 Ctrlw 改成单键映射看下面的配置部分切换起来快很多。### 8.2 标签页- :tabnew 新标签- gt 下一个标签- gT 上一个标签### 8.3 Buffer 管理:ls 看看开了哪些文件:b 2 切到第 2 个:bd 关掉当前。## 九、我的 .vimrc 核心配置这几条是我最近一直在用的不花哨但很实用vim 显示相关set numberset relativenumber 相对行号配合 10j 10k 跳转set hlsearchset incsearch 缩进相关驱动代码常用 4 空格缩进set tabstop4set shiftwidth4set expandtab 快捷键nnoremap C-s :wCR 顺手保存nnoremap F5 :nohlsearchCRnnoremap Leaderv :vsp ~/.vimrcCRnnoremap Leaders :source ~/.vimrcCR 窗口切换把 Ctrlw 映射成单键nnoremap C-h C-whnnoremap C-j C-wjnnoremap C-k C-wknnoremap C-l C-wl## 十、驱动开发场景实战| 场景 | 操作 || :--- | :--- || 改设备树属性 | ci{ 直接改括号里的内容 || 批量加调试打印 | 录宏 qa o printk(...); j q 然后 50a || 搜索函数调用 | * 搜当前函数名n 一个个看 || 批量改寄存器名 | :%s/REG_OLD/REG_NEW/g || 查看结构体定义 | Ctrl]需要 ctags || 列选改多个宏 | Ctrlv 选中列c 批量改 |## 十一、写在最后Vim 的学习曲线确实陡但不需要一次学完所有功能。我的建议是先记住 h j k l、w b e、dw、yy、p、/、:%s 这几个最核心的在日常使用中慢慢扩展。每遇到一个重复性的操作就问问自己“Vim 有没有更快的方式”——这个过程本身就是最好的学习。如果刚接触 Vim可以装个 vimtutor 命令花半小时过一遍。然后回来再看这篇文章感受会完全不同。 最后说一句Vim 不是操作系统它只是编辑器。把时间花在学操作上而不是折腾配置和插件上才是正途。---你的 Vim 配置有什么独门技巧吗欢迎在评论区分享交流