Vim 学习速成:理解快捷键

Vim 学习速成

一、Vim 的优势

Vim 通过全键盘快捷键完成操作,长期使用效率高于依赖鼠标的编辑器(VS Code、Sublime Text 等)。类比竞技游戏:高阶操作绑定快捷键,规避鼠标移动带来的延迟;Vim 不需要做到全部快捷键最优,掌握前 20% 的常用功能,即可相比鼠标编辑器获得 80% 的效率提升。

学习误区:仅运行 vimtutor 练习一周后放弃,回归图形编辑器。

正确路径:在日常、非常规工作流中持续使用 Vim,而非只在固定场景使用。

同任务对比演示:修改 JSON 格式化 C 程序

任务目标:为缩进函数增加可配置缩进宽度参数,从固定 2 空格改为可传入数值。

  1. Vim 流程
    • 搜索定位函数声明 static void indent,在形参列表添加 int width
    • 修改 printf 格式化字符串,使用 %*s,由后续传入的 width 参数控制填充长度
    • 同步修改 print_json 函数签名,增加 width 参数
    • 修改 main:启用命令行参数解析,width 采用三元表达式,有入参则转换为整数,无入参默认值 2
    • 编译报错后,借助 quickfix 错误列表遍历报错位置,使用 . 重复上一次修改操作批量补全参数
    • 重新编译,验证传入不同宽度参数的输出效果
    • 全程手不离开主键位区,无需鼠标点击、窗口切换
  2. VS Code 流程
    • 查找、修改代码时需要多次鼠标点击、光标拖拽、窗口切换
    • 跳转编译错误需要 Ctrl+点击
    • 默认界面包含侧边文件树、状态栏、标题栏等冗余元素,可视代码区域更小
    • 手需要反复离开主键位区操作鼠标,单次修改可完成,但长期高频编辑损耗更高

二、Vim 的模式

Vim 以模式为运行框架,本部分覆盖普通模式(Normal) 、插入模式(Insert)

  • 普通模式:默认模式,用于光标移动、文本操作、命令执行
  • 插入模式:用于输入文本

不深入模式底层定义,优先掌握实操。

三、光标移动

3.1 水平移动

按键 作用
h 光标左移一格
l 光标右移一格
w 向前跳至下一个单词开头
b 向后跳至上一个单词开头
e 向前跳至当前单词末尾
[数字]w / [数字]b 一次性跳转指定数量单词
f{char} 本行向后查找字符 char,光标落在目标字符上
F{char} 本行向前查找字符 char,光标落在目标字符上
; 重复上一次 f/F 查找(同方向)
, 重复上一次 f/F 查找(反方向)
0 跳至本行首字符
$ 跳至本行末尾
^ 跳至本行第一个非空白字符

3.2 垂直移动

按键 作用
j 下移一行
k 上移一行
[数字]j / [数字]k 一次性上下跳转指定行数;配合相对行号使用体验更佳
Ctrl+d 向下翻半页
Ctrl+u 向上翻半页
} 跳到下一个段落(以空行分隔文本块)
{ 跳到上一个段落
gg 跳转到文件首行
G 跳转到文件末行
% 跳转到匹配的成对符号:() [] {}
/pattern 向下搜索文本 pattern,回车确认
n 跳到下一个搜索匹配项
N 跳到上一个搜索匹配项
[数字]n / [数字]N 一次性跳转多个匹配结果
Ctrl+c 退出搜索

尽量不使用方向键,避免手离开主键位区。

四、Vim 操作语法:动词 + 数量 + 名词(动作语法)

结构:动词 [数量] 动作对象

  • 动词:定义操作
    • d:删除(delete)
    • c:修改(change,删除目标内容并进入插入模式)
    • y:复制(yank)
  • 名词:文本范围/移动动作
  • .:重复上一次修改操作

示例

  • dw:删除当前单词
  • cw:修改当前单词
  • yw:复制当前单词
  • d3w:删除后面 3 个单词
  • c3w:修改后面 3 个单词
  • df{char}:删除到目标字符(包含该字符)
  • dt{char}:删除到目标字符(不包含该字符)

文本选择范围(inner / around,i / a)

  • i(inner):内部,不含包裹符号
  • a(around):包含包裹符号以及周边空白
快捷键 效果
diw 删除单词内部
daw 删除整个单词(含后方空格)
di( 删除括号内部内容
da( 删除括号+括号内全部内容
di{ / da{ 花括号块
di" / da" 双引号内文本
di' / da' 单引号内文本
dip 删除段落内部
dap 删除整个段落
dit 删除 HTML 标签内部内容
dat 删除 HTML 标签 + 内部全部内容

粘贴

  • p:粘贴到光标之后
  • P:粘贴到光标之前
    复制内容存入寄存器,可多次粘贴复用。

行操作

  • V:行可视模式,选中整行
  • Vyp:复制当前行,在下方粘贴,快速复制一行

五、缓冲区、文件浏览、跳转

  1. Netrw(Vim 内置文件浏览器)

    • :e . 打开目录浏览
    • 普通模式移动快捷键同样生效,回车进入文件/文件夹
  2. 缓冲区(buffer)

    • :ls 列出所有打开缓冲区
    • :bn 下一个缓冲区
    • :bp 上一个缓冲区
  3. 跳转历史

    • Ctrl+o:回到上一个跳转位置
    • Ctrl+i:前进到下一个跳转位置>

    依靠缓冲区与跳转历史,可替代文件树、标签页

LSP 配套快捷键

  • gd:跳转到标识符定义处
  • K:悬浮查看文档/类型信息
    Telescope(插件):Space ff 全局搜索文件

六、适用场景

Vim 不限于代码编辑:

  • 编辑各类配置文件(Wayland 合成器、DWM、locale 配置等)
  • Linux TTY 无图形界面环境,无鼠标可用
  • 日常纯文本、Markdown 文件查看修改

七、学习路线总结

  1. 抛弃方向键,全程使用 hjkl 移动光标
  2. 依次掌握移动、基础删除/修改、复制粘贴、. 重复操作
  3. 在真实工作流持续使用,而非单独刷教程
  4. 进阶内容(本教程未覆盖,后续进阶内容):查找替换、高级宏、插件配置等
  5. 目标:形成肌肉记忆,手保持在主键位区,减少鼠标切换开销

Vim 映射命令分类表

命令 模式范围 是否递归 说明
map Normal、Visual、Select、Operator-pending 是 多模式递归映射,范围较广,容易在意外模式下触发
noremap Normal、Visual、Select、Operator-pending 否 上述多模式的非递归版本
nmap Normal 是 普通模式递归映射
nnoremap Normal 否 普通模式非递归映射;自定义快捷键通常优先使用
vmap Visual、Select 是 可视/选择模式递归映射
vnoremap Visual、Select 否 可视/选择模式非递归映射
imap Insert 是 插入模式递归映射
inoremap Insert 否 插入模式非递归映射
cmap Command-line 是 命令行模式递归映射
cnoremap Command-line 否 命令行模式非递归映射
omap Operator-pending 是 操作符等待模式递归映射,如输入 d、y、c 后等待运动对象的阶段
map! Insert、Command-line 是 插入模式与命令行模式的递归映射
noremap! Insert、Command-line 否 插入模式与命令行模式的非递归映射

术语解释

  • <leader> :Vim 中的用户自定义前缀键,用于构造个人快捷键前缀。默认通常为 \,常见配置为 let mapleader = ","。例如 nnoremap <leader>w :w<CR> 表示在普通模式下按下 ,w 执行保存。
  • 寄存器 "+ :系统剪贴板寄存器,对应操作系统的 CLIPBOARD。"+y 将选中文本复制到系统剪贴板,"+p 从系统剪贴板粘贴。该功能要求 Vim 编译时启用 +clipboard。
  • <M-...> :Alt / Meta 组合键。例如 <M-F2> 表示 Alt+F2。
  • <C-...> :Control 组合键。例如 <C-c> 表示 Ctrl+C。
  • <CR> :回车键,等价于 Enter / Return。在映射中常用于提交 Ex 命令,如 :w<CR> 表示执行保存并确认。

使用建议

  • 自定义快捷键优先使用非递归形式:nnoremap、vnoremap、inoremap、cnoremap。
  • 避免使用 map 绑定普通快捷键,因其会在 Operator-pending 等模式下意外生效。
  • 需要与系统剪贴板交互时,使用 "+y、"+p,并确认 Vim 支持 +clipboard。

vimrc 配置片段


vim 复制代码
" =============================================================================
" 基础设置
" =============================================================================
set nocompatible          " 关闭 vi 兼容模式
set encoding=utf-8        " 文件编码
set fileencodings=utf-8,gbk,latin1
set number                " 显示行号
set relativenumber        " 显示相对行号
set cursorline            " 高亮当前行
set showmode              " 底部显示当前模式
set showcmd               " 显示未完成的命令
set hidden                " 允许隐藏未保存的缓冲区
set history=1000          " 命令历史记录数

" =============================================================================
" 缩进与空白
" =============================================================================
set tabstop=4             " Tab 显示宽度
set shiftwidth=4          " 自动缩进宽度
set softtabstop=4         " 编辑时 Tab 退格宽度
set expandtab             " Tab 转换为空格
set smartindent           " 智能缩进
set autoindent            " 保持上一行缩进

" =============================================================================
" 搜索设置
" =============================================================================
set hlsearch              " 高亮搜索结果
set incsearch             " 增量搜索
set ignorecase            " 搜索忽略大小写
set smartcase             " 含大写字母时区分大小写

" =============================================================================
" 界面与分割
" =============================================================================
set splitbelow            " 水平分割窗口在下方
set splitright            " 垂直分割窗口在右侧
set scrolloff=8

Reference

相关推荐
斐夷所非1 天前
Vim 交换文件处理、内容恢复、保存退出与权限提升
vim
by209994 天前
Linux 软件安装与 Vim 编辑
linux·经验分享·vim
FriendshipT8 天前
Vim 完整指南:从入门到高效编辑
linux·人工智能·编辑器·vim·1024程序员节
.道阻且长.8 天前
Linux 基本开发工具:编辑器vim,配置vim
linux·运维·服务器·职场和发展·编辑器·vim·1024程序员节
Rabitebla9 天前
【Linux底层原理】 工具篇(二):Vim 编辑器基础操作与简单配置
linux·c++·编辑器·vim
幸运小圣11 天前
fs 模块完全指南:文件读写、移动删除与文件夹操作(新手友好)【Node.js】
node.js·编辑器·vim
笨笨饿13 天前
#142_VS Code.map文件插件的用法
git·python·stm32·单片机·嵌入式硬件·物联网·vim
挖掘狂人14 天前
编程语言的六十年:一部做减法的历史
程序员·vim·编程语言
灯澜忆梦19 天前
【Linux】#7 | vi/vim 编辑器
linux·编辑器·vim