VIM常用命令与配置教程

vim 的模式

vim有多种运行模式,不同模式下按键含义不同。

模式介绍

模式 进入方式 用途
普通模式 启动默认;按 Esc 移动、删除、复制、粘贴
插入模式 i I a A o O 输入文字
可视模式 v V Ctrl-v 选择文本块
命令模式 : / ? 执行命令、搜索
替换模式 R 覆盖输入
终端模式 :terminal 在 vim 内运行终端

按 Esc 可从大多数模式回到普通模式。


启动与退出

命令 说明
vim file 打开文件
:w 保存
:q 退出
:wq 保存并退出
:x 保存并退出(仅当有修改)
:q! 强制退出不保存
ZZ 保存并退出
ZQ 强制退出
:e! 重新加载文件,放弃修改
:saveas newfile 另存为

移动光标

基本移动

按键 说明
h j k l 左、下、上、右
w / W 下一个单词 / 下一个以空格分隔的单词
b / B 上一个单词 / 上一个以空格分隔的单词
e / E 单词末尾
0 行首
^ 行首第一个非空字符
$ 行尾
gg 文件开头
G 文件末尾
:n 跳到第 n 行
nG 跳到第 n 行
Ctrl-f 下一页
Ctrl-b 上一页
Ctrl-d 下半页
Ctrl-u 上半页
H M L 屏幕高、中、低
{ } 上一段、下一段
% 匹配括号
f{char} 行内向右查找字符
F{char} 行内向左查找字符
t{char} 向右直到字符前
T{char} 向左直到字符前
; 重复上次 f/F/t/T
, 反向重复上次 f/F/t/T

搜索跳转

命令 说明
/pattern 向下搜索
?pattern 向上搜索
n 下一个匹配
N 上一个匹配
* 向下搜索光标下单词
# 向上搜索光标下单词
:noh 取消搜索高亮
:set hlsearch 开启搜索高亮
:set incsearch 增量搜索
:set ignorecase 忽略大小写
:set smartcase 智能大小写

跳转与标记

命令 说明
Ctrl-o 跳回上一个位置
Ctrl-i 跳到下一个位置
'' 跳回上次跳转位置
m{a-z} 设置标记
'{a-z} 跳转到标记
gd 跳到局部定义
gD 跳到全局定义
Ctrl-] 跳转到标签
Ctrl-t 返回标签
[[ ]] 函数开头、结尾

编辑与修改

插入

命令 说明
i 光标前插入
I 行首插入
a 光标后插入
A 行尾插入
o 下方新行插入
O 上方新行插入

删除

命令 说明
x 删除光标处字符
X 删除光标前字符
dd 删除整行
dw 删除一个单词
d$ / D 删除到行尾
d0 删除到行首
dgg 删除到文件开头
dG 删除到文件末尾
:g/pattern/d 删除匹配行
:v/pattern/d 删除不匹配行

修改

命令 说明
r 替换一个字符
R 进入替换模式
cc 修改整行
cw 修改一个单词
c$ / C 修改到行尾
~ 切换大小写
J 合并下一行
u 撤销
Ctrl-r 重做
. 重复上次操作

复制粘贴

命令 说明
yy 复制整行
yw 复制一个单词
y$ 复制到行尾
p 粘贴到光标后
P 粘贴到光标前
dd 剪切整行
"+y 复制到系统剪贴板
"+p 从系统剪贴板粘贴

缩进

命令 说明
>> 当前行右缩进
<< 当前行左缩进
> 可视模式右缩进
< 可视模式左缩进
gg=G 全文自动缩进
= 可视模式自动缩进

可视模式

命令 说明
v 字符可视模式
V 行可视模式
Ctrl-v 块可视模式
o 切换选择端点
d / y / c 删除 / 复制 / 修改选中
> / < 缩进选中
U / u 选中转大写 / 小写
:sort 排序选中行

搜索与替换

基本替换

命令 说明
:s/old/new/ 当前行替换第一个
:s/old/new/g 当前行全部替换
:%s/old/new/g 全文替换
:%s/old/new/gc 全文替换并确认
:n,m s/old/new/g 第 n 到 m 行替换
:.,$s/old/new/g 当前行到文件末尾替换
:%s/old/new/gi 忽略大小写替换

常用替换示例

所有 { 后面添加换行和空格:

1
:%s/{/{\r /g

所有 } 前后添加换行:

1
:%s/}/\r}\r /g

删除行尾空格:

1
:%s/\s\+$//e

删除空行:

1
:g/^$/d

统计匹配次数:

1
:%s/pattern//gn

分屏与标签

分屏

命令 说明
:sp file 水平分屏
:vsp file 垂直分屏
Ctrl-w h/j/k/l 切换到左/下/上/右窗口
Ctrl-w w 循环切换窗口
Ctrl-w = 所有窗口等宽等高
Ctrl-w _ 最大化当前窗口高度
Ctrl-w \| 最大化当前窗口宽度
:close 关闭当前窗口
:only 只保留当前窗口

标签页

命令 说明
:tabnew 新建标签页
:tabnew file 在新标签页打开文件
gt 下一个标签页
gT 上一个标签页
:tabclose 关闭当前标签页
:tabonly 只保留当前标签页

寄存器与宏

寄存器

命令 说明
"a 使用寄存器 a
"+ 系统剪贴板
"* 系统选择缓冲区
:reg 查看所有寄存器
"0p 粘贴最近复制的内容

宏

命令 说明
qa 开始录制宏到寄存器 a
q 停止录制
@a 播放宏 a
@@ 重复上次播放的宏
5@a 播放宏 a 五次

折叠

命令 说明
zf 创建折叠
zo 打开折叠
zc 关闭折叠
za 切换折叠
zR 打开所有折叠
zM 关闭所有折叠
:set foldenable 启用折叠
:set foldmethod=indent 按缩进折叠
:set foldmethod=syntax 按语法折叠
:set foldmethod=marker 按标记折叠
:set foldlevel=99 设置折叠层级

文件与缓冲区

命令 说明
:e file 打开文件
:ls 列出缓冲区
:bnext / :bn 下一个缓冲区
:bprev / :bp 上一个缓冲区
:bd 关闭缓冲区
:b file 切换到指定缓冲区
:r file 读入文件内容到当前缓冲区
:w !sudo tee % 用 sudo 保存当前文件

配置文件 .vimrc

下面是一份较完整的 .vimrc 示例,可按需删减。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
" ===== 编码 =====
set encoding=utf-8
set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936

" ===== 文件类型检测 =====
filetype on
filetype indent on
filetype plugin on
filetype plugin indent on

" ===== 显示 =====
set number                  " 显示行号
set relativenumber          " 显示相对行号
set ruler                   " 显示标尺
set cursorline              " 高亮当前行
set showcmd                 " 显示命令
set showmatch               " 匹配括号
set laststatus=2            " 总是显示状态栏
set scrolloff=5             " 光标距离顶部/底部保留 5 行
set wildmenu                " 命令行补全菜单

" ===== 缩进 =====
set tabstop=2               " Tab 显示为 2 个空格
set shiftwidth=2            " 自动缩进 2 个空格
set expandtab               " Tab 转空格
set autoindent              " 自动缩进
set smartindent             " 智能缩进

" ===== 搜索 =====
set hlsearch                " 高亮搜索
set incsearch               " 增量搜索
set ignorecase              " 忽略大小写
set smartcase               " 智能大小写

" ===== 编辑 =====
set backspace=indent,eol,start
set mouse=a                 " 启用鼠标
set clipboard=unnamed       " 共享系统剪贴板,Linux 可用 unnamedplus
set backup                  " 启用备份
set backupext=~             " 备份后缀
set backupdir=~/.vim/backup//
set directory=~/.vim/swap//
set undofile                " 持久化撤销
set undodir=~/.vim/undo//

" ===== 折叠 =====
set foldenable
set foldmethod=indent
set foldlevel=99

" ===== 映射 =====
inoremap jk <Esc>           " 插入模式快速退出
nnoremap <leader>w :w<CR>   " 保存
nnoremap <leader>q :q<CR>   " 退出
nnoremap <leader>h :noh<CR> " 取消搜索高亮

常用设置说明:

设置 作用
set number 显示绝对行号
set relativenumber 显示相对行号,方便跳转
set cursorline 高亮当前行
set expandtab Tab 转空格
set tabstop=2 Tab 宽度
set shiftwidth=2 自动缩进宽度
set hlsearch 搜索高亮
set incsearch 边输入边搜索
set ignorecase 忽略大小写
set smartcase 有大写时区分大小写
set clipboard=unnamed 使用系统剪贴板
set foldmethod=indent 按缩进折叠

插件管理

最简单的插件管理器是 vim-plug。

安装:

1
2
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
  https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

在 .vimrc 中添加:

1
2
3
4
5
6
7
8
9
call plug#begin('~/.vim/plugged')

Plug 'preservim/nerdtree'           " 文件树
Plug 'tpope/vim-commentary'         " 快速注释
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'             " 模糊搜索
Plug 'ycm-core/YouCompleteMe'       " 自动补全

call plug#end()

然后在 vim 中执行:

1
:PlugInstall

常用插件:

插件 作用
nerdtree 文件树
vim-commentary gcc 注释当前行
fzf.vim 模糊搜索文件、缓冲区
YouCompleteMe 代码补全
vim-airline 状态栏美化
gruvbox 配色主题

常用技巧

技巧 命令
快速注释当前行 gcc(需 vim-commentary)
注释选中行 gc
多文件搜索 :vimgrep /pattern/ **/*.c
打开搜索结果 :copen
删除空行 :g/^$/d
删除行尾空格 :%s/\s\+$//e
全文排序 :%sort
统计匹配次数 :%s/pattern//gn
粘贴模式 :set paste,粘贴后 :set nopaste
查看不可见字符 :set list
用 sudo 保存 :w !sudo tee %
快速跳转到文件 :e **/filename
重复上次替换 :&
在当前行执行上次替换 :&&

命令速查表

类别 命令 说明
退出 :wq 保存退出
退出 :q! 强制退出
移动 gg / G 文件头 / 文件尾
移动 Ctrl-f / Ctrl-b 下一页 / 上一页
编辑 dd 删除行
编辑 yy 复制行
编辑 p 粘贴
编辑 u / Ctrl-r 撤销 / 重做
搜索 /pattern 向下搜索
搜索 n / N 下一个 / 上一个
替换 :%s/a/b/g 全文替换
替换 :%s/a/b/gc 全文替换并确认
分屏 :sp / :vsp 水平 / 垂直分屏
分屏 Ctrl-w h/j/k/l 窗口切换
标签 :tabnew 新建标签
标签 gt / gT 下一个 / 上一个标签
宏 qa / @a 录制 / 播放宏
折叠 za / zR / zM 切换 / 打开全部 / 关闭全部
配置 :set number 显示行号
配置 :set relativenumber 相对行号
配置 :set hlsearch 搜索高亮
配置 :set ignorecase 忽略大小写
配置 :set expandtab Tab 转空格

总结

vim 的学习曲线较陡,但多用自然就会熟练,掌握常用命令后编辑效率会显著提升。先从移动、编辑、搜索替换、保存退出开始,逐步加入分屏、宏、寄存器、插件和自定义配置。把常用的 .vimrc 配置保存下来,换机器时直接复用即可。