2015-09-21
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 |
忽略大小写替换 |
常用替换示例
所有 { 后面添加换行和空格:
所有 } 前后添加换行:
删除行尾空格:
删除空行:
统计匹配次数:
分屏与标签
分屏
| 命令 |
说明 |
: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 中执行:
常用插件:
| 插件 |
作用 |
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 配置保存下来,换机器时直接复用即可。