Vim 简介
Vim(Vi IMproved)是Bram Moolenaar于1991年发布的Vi编辑器增强版。它遵循Unix哲学:做好一件事,并做到极致。
为什么程序员应该选择Vim?
| 特性 | 说明 |
|---|---|
| 速度 | 全键盘操作,手不离键盘 |
| 普适性 | 几乎存在于所有Unix/Linux系统 |
| 可定制性 | 高度可配置,适应任何工作流 |
| 轻量级 | 启动快,资源占用极低 |
| 思维模型 | 编辑文本的语言,而非单纯工具 |
学习曲线真相
效率
^
│ /‾‾‾‾‾‾‾‾‾‾
│ / Vim
│ /
│ /
│_____/__________________ 时间
普通编辑器
Vim初期学习成本较高,但一旦掌握基础,效率将指数级超越传统编辑器。
基础操作:三种模式
Vim的核心在于模式编辑。理解这三种模式是掌握Vim的第一步:
1. 普通模式(Normal Mode)
默认模式,用于导航和执行命令。
vim
" 进入普通模式
按 <Esc> 或 <Ctrl-[>
2. 插入模式(Insert Mode)
文本输入模式,类似传统编辑器。
| 快捷键 | 作用 | 记忆 |
|---|---|---|
i |
光标前插入 | insert |
a |
光标后插入 | append |
I |
行首插入 | 大写 = 更强 |
A |
行尾插入 | 大写 = 更强 |
o |
下方新开一行 | open |
O |
上方新开一行 | 大写 = 反向 |
3. 可视模式(Visual Mode)
选择模式,用于批量操作。
| 快捷键 | 作用 |
|---|---|
v |
字符可视模式 |
V |
行可视模式 |
<Ctrl-v> |
块可视模式(列选择) |
模式切换图
┌─────────────┐
│ 普通模式 │◄────── <Esc>
│ (Normal) │
└──────┬──────┘
│
┌──────────┼──────────┐
│ │ │
▼ ▼ ▼
┌───────┐ ┌───────┐ ┌─────────┐
│ i │ │ : │ │ v │
│插入模式│ │命令模式│ │可视模式 │
│(Insert)│ │(Cmd) │ │(Visual) │
└───────┘ └───────┘ └─────────┘
高效移动与导航
基础移动(hjkl)
k
h l
j
为什么用hjkl而不是方向键?
- 手不需要离开主键区
- 与后续组合命令形成肌肉记忆
单词级移动
| 命令 | 作用 | 说明 |
|---|---|---|
w |
下一个单词开头 | word |
b |
上一个单词开头 | back |
e |
当前/下一个单词结尾 | end |
ge |
上一个单词结尾 | 反向end |
大写 vs 小写区别:
w/b/e:以非单词字符分隔(如空格、标点)W/B/E:以空白字符分隔(更快跨越代码)
行内移动
| 命令 | 作用 |
|---|---|
0 |
行首(第0列) |
^ |
行首第一个非空字符 |
$ |
行尾 |
g_ |
行尾最后一个非空字符 |
f{char} |
跳到字符(find) |
t{char} |
跳到字符前(till) |
; |
重复上次f/t |
, |
反向重复上次f/t |
示例:
python
def hello_world():
# ^ 按 ^ 到这里
# ^^^^^ 按 fw 跳到 w
# ^ 按 $ 到这里
屏幕与文件导航
| 命令 | 作用 |
|---|---|
gg |
文件开头 |
G |
文件结尾 |
:{n} |
跳到第n行 |
Ctrl-u |
上半页(up) |
Ctrl-d |
下半页(down) |
Ctrl-b |
上一页(backward) |
Ctrl-f |
下一页(forward) |
H |
屏幕顶部(High) |
M |
屏幕中间(Middle) |
L |
屏幕底部(Low) |
代码结构导航
| 命令 | 作用 |
|---|---|
% |
匹配括号 ()[]{} |
* |
搜索当前单词(向下) |
# |
搜索当前单词(向上) |
gd |
跳转到局部定义 |
gD |
跳转到全局定义 |
编辑与修改艺术
操作符(Operator)+ 动作(Motion)
这是Vim最强大的概念:动词 + 名词
常用操作符:
| 操作符 | 作用 |
|---|---|
d |
delete(删除) |
c |
change(修改) |
y |
yank(复制) |
> |
缩进 |
< |
反缩进 |
= |
自动格式化 |
组合示例:
vim
dw " 删除到下一个单词开头
diw " 删除当前单词(delete inner word)
ci" " 修改引号内的内容(change inside ")
yap " 复制当前段落(yank around paragraph)
dt; " 删除到分号前
文本对象(Text Objects)
文本对象允许你操作成对 或结构化的内容:
| 对象 | 说明 | 示例 |
|---|---|---|
iw / aw |
单词(inner/around) | diw 删除单词 |
is / as |
句子 | yas 复制句子 |
ip / ap |
段落 | dap 删除段落 |
i" / a" |
引号内 | ci" 修改引号内容 |
i( / a( |
括号内 | da( 删除包括括号 |
i{ / a{ |
花括号内 | yi{ 复制花括号内 |
it / at |
HTML标签内 | cat 修改标签内容 |
记忆法:
i= inner(内部)a= around(包括边界)
寄存器系统
Vim不使用系统剪贴板,而是有多级寄存器:
| 寄存器 | 用途 |
|---|---|
"" |
默认寄存器 |
"0 |
复制专用寄存器 |
"1-9 |
删除历史(9个) |
"+ |
系统剪贴板 |
"* |
主选择区(Linux) |
"/ |
上次搜索 |
": |
上次命令 |
使用示例:
vim
"ayy " 复制当前行到寄存器a
"ap " 粘贴寄存器a的内容
"+yy " 复制到系统剪贴板
"+p " 从系统剪贴板粘贴
宏录制(Macro)
自动化重复任务的神器:
vim
qa " 开始录制到寄存器a
... " 执行操作
q " 停止录制
@a " 播放宏
@@ " 重复上次宏
10@a " 播放10次
实战示例:将CSV转换为JSON:
vim
" 录制宏a:
qa
I{ "name": "<Esc>A", "age": <Esc>j0q
" 应用到剩余行:
VG:normal @a
Vim 配置与个性化
基础配置(~/.vimrc)
vim
" ==========================================
" 基础设置
" ==========================================
set nocompatible " 关闭Vi兼容模式
set number " 显示行号
set relativenumber " 相对行号(方便跳转)
set cursorline " 高亮当前行
set laststatus=2 " 总是显示状态栏
set showcmd " 显示部分命令
" ==========================================
" 缩进与格式
" ==========================================
set expandtab " Tab转空格
set shiftwidth=4 " 自动缩进宽度
set softtabstop=4 " Tab键宽度
set tabstop=4 " Tab显示宽度
set autoindent " 自动缩进
set smartindent " 智能缩进
" ==========================================
" 搜索设置
" ==========================================
set hlsearch " 高亮搜索结果
set incsearch " 增量搜索
set ignorecase " 忽略大小写
set smartcase " 智能大小写(有大写时区分)
" ==========================================
" 性能优化
" ==========================================
set lazyredraw " 批量操作时不重绘
set ttyfast " 快速终端连接
set updatetime=300 " 更新延迟
" ==========================================
" 实用功能
" ==========================================
set clipboard=unnamedplus " 使用系统剪贴板
set undofile " 持久化撤销
set backupdir=~/.vim/backup// " 备份文件目录
set directory=~/.vim/swap// " 交换文件目录
set wildmenu " 命令行补全增强
set wildmode=list:longest,full
" ==========================================
" 快捷键映射
" ==========================================
let mapleader = " " " 设置leader键为空格
" 快速保存/退出
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <leader>x :x<CR>
" 快速切换窗口
nnoremap <C-h> <C-w>h
nnoremap <C-j> <C-w>j
nnoremap <C-k> <C-w>k
nnoremap <C-l> <C-w>l
" 清除搜索高亮
nnoremap <leader>h :nohlsearch<CR>
" 系统复制粘贴
vnoremap <leader>y "+y
nnoremap <leader>p "+p
" ==========================================
" 编程增强
" ==========================================
syntax on " 语法高亮
filetype plugin indent on " 文件类型检测
set completeopt=menu,menuone,noselect " 补全选项
配色方案推荐
vim
" 内置配色
colorscheme desert
colorscheme molokai
colorscheme gruvbox
" 推荐安装:
" - gruvbox(复古护眼)
" - dracula(现代暗色)
" - nord(北极蓝调)
" - one-dark(Atom风格)
插件生态系统
现代Vim开发离不开插件管理器。推荐使用 vim-plug:
安装vim-plug
bash
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
推荐插件配置
vim
call plug#begin('~/.vim/plugged')
" ==========================================
" 基础增强
" ==========================================
Plug 'tpope/vim-sensible' " 合理默认配置
Plug 'tpope/vim-surround' " 快速操作包围符号
Plug 'tpope/vim-commentary' " 快速注释
Plug 'tpope/vim-repeat' " 重复插件操作
Plug 'tpope/vim-unimpaired' " 成对快捷键
" ==========================================
" 文件与导航
" ==========================================
Plug 'preservim/nerdtree' " 文件树
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim' " 模糊查找
Plug 'mhinz/vim-grepper' " 搜索工具
" ==========================================
" 代码补全与LSP
" ==========================================
Plug 'neoclide/coc.nvim', {'branch': 'release'} " 现代LSP客户端
" ==========================================
" 语法与检查
" ==========================================
Plug 'dense-analysis/ale' " 异步语法检查
Plug 'sheerun/vim-polyglot' " 多语言语法包
" ==========================================
" Git集成
" ==========================================
Plug 'tpope/vim-fugitive' " Git命令
Plug 'airblade/vim-gitgutter' " 行内git状态
" ==========================================
" 视觉增强
" ==========================================
Plug 'vim-airline/vim-airline' " 状态栏
Plug 'ryanoasis/vim-devicons' " 文件图标
call plug#end()
关键插件详解
1. coc.nvim(代码补全)
vim
" 安装后配置
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
" 使用 :CocInstall 安装语言服务器
" :CocInstall coc-python coc-tsserver coc-rust-analyzer
2. NERDTree(文件树)
vim
nnoremap <leader>n :NERDTreeToggle<CR>
nnoremap <leader>f :NERDTreeFind<CR>
" 自动关闭
autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
3. fzf(模糊查找)
vim
nnoremap <leader>ff :Files<CR>
nnoremap <leader>fg :Rg<CR>
nnoremap <leader>fb :Buffers<CR>
nnoremap <leader>fh :History<CR>
编程语言支持
Python开发配置
vim
" coc-settings.json
{
"languageserver": {
"python": {
"command": "python",
"args": ["-m", "pyls"],
"filetypes": ["python"],
"settings": {
"pyls": {
"plugins": {
"pycodestyle": {"enabled": true, "maxLineLength": 100},
"pylint": {"enabled": true}
}
}
}
}
}
}
JavaScript/TypeScript
vim
" 安装 coc-tsserver 后
autocmd FileType javascript,typescript setlocal shiftwidth=2 tabstop=2
" 常用快捷键
nmap <leader>rn <Plug>(coc-rename) " 重命名
nmap <leader>f <Plug>(coc-format-selected) " 格式化
Rust
vim
" 使用 coc-rust-analyzer
let g:rustfmt_autosave = 1 " 保存时自动格式化
" Cargo集成
command! CargoBuild :!cargo build
command! CargoTest :!cargo test
nnoremap <leader>cb :CargoBuild<CR>
nnoremap <leader>ct :CargoTest<CR>
高级技巧与工作流
1. 多文件编辑
vim
" 缓冲区管理
:buffers " 列出所有缓冲区
:b 2 " 切换到缓冲区2
:bd " 删除当前缓冲区
:bnext / :bprev " 切换缓冲区
" 分屏
:split 或 :sp " 水平分割
:vsplit 或 :vsp " 垂直分割
Ctrl-w c " 关闭当前窗口
Ctrl-w o " 只保留当前窗口
" 标签页
:tabnew " 新建标签页
gt / gT " 切换标签页
:tabs " 列出标签页
2. 外部命令集成
vim
:!ls " 执行shell命令
:r !date " 插入命令输出到文件
:.!python3 " 用Python处理当前行
:%!jq . " 用jq格式化JSON
3. 快速替换
vim
" 基础替换
:s/old/new/ " 替换当前行第一个
:s/old/new/g " 替换当前行所有
:%s/old/new/g " 替换整个文件
:%s/old/new/gc " 替换前确认
" 使用当前单词
:%s/<C-r><C-w>/new/g " 将当前单词替换为new
" 多文件替换
:arg *.py
:argdo %s/foo/bar/gc | update
4. 标记与跳转
vim
ma " 在当前位置设置标记a
`a " 跳转到标记a(精确位置)
'a " 跳转到标记a(行首)
:marks " 列出所有标记
" 特殊标记
``. " 上次编辑位置
``^ " 上次插入位置
``[ " 上次修改开始
``] " 上次修改结束
5. 会话管理
vim
:mksession! ~/.vim/session.vim " 保存会话
:source ~/.vim/session.vim " 恢复会话
vim -S ~/.vim/session.vim " 启动时恢复
学习路径建议
第1周:生存模式
├── 掌握i/a/o进入插入模式
├── 掌握<Esc>返回普通模式
├── 使用hjkl移动
├── 使用:w :q保存退出
└── 练习:不用方向键和鼠标
第2-3周:效率提升
├── 掌握w/b/e单词移动
├── 掌握f/F/t/T行内跳转
├── 使用d/c/y + 动作
├── 掌握文本对象iw/i"/i(
└── 练习:重构一段代码
第4周:进阶操作
├── 学习宏录制q/@
├── 掌握可视模式v/V/Ctrl-v
├── 学习寄存器使用
├── 多文件编辑
└── 练习:批量处理日志文件
第5周+:定制与优化
├── 编写.vimrc配置
├── 安装插件管理器
├── 配置LSP补全
├── 学习Vimscript或Lua
└── 持续优化工作流
推荐资源
- 交互式学习
vimtutor(终端自带)- Vim Adventures(游戏化学习)
- Open Vim(在线教程)
- 文档与社区
:help(最权威文档)- Vim Wiki
- Reddit r/vim
- 书籍
- 《Practical Vim》- Drew Neil
- 《Learn Vimscript the Hard Way》