Vim 编辑器教程

Vim 是终端下最强大的文本编辑器。对于 C/C++ 程序员来说,在 SSH 远程服务器上写代码、快速修改配置文件、或是在 QEMU 裸机环境里没有 GUI 的时候,Vim 是唯一的选择。本教程以 Windows 用户使用 cmd 终端 为主线,附带 Linux/macOS 安装说明,并提供完整的 Vim 使用手册:快捷键大全、: 指令大全、.vimrc 配置详解,以及用 Vim 编辑系统配置文件的实战知识。


一、安装 Vim

1.1 Windows:下载并写入 PATH

方法一:winget(推荐,Windows 10/11 自带)

# 以管理员身份打开 PowerShell 或 cmd
winget install vim.vim

安装后重启终端即可在 cmd/PowerShell 中使用 vim

方法二:官方安装包

  1. 前往 vim.org 下载 “PC: MS-DOS and MS-Windows” 的安装包(gvim90.exe 或类似)
  2. 运行安装程序,务必勾选 “Create .bat files for command line use”(这步自动写入 PATH)
  3. 若忘记勾选,手动添加环境变量:
    :: 以管理员身份打开 cmd,将 Vim 安装目录加入 PATH(以默认路径为例)
    setx PATH "%PATH%;C:\Program Files (x86)\Vim\vim91" /M

方法三:Scoop / Chocolatey

scoop install vim          # Scoop 用户
choco install vim            # Chocolatey 用户

验证安装

vim --version | findstr /C:"Vi IMproved"

1.2 Linux

# Debian/Ubuntu
sudo apt install vim
 
# Arch Linux
sudo pacman -S vim
 
# Fedora
sudo dnf install vim

多数 Linux 发行版已预装 vimvi(Vi 兼容版)。

1.3 macOS

brew install vim

macOS 自带 vim,但版本较旧,Homebrew 可获取最新版。


二、3 分钟快速入门

2.1 打开 Vim

vim                :: 空白编辑器
vim hello.c        :: 打开已有文件(不存在则新建)
vim +69 hello.c    :: 打开并跳到第 69
vim -R readme.md   :: 只读模式打开(view 命令等效)

2.2 编辑并保存

Vim 有多个 模式(Mode),新手最大的困惑都源于此。你只需求记住 3 个核心模式

模式进入方式用途光标形状(典型)
Normal(普通模式)Esc浏览、复制、粘贴、删除方块
Insert(插入模式)i / a / o输入文字竖线
Command-line(命令模式):保存、退出、搜索替换

第一次使用 Vim 的新手三步走

vim test.txt          " 1. 打开
i                     " 2. 按 i 进入 Insert 模式 → 输入任意文字
<Esc>                 " 3. 按 Esc 回到 Normal 模式
:wq                   " 4. 输入 :wq 保存并退出

三、模式详解

3.1 Normal 模式(默认)

启动 Vim 后你就在 Normal 模式。所有移动、删除、复制、粘贴快捷键都从 Normal 模式发出。

3.2 Insert 模式(插入文字)

从 Normal 模式进入 Insert 模式:

快捷键效果
i在光标前插入
a在光标后插入(append)
I行首插入
A行尾插入
o在下方新开一行并插入
O在上方新开一行并插入
s删除光标处字符并插入
S / cc删除整行并插入
cw删除到词尾并插入(change word)

EscCtrl+[ 回到 Normal 模式。

3.3 Visual 模式(选择文字)

快捷键效果
v字符级选中
V行级选中
Ctrl+v块选中(列编辑)

选中后可用 y(复制)、d(删除)、>(缩进)、<(反缩进)、=(自动格式化) 操作。

3.4 Command-line 模式(执行命令)

Normal 模式下按 : 进入。常用 : 指令见后文「指令大全」。


四、快捷键大全

4.1 光标移动

4.1.1 基本移动

快捷键效果
h / j / k / l左 / 下 / 上 / 右
5j / 10l数字前缀:向下 5 行 / 向右 10 列
gj / gk在自动换行的长行内按屏幕行向下 / 向上移动
Enter / +移到下一行行首
-移到上一行行首
_移到当前行第一个非空白字符(同 ^
|移到当前行第 1 列
gm移到屏幕行中点

4.1.2 按词移动

快捷键效果
w / W下一个词 / 下一个「大词」词首(WORD,仅以空白分隔)
b / B上一个词 / 上一个大词词首
e / E当前词 / 大词词尾
ge / gE上一个词 / 大词词尾
3w向后移动 3 个词

词(word)由字母、数字、下划线组成;大词(WORD)由非空白字符组成。例如 foo-bar 是两个词、一个大词。

4.1.3 行内与括号跳转

快捷键效果
0行首(第 1 列)
^本行第一个非空白字符
$行尾
g_行尾最后一个非空白字符
%跳转到匹配的括号(( ) [ ] { }),再按一次返回
[( / ])跳到上一个 / 下一个未匹配的 ( / )
[{ / }]跳到上一个 / 下一个未匹配的 { / }

4.1.4 段落、句子与代码块

快捷键效果
{ / }跳到上一个 / 下一个空行(段落边界)
( / )跳到上一个 / 下一个句子
[[ / ]]跳到上一个 / 下一个函数或代码块开头(C 语言常用)
[] / ][跳到函数或代码块结尾
[m / ]m跳到方法/类定义的开头与结尾(需 matchit 插件增强)

4.1.5 文件与屏幕跳转

快捷键效果
gg文件开头
G文件末尾
42G:42跳到第 42 行
42%跳到文件的 42% 处
H / M / L屏幕顶部 / 中部 / 底部(High/Middle/Low)
Ctrl+f / Ctrl+b向下 / 向上翻整屏
Ctrl+d / Ctrl+u向下 / 向上翻半屏
Ctrl+e / Ctrl+y向下 / 向上滚动一行(光标不动)
zz / zt / zb把当前行放到屏幕中央 / 顶部 / 底部
z.当前行居中并移到行首

4.1.6 字符查找

快捷键效果
f{char}光标后查找字符(find),如 fa 找下一个 a
F{char}光标前查找字符
t{char}光标后查找字符,停在字符前(till)
T{char}光标前查找字符,停在字符后
; / ,重复 / 反向前一次的 f/t/F/T 查找
3fa查找第 3 个 a

4.1.7 跳转历史与修改历史

快捷键效果
Ctrl+o回到上一个跳转位置(jumplist 后退)
Ctrl+i / Tab前进到下一个跳转位置
g;回到上一次修改的位置(changelist 后退)
g,前进到下一次修改的位置
:jumps查看跳转列表
:changes查看修改列表

4.1.8 标记(Marks)

快捷键效果
ma在当前行设置标记 a(a-z 为文件内标记)
`a跳到标记 a 的精确位置
'a跳到标记 a 所在行的行首
跳回上一次跳转前的位置
''跳回上一次跳转所在行的行首
'.跳到上次修改的位置
`"跳到上次退出编辑时的位置
mA设置全局标记 A(A-Z 跨文件可用)
:marks查看所有标记

4.2 编辑操作

4.2.1 删除

快捷键效果
x删除光标处字符(等于 dl
X删除光标左边字符(退格)
3x删除 3 个字符
dd删除(剪切)整行,3dd 删 3 行
dw / dW删除到词尾 / 大词尾
db删除到词首
de删除到当前词尾(保留空格)
d$ / D删除到行尾
d0删除到行首
d^删除到第一个非空白字符
dG删除到文件末尾
dgg删除到文件开头
diw / daw删除词内 / 词及周围空格(文本对象,见 4.6)
dap删除整个段落
:g/pattern/d删除所有匹配行

4.2.2 复制(Yank)与粘贴

快捷键效果
yy / Y复制整行,3yy 复制 3 行
yw复制一个词
y$复制到行尾
y0复制到行首
yG复制到文件末尾
ygg复制到文件开头
yap复制整个段落
p粘贴到光标后(行级内容粘贴到下一行)
P粘贴到光标前
3p粘贴 3 次
]p粘贴并自动匹配当前行缩进
gp / gP粘贴后光标停在粘贴内容末尾
:t N / :copy N复制当前行到第 N 行后
:t.复制当前行到下一行(比 yyp 更快)
:t$复制当前行到文件末尾

4.2.3 修改(Change)与替换

快捷键效果
r{char}替换光标处字符为 {char}
3r{char}替换 3 个字符
R进入替换模式(覆盖输入),Esc 退出
cc删除整行并进入插入模式
C删除到行尾并进入插入模式
cw / cW删除到词尾并进入插入模式
ciw / caw修改词内 / 词及空格(文本对象)
ci" / ci(修改引号 / 括号内的内容
s删除光标处字符并进入插入模式
S删除整行并进入插入模式(等于 cc
~切换光标处字符大小写,3~ 切换 3 个
g~w切换词的大小写
guw / gUw词转小写 / 大写
g~~切换整行大小写
gUU / guu整行大写 / 小写

4.2.4 撤销、重做与重复

快捷键效果
u撤销
U撤销当前行的所有修改(再按一次恢复)
Ctrl+r重做(redo)
.重复上一次修改操作(Vim 最强大的按键)
3.重复 3 次
g; / g,在修改历史中后退 / 前进
:undolist查看撤销树分支
:earlier 10m回到 10 分钟前的状态
:later 5m前进到 5 分钟后的状态

4.2.5 缩进与格式化

快捷键效果
>> / <<右缩进 / 左缩进当前行
3>>缩进 3 行
>j / <j缩进当前行与下一行(可组合为 >2j
==自动格式化当前行
gg=G全文件自动格式化
= + 移动对移动范围格式化,如 =ap 格式化段落
gq + 移动按 textwidth 重排文本,如 gqap
J合并下一行到当前行(带空格)
gJ合并下一行(不带空格)

4.2.6 排序与过滤

指令效果
:sort按字典序排序选中行或全文
:sort!逆序排序
:sort u排序并去重
:sort n按数字大小排序
:%!sort用外部 sort 过滤全文
:%!column -t对齐表格列
:'<,'>!python3 -m json.tool格式化选中的 JSON

4.3 搜索

4.3.1 基本搜索

快捷键效果
/pattern向下搜索
?pattern向上搜索
n下一个匹配(同方向)
N上一个匹配(反方向)
*搜索当前光标下单词(向下,全词匹配)
#搜索当前光标下单词(向上)
g* / g#搜索当前光标下单词(不要求全词匹配)
q/ / q?打开搜索历史窗口,可编辑后回车执行

4.3.2 搜索语法(正则)

写法效果
/\<word\>全词匹配 word
/\d\+连续数字
/^foo行首的 foo
/bar$行尾的 bar
/\cWord忽略大小写搜索 Word
/\CWord强制区分大小写搜索 Word
/\v(foo|bar)very magic 模式,正则语法接近 PCRE
/foo.*bar贪婪匹配
/\zs / /\ze设定匹配起点 / 终点
:%s/foo/bar/ 中的 \1 \2引用捕获分组

4.3.3 搜索设置

指令效果
:set incsearch输入时实时高亮第一个匹配
:set hlsearch高亮所有匹配
:noh临时关闭高亮
:set ignorecase忽略大小写
:set smartcase含大写时自动区分大小写
:set wrapscan搜到文件末尾后回到开头(默认开)

4.3.4 搜索结果导航(Quickfix)

指令效果
:grep -r pattern .用外部 grep 搜索
:vimgrep /pattern/ **/*.c内置多文件搜索
:copen / :cclose打开 / 关闭搜索结果窗口
:cnext / :cprev下一个 / 上一个搜索结果
:cfirst / :clast第一个 / 最后一个结果
:lopen / :lnext位置列表(当前窗口)搜索

替换命令的完整语法见 5.2 搜索替换

4.4 多文件、缓冲区、窗口与标签页

4.4.1 缓冲区(Buffer)

快捷键效果
:e filename编辑新文件
:ls / :buffers列出所有缓冲区
:bn / :bnext下一个缓冲区
:bp / :bprev上一个缓冲区
:b N切换到第 N 个缓冲区
:b filename按文件名切换到缓冲区(支持 Tab 补全)
:bd关闭当前缓冲区
:bufdo %s/old/new/g对所有缓冲区执行命令

4.4.2 窗口分屏

快捷键效果
:split / :sp水平分屏
:vsplit / :vs垂直分屏
:sp filename / :vs filename分屏并打开文件
Ctrl+w s / Ctrl+w v水平 / 垂直分屏(快捷键)
Ctrl+w h/j/k/l切换到左 / 下 / 上 / 右窗口
Ctrl+w w轮流切换窗口
Ctrl+w W反向轮流切换
Ctrl+w q / Ctrl+w c关闭当前窗口
Ctrl+w o只保留当前窗口(关闭其他)
Ctrl+w =均分窗口大小
Ctrl+w + / Ctrl+w -增加 / 减少窗口高度
Ctrl+w > / Ctrl+w <增加 / 减少窗口宽度
Ctrl+w r旋转窗口布局
Ctrl+w x与下一个窗口交换位置
Ctrl+w H/J/K/L把当前窗口移到最左 / 下 / 上 / 右
Ctrl+w T把当前窗口移成新标签页

4.4.3 标签页(Tab)

快捷键效果
:tabnew / :tabnew file新建标签页 / 并在其中打开文件
:tabclose / :tabc关闭当前标签页
:tabonly / :tabo只保留当前标签页
:tabnext / gt下一个标签页
:tabprev / gT上一个标签页
:tabfirst / :tablast第一个 / 最后一个标签页
:tabmove N把当前标签页移到第 N 位
:tabs列出所有标签页

经验:缓冲区对应文件,窗口对应视口,标签页对应布局集合。日常切换用 buffer 最快,需要对照查看时用分屏。

4.5 寄存器与宏

快捷键效果
"{char}y复制到指定寄存器 {char}
"{char}p从指定寄存器 {char} 粘贴
"*y / "+y复制到系统剪贴板
"*p / "+p从系统剪贴板粘贴
qaq录制宏:开始(qa) → 操作 → 结束(q)
@a执行寄存器 a 中的宏
@@重复上一次执行的宏
5@a执行宏 5 次

4.6 文本对象(Text Objects)

快捷键含义
ciw删除当前词并插入(change inner word)
ci"删除双引号内的内容并插入
ci( / ci)删除括号内的内容并插入
diw删除一个词
da"删除双引号及内容(a = around)
yi"复制引号内的内容
vi{选中花括号内的内容

规则:{operator}{i/a}{text-object} — i = inner, a = around

4.7 高级编辑

快捷键效果
.重复上一次修改
Ctrl+a数字 +1
Ctrl+x数字 -1
g~w切换词的大小写
guw词转为小写
gUw词转为大写
gq段落格式化为固定宽度
za折叠/展开(编程代码块)

五、: 指令大全

5.1 文件操作

指令效果
:w保存
:w filename另存为
:q退出
:q!强制退出(不保存)
:wq:x保存并退出
:e filename打开文件
:e!重新加载当前文件(放弃修改)
:r filename将文件内容插入当前光标位置
:r !command将 Shell 命令输出插入当前光标位置

5.2 搜索替换

指令效果
:%s/old/new/g全文替换
:%s/old/new/gc全文替换(每次确认)
:10,20s/old/new/g第 10-20 行范围内替换
:s/old/new/g仅当前行替换
:vimgrep /pattern/ *.c在多文件中搜索
:copen打开搜索结果窗口

5.3 行号与显示

指令效果
:set nu显示行号
:set nonu隐藏行号
:set rnu相对行号(光标为 0,上下以距离标注)
:set list显示不可见字符(Tab = ^I,行尾 = $)
:set wrap / :set nowrap启用/禁用自动换行
:set hlsearch搜索高亮
:noh临时关闭搜索高亮
:set paste粘贴模式(禁用自动缩进)
:set mouse=a启用鼠标支持

5.4 缩进与 Tab

指令效果
:set tabstop=4Tab 显示宽度
:set shiftwidth=4缩进宽度
:set expandtabTab 转为空格
:set noexpandtab保留 Tab 制表符
:retab将现有 Tab/空格按当前设置转换
:set autoindent自动缩进

5.5 窗口与 Tab 页

指令效果
:split / :sp水平分屏
:vsplit / :vs垂直分屏
:tabnew新建标签页
:tabclose关闭当前标签页
:tabnext / :tabn下一个标签页
:tabprev / :tabp上一个标签页
:tabs列出所有标签页

5.6 外部命令

指令效果
:!command执行外部命令(如 :!gcc % 编译当前文件)
:!重复上一次外部命令
:shell打开子 Shell(exit 返回 Vim)
:terminal在 Vim 内打开终端(Neovim/Vim 8+)

5.7 帮助

指令效果
:help打开帮助主页
:help :w查看 :w 命令的帮助
:help i_<Esc>查看 Insert 模式中 Esc 的帮助
:help usr_toc用户手册目录

5.8 编程相关

指令效果
:make运行 make 并跳转到第一个错误
:cnext / :cn下一个编译错误
:cprev / :cp上一个编译错误
:!gcc % -o %< && ./%<编译并运行当前 C 文件
:set syntax=c设置语法高亮为 C
:set filetype=c设置文件类型
:!python3 %运行当前 Python 文件

六、.vimrc 基础配置

在用户主目录创建 .vimrc(Windows 为 %USERPROFILE%\_vimrc,Linux/macOS 为 ~/.vimrc):

" 基础设置
set number              " 显示行号
set relativenumber      " 相对行号
set tabstop=4           " Tab 宽度
set shiftwidth=4        " 缩进宽度
set expandtab           " Tab 转空格
set autoindent          " 自动缩进
set hlsearch            " 搜索高亮
set incsearch           " 增量搜索
set ignorecase          " 搜索忽略大小写
set smartcase           " 包含大写时区分大小写
set mouse=a             " 启用鼠标
set clipboard=unnamed   " 系统剪贴板
 
" 高亮光标行
set cursorline
 
" 由文件类型决定缩进
filetype plugin indent on
 
" 快捷键:<Leader> 默认是 \
let mapleader = " "
nnoremap <Leader>w :w<CR>       " 空格+w 保存
nnoremap <Leader>q :q<CR>       " 空格+q 退出
nnoremap <Leader>so :so %<CR>   " 空格+so 重新加载配置文件

七、与 C/C++ 开发的配合

Linux 下使用 Vim 开发 C/C++ 的最简配置:

# 安装插件管理器 vim-plug
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

.vimrc 中添加:

call plug#begin()
Plug 'neoclide/coc.nvim', {'branch': 'release'}   " 代码补全(LSP)
Plug 'vim-airline/vim-airline'                     " 状态栏美化
Plug 'preservim/nerdtree'                          " 文件浏览器
Plug 'junegunn/fzf.vim'                            " 模糊搜索
call plug#end()
 
" 安装 coc-clangd(Vim 内执行)
" :CocInstall coc-clangd

编译运行快捷键:

" F5 编译并运行当前 C 文件
autocmd FileType c nnoremap <F5> :w<CR>:!gcc % -o %< -Wall -Wextra -g -std=c11 && ./%<<CR>

更多终端开发环境配置参考 C 教程环境配置Python 快速入门


八、速查卡

分类快捷键效果
模式切换i / Esc / :插入 / 普通 / 命令模式
移动h j k l左 下 上 右
移动w / b词首 / 词尾
移动0 / $ / ^行首 / 行尾 / 首个非空
移动gg / G / :N文件头 / 文件尾 / 第 N 行
删除x / dd删字符 / 删行
复制yy / p复制行 / 粘贴
撤销u / Ctrl+r撤销 / 重做
搜索/word / n / N搜索 / 下一匹配 / 上一匹配
保存退出:w / :q / :wq保存 / 退出 / 保存并退出
替换:%s/old/new/g全文替换
分屏:sp / :vs水平 / 垂直分屏
窗口切换Ctrl+w h j k l窗口间移动
q aq / @a录制宏 / 执行宏

九、现代 Vim 上位替代

Vim 在 Linux 开发中广受欢迎,熟练之后操作轻快流畅,但缺点是学习曲线陡峭、配置耗时(原生 Vim 对标现代 IDE 需要自己拼装补全、语法高亮、文件树)。以下按”从易到难”给出替代方案。

1. IDE 内置 Vim 模式

主流 IDE 与编辑器都提供了 Vim 键位模拟插件,装上之后编辑习惯无缝迁移,同时保留 IDE 的补全、调试、重构能力:

宿主插件说明
VS CodeVim(vscodevim.vim最接近原生 Vim 的模拟,社区最活跃
IntelliJ / PyCharm / CLionIdeaVimJetBrains 官方支持,完美融合 IDE 快捷键
Visual StudioVsVim微软官方维护
Chrome / Edge 浏览器Vimium浏览器内用 hjkl 操作网页(同思路)
Excel / 其他不宜强上键位冲突大于收益

装上插件即可获得原生 Vim 约九成的操作体验(hjkl 移动、dd/yy、宏、寄存器都可用),且零配置——这是最推荐的入门路径。

2. Neovim(nvim)

Neovim 脱胎于 Vim,解决了 Vim 二十多年积累的设计包袱:

优势说明
异步架构插件不再卡死界面,LSP 补全流畅
Lua 配置用 Lua 代替 vimscript 写配置,现代且可控
内置 LSP 客户端原生支持补全、跳转、诊断(对标 IDE 核心功能)
内置终端:terminal 在编辑器内开终端
社区生态Telescope、Treesitter、NvimTree 等已成事实标准

3.1 一键配置:LazyVim

原生 Neovim 仍然要自己配,但社区已经给出”装上就用”的整合包。LazyVim 是目前最流行的 Neovim 一键配置发行版:

  • 基于 lazy.nvim 插件管理器,插件按需加载
  • 开箱即用:文件树、模糊搜索、LSP 补全、Git 集成、主题
  • 覆盖 Python / C/C++ / Go / Rust / 前端等主流语言
  • 安装后基本不需要额外配置,快捷键以 <leader> 前缀组织、高度可查

3.2 作者的 ARKVim 项目

作者自身就是 LazyVim 重度用户,并基于它做了针对性定制,开源项目 ARKVim

特性说明
项目地址https://github.com/missercatos/ARKVim
基础脱胎于 LazyVim,保留其稳定插件体系
快捷编译运行一键编译运行当前文件(针对 C / C++ 优化)
快捷键扩展追加大量高频操作快捷键,减少按键次数
多语言支持Python、C/C++、Java、Go、Rust、Lua、Ruby、HTML、CSS、JS 全系列插件
个性化作者日常使用的主题、键位、优化调参

如果你打算长期用 Neovim,建议直接 clone 作者的配置体验一下,再按需增删:git clone <项目地址> ~/.config/nvim,然后打开 nvim 等待插件安装完成即可。

3. 其他现代替代

工具特点适合谁
ZedRust 写的高性能编辑器,内置 AI 与协作追求速度与现代化的开发者
Helix内置 LSP、免配置、模式编辑(与 Vim 略异)想换新手感的人
Emacs(evil-mode)Vim 键位 + Emacs 生态,可配置性天花板愿意花时间深度定制的用户
Sublime Text轻量、启动快,Vintage 模式模拟 Vim轻量编辑 + 一点 Vim 键位

4. 选择建议

你的情况推荐
刚接触 Vim,只想在 VS Code 里体验VS Code + Vim 插件
日常主力是 JetBrains IDEIdeaVim
想深入终端编辑器,愿意折腾配置Neovim + LazyVim(或直接 ARKVim)
重度自定义、千层饼配置Emacs + evil-mode / 自研 nvim 配置
佛系,够用就好原生 Vim 已足够,无需迁移