Vim 编辑器完全指南:从入门到精通

24 min read
#vim#editor#productivity#terminal

Vim 简介

Vim (Vi IMproved) 是一个高度可配置、功能强大的文本编辑器,广泛用于编程和系统管理。它以其高效的编辑模式和强大的键盘操作而闻名,让开发者能够不离开键盘就能完成所有编辑操作。

为什么选择 Vim?

  • 效率至上:通过键盘快捷键完成所有操作,无需频繁切换到鼠标
  • 无处不在:几乎所有 Unix/Linux 系统都预装了 Vi/Vim
  • 高度可定制:通过配置文件和插件系统打造专属编辑环境
  • 学习曲线友好:掌握基础后可以逐步学习高级功能
  • 社区活跃:拥有丰富的插件和配置资源

Vim 的哲学

Vim 的设计理念是"模式编辑"。不同模式下,键盘按键有不同的功能,这使得编辑操作更加高效和精准。

Vim 模式详解

Vim 有多种工作模式,每种模式都有特定的用途:

1. 普通模式 (Normal Mode)

这是 Vim 启动时的默认模式,用于导航和执行命令。

# 从其他模式返回普通模式
按 Esc 键

2. 插入模式 (Insert Mode)

用于输入和编辑文本,类似普通文本编辑器。

# 进入插入模式的常用方式
i      # 在光标前插入
a      # 在光标后插入
I      # 在行首插入
A      # 在行尾插入
o      # 在下方新建一行并插入
O      # 在上方新建一行并插入

3. 可视模式 (Visual Mode)

用于选择文本块,然后进行操作(复制、删除等)。

v      # 进入字符可视模式(逐字符选择)
V      # 进入行可视模式(逐行选择)
Ctrl+v # 进入块可视模式(块状选择)

4. 命令模式 (Command Mode)

用于执行 Ex 命令(如保存、退出、搜索替换等)。

:      # 从普通模式进入命令模式

5. 替换模式 (Replace Mode)

直接覆盖文本而不是插入。

R      # 进入替换模式
r      # 替换单个字符

基础导航和移动

掌握 Vim 的导航是提高效率的第一步。

基本光标移动

h      # 左移一个字符
j      # 下移一行
k      # 上移一行
l      # 右移一个字符

# 也可以使用方向键,但 hjkl 更高效

单词级移动

w      # 移动到下一个单词开头
b      # 移动到上一个单词开头
e      # 移动到当前单词结尾

W      # 移动到下一个空格分隔的"单词"开头
B      # 移动到上一个空格分隔的"单词"开头
E      # 移动到当前空格分隔的"单词"结尾

行内移动

0      # 移动到行首
^      # 移动到行首第一个非空字符
$      # 移动到行尾
fx     # 跳转到下一个字符 x
Fx     # 跳转到上一个字符 x
tx     # 跳转到下一个字符 x 之前
Tx     # 跳转到上一个字符 x 之后
;      # 重复上一次 f/F/t/T 操作
,      # 反向重复上一次 f/F/t/T 操作

行间移动

gg     # 跳转到文件开头
G      # 跳转到文件结尾
:n     # 跳转到第 n 行
nG     # 跳转到第 n 行

屏幕移动

Ctrl+f # 向下翻页
Ctrl+b # 向上翻页
Ctrl+d # 向下翻半页
Ctrl+u # 向上翻半页
H      # 移动到屏幕顶部
M      # 移动到屏幕中间
L      # 移动到屏幕底部

编辑命令

Vim 的编辑命令遵循"操作符 + 动作"的语法模式。

删除操作

x      # 删除光标处字符
X      # 删除光标前字符
dd     # 删除当前行
dw     # 删除到下一个单词开头
diw    # 删除光标所在的单词
d$     # 删除到行尾
d0     # 删除到行首
dG     # 删除到文件结尾
dgg    # 删除到文件开头

# 可视模式删除
v + 选择范围 + d  # 删除选中的内容

复制和粘贴

yy     # 复制当前行
yw     # 复制到下一个单词开头
y$     # 复制到行尾
yi"    # 复制引号内的内容
yi(    # 复制括号内的内容
寄存器说明
""无名寄存器(默认)
"0复制专用寄存器
"+系统剪贴板
"*选择缓冲区
"a-"z命名寄存器
# 使用寄存器
"ayy    # 复制当前行到寄存器 a
"ap     # 粘贴寄存器 a 的内容
"+yy    # 复制到系统剪贴板
"+p     # 从系统剪贴板粘贴

修改操作

cw     # 删除到单词结尾并进入插入模式
cc     # 删除整行并进入插入模式
C      # 删除到行尾并进入插入模式
s      # 删除字符并进入插入模式
S      # 删除行并进入插入模式

撤销和重做

u      # 撤销上一次操作
Ctrl+r # 重做
U      # 撤销对当前行的所有修改

重复操作

.      # 重复上一次操作
3dd    # 删除 3 行
5yy    # 复制 5 行
3w     # 向前移动 3 个单词

文件操作

保存和退出

:w     # 保存当前文件
:wq    # 保存并退出
:q     # 退出(未修改时)
:q!    # 强制退出,不保存修改
:x     # 保存并退出(等同于 :wq)
ZZ     # 保存并退出(快捷键)
ZQ     # 不保存退出(快捷键)

文件管理

:e filename     # 编辑文件
:e!             # 重新加载当前文件(放弃修改)
:w filename     # 另存为
:bn             # 切换到下一个缓冲区
:bp             # 切换到上一个缓冲区
:ls             # 列出所有缓冲区
:b n            # 切换到缓冲区 n

搜索和替换

基本搜索

/pattern        # 向下搜索 pattern
?pattern        # 向上搜索 pattern
n               # 跳转到下一个搜索结果
N               # 跳转到上一个搜索结果
*               # 搜索光标下的单词(向下)
#               # 搜索光标下的单词(向上)

高级搜索

\cpattern       # 忽略大小写搜索
\Cpattern       # 区分大小写搜索
/^pattern       # 搜索行首
/pattern$       # 搜索行尾

替换操作

:s/old/new/     # 替换当前行第一个匹配
:s/old/new/g    # 替换当前行所有匹配
:%s/old/new/g   # 替换整个文件所有匹配
:%s/old/new/gc  # 全局替换,每次都询问确认
:n,ms/old/new/g # 替换第 n 到 m 行
:%s/old/new/gi  # 全局替换,忽略大小写

# 特殊字符需要转义
:s/\//\\\//g    # 替换 / 为 \/

高级功能

分割窗口

:split          # 水平分割窗口
:vsplit         # 垂直分割窗口
:sp filename    # 水平分割并打开文件
:vsp filename   # 垂直分割并打开文件
Ctrl+w s        # 水平分割
Ctrl+w v        # 垂直分割

# 窗口导航
Ctrl+w h        # 移动到左边的窗口
Ctrl+w j        # 移动到下边的窗口
Ctrl+w k        # 移动到上边的窗口
Ctrl+w l        # 移动到右边的窗口
Ctrl+w w        # 切换到下一个窗口
Ctrl+w p        # 切换到上一个窗口

# 窗口调整
Ctrl+w =        # 均匀分配窗口大小
Ctrl+w +        # 增加窗口高度
Ctrl+w -        # 减少窗口高度
Ctrl+w >        # 增加窗口宽度
Ctrl+w <        # 减少窗口宽度
Ctrl+w q        # 关闭当前窗口

标签页

:tabnew         # 新建标签页
:tabnew file    # 在新标签页打开文件
:tabn           # 切换到下一个标签页
:tabp           # 切换到上一个标签页
:tabc           # 关闭当前标签页
:tabo           # 关闭其他所有标签页
:tabs           # 列出所有标签页
gt              # 切换到下一个标签页
gT              # 切换到上一个标签页
n_gt            # 切换到第 n 个标签页

书签功能

ma              # 在当前位置设置标记 a
'a              # 跳转到标记 a
'ma             # 跳转到标记 a(光标定位到设置标记时的位置)
``a             # 跳转到标记 a(光标定位到设置标记时的行的开头)
:marks          # 列出所有标记

宏录制

qa              # 开始录制宏到寄存器 a
q               # 停止录制
@a              # 执行宏 a
@@              # 重复上次执行的宏
5@a             # 执行宏 a 五次
:reg a          # 查看寄存器 a 的内容

宏录制示例:在多行行首添加注释

# 1. 移动到第一行
# 2. qa (开始录制)
# 3. I (进入行首插入模式)
# 4. # (输入 #)
# 5. Esc (返回普通模式)
# 6. j (下移一行)
# 7. q (停止录制)
# 8. 100@a (在接下来 100 行重复操作)

实用开发工作流

代码格式化

gg=G            # 格式化整个文件
=               # 在可视模式下格式化选中内容

代码折叠

zi              # 切换折叠
za              # 切换当前折叠
zR              # 打开所有折叠
zM              # 关闭所有折叠
zc              # 折叠当前块
zo              # 展开当前块

自动补全

Ctrl+n          # 下一个匹配的关键字
Ctrl+p          # 上一个匹配的关键字
Ctrl+x Ctrl+f   # 文件名补全
Ctrl+x Ctrl+]   # 标签补全

快速跳转

Ctrl+]          # 跳转到光标下单词的定义
Ctrl+t          # 返回上一个跳转
Ctrl+o          # 跳转到上一个位置
Ctrl+i          # 跳转到下一个位置
:g/pattern/     # 跳转到匹配 pattern 的行

外部命令

:!command       # 执行外部命令
:r!command      # 读取外部命令的输出
:w!command      # 将当前内容作为命令输入
# 实用示例
:!ls            # 列出当前目录文件
:r!date         # 插入当前日期
:w!sudo tee %   # 以 sudo 权限保存文件

.vimrc 配置指南

一个良好的 .vimrc 配置能极大提升 Vim 使用体验。

基础配置

" ===== 基础设置 =====
set nocompatible              " 不兼容 Vi
set encoding=utf-8            " 编码设置
set fileencoding=utf-8        " 文件编码
set fileencodings=utf-8       " 支持的编码列表

" ===== 界面设置 =====
set number                    " 显示行号
set relativenumber            " 相对行号
set ruler                     " 显示光标位置
set showcmd                   " 显示输入的命令
set laststatus=2              " 始终显示状态栏
set cursorline                " 高亮当前行
set colorcolumn=80            " 80 列标线

" ===== 缩进设置 =====
set autoindent                " 自动缩进
set smartindent               " 智能缩进
set tabstop=4                 " Tab 键宽度
set shiftwidth=4              " 自动缩进宽度
set expandtab                 " 用空格替代 Tab
set smarttab                  " 智能制表符

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

" ===== 编辑设置 =====
set mouse=a                   " 启用鼠标
set backspace=indent,eol,start " 退格键行为
set clipboard=unnamed         " 使用系统剪贴板
set history=1000              " 命令历史
set undofile                  " 持久化撤销
set undodir=~/.vim/undo       " 撤销文件目录
set backup                    " 创建备份文件
set backupdir=~/.vim/backup   " 备份目录
set directory=~/.vim/swap     " 交换文件目录

" ===== 性能设置 =====
set lazyredraw                " 宏执行时不重绘
set synmaxcol=200             " 语法高亮最大列数
set ttyfast                   " 快速终端连接

键位映射

" ===== 键位映射 =====
let mapleader = ","           " 设置 Leader 键

" 快捷保存和退出
nnoremap <leader>w :w<CR>
nnoremap <leader>q :q<CR>
nnoremap <leader>x :x<CR>

" 快速移动
nnoremap j gj
nnoremap k gk
nnoremap ^ ^
nnoremap $ $

" 窗口操作
nnoremap <leader>h <C-w>h
nnoremap <leader>j <C-w>j
nnoremap <leader>k <C-w>k
nnoremap <leader>l <C-w>l

" 清除搜索高亮
nnoremap <leader><space> :nohlsearch<CR>

" 快速编辑配置文件
nnoremap <leader>ev :e $MYVIMRC<CR>
nnoremap <leader>sv :source $MYVIMRC<CR>

" 可视模式缩进
vnoremap < <gv
vnoremap > >gv

" 移动选中的文本
vnoremap J :m '>+1<CR>gv=gv
vnoremap K :m '<-2<CR>gv=gv

插件管理器设置

使用 vim-plug 管理插件:

# 安装 vim-plug
curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
" ===== 插件配置 =====
call plug#begin('~/.vim/plugged')

" 文件管理器
Plug 'preservim/nerdtree'

" 状态栏美化
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'

" 主题
Plug 'morhetz/gruvbox'

" 语法高亮
Plug 'sheerun/vim-polyglot'

" 模糊查找
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'

" Git 集成
Plug 'tpope/vim-fugitive'
Plug 'airblade/vim-gitgutter'

" 代码补全
Plug 'neoclide/coc.nvim', {'branch': 'release'}

" 括号自动配对
Plug 'jiangmiao/auto-pairs'

" 注释插件
Plug 'tpope/vim-commentary'

" 快速包围
Plug 'tpope/vim-surround'

" 自动对齐
Plug 'junegunn/vim-easy-align'

call plug#end()

" ===== 主题设置 =====
colorscheme gruvbox
set background=dark

安装插件的命令:

:PlugInstall     " 安装插件
:PlugUpdate      " 更新插件
:PlugClean       " 清除未使用的插件

推荐插件配置

NERDTree - 文件树浏览器

" NERDTree 配置
nnoremap <leader>n :NERDTreeToggle<CR>
nnoremap <leader>f :NERDTreeFind<CR>
let NERDTreeShowHidden=1
let NERDTreeIgnore=['\.pyc$', '\.o$', '\.so$', '\.a$', '\.swp', '*\.swp', '\.swo', '*\.swo', '\.git', '\.hg', '\.svn', '\.bzr']

vim-airline - 美化状态栏

" Airline 配置
let g:airline_theme='gruvbox'
let g:airline_powerline_fonts = 1
let g:airline#extensions#tabline#enabled = 1

fzf - 模糊查找

" FZF 配置
nnoremap <leader>p :Files<CR>
nnoremap <leader>b :Buffers<CR>
nnoremap <leader>g :Rg<CR>

coc.nvim - 代码补全

" CoC 配置
" 使用 Tab 进行补全导航
inoremap <silent><expr> <TAB>
      \ pumvisible() ? "\<C-n>" :
      \ <SID>check_back_space() ? "\<TAB>" :
      \ coc#refresh()
inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"

function! s:check_back_space() abort
  let col = col('.') - 1
  return !col || getline('.')[col - 1]  =~# '\s'
endfunction

" 使用 Enter 确认补全
inoremap <silent><expr> <cr> pumvisible() ? coc#_select_confirm()
                              \: "\<C-g>u\<CR>\<c-r>=coc#on_enter()\<CR>"

" 使用 Ctrl+space 触发补全
inoremap <silent><expr> <c-space> coc#refresh()

vim-easy-align - 快速对齐

" EasyAlign 配置
xmap ga <Plug>(EasyAlign)
nmap ga <Plug>(EasyAlign)

常用技巧和窍门

1. 快速选择整个文件内容

ggVG            " gg 到开头,V 进入行可视模式,G 到结尾

2. 大小写转换

~               " 切换光标下字符的大小写
gU$             " 将当前行到行尾转为大写
gu$             " 将当前行到行尾转为小写
gUU             " 整行大写
guu             " 整行小写

3. 快速插入文本

:r !date        " 插入当前日期时间
:r !ls          " 插入当前目录列表

4. 重复上一次命令

.               " 重复上次操作
3.              " 重复上次操作 3 次

5. 块选择编辑

# 在多行开头同时添加内容
Ctrl+v          " 进入块可视模式
j               " 选择多行
Shift+i         " 进入插入模式
输入文本
Esc             " 等待应用到所有选中行

6. 快速移动到匹配的括号

%               " 在 ()、[]、{} 之间跳转

7. 读取命令输出

:r!pwd          " 读取并插入当前路径
:r!ls -la       " 读取并插入文件列表

8. 会话管理

:mksession      " 保存当前会话
:mks! session.vim " 保存到指定文件
:source session.vim " 恢复会话

9. Diff 模式

vimdiff file1 file2  " 以 diff 模式打开两个文件
:diffthis       " 将当前窗口设为 diff 模式
:diffoff        " 关闭 diff 模式

10. 快速修改大小写

~               " 切换当前字符大小写
gUaw            " 将当前单词转为大写
guaw            " 将当前单词转为小写

性能优化建议

1. 禁用不必要的功能

syntax off      " 禁用语法高亮(在超大文件中)
set noswapfile  " 禁用交换文件
set nobackup    " 禁用备份文件

2. 优化大文件编辑

" 创建大文件类型自动命令
augroup LargeFile
  autocmd!
  autocmd BufReadPre * let f=expand("<afile>") | if getfsize(f) > 1024*1024 | setlocal syntax= noswapfile | endif
augroup END

调试和故障排除

查看 Vim 版本和信息

:version        " 查看 Vim 版本和编译选项
:verbose map    " 查看所有映射及其定义位置
:scriptnames    " 查看加载的所有脚本

加载时间分析

--startuptime vim-startup.log
" 在启动 Vim 后,查看 vim-startup.log 分析加载时间

常见问题解决

  1. 配色方案不显示

    set t_Co=256          " 启用 256 色支持
    
  2. 退格键不工作

    set backspace=indent,eol,start
    
  3. 系统剪贴板不可用

    # 需要安装支持剪贴板的 Vim 版本
    sudo apt-get install vim-gtk3  # Ubuntu/Debian
    brew install vim                # macOS
    

快速参考

基础命令速查表

操作命令说明
移动h/j/k/l左/下/上/右
w/b下一个/上一个单词
0/$行首/行尾
gg/G文件开头/结尾
编辑i/a在光标前/后插入
dd删除当前行
yy复制当前行
p/P粘贴到光标后/前
u/Ctrl+r撤销/重做
.重复上次操作
可视模式v/V/Ctrl+v字符/行/块选择
搜索/pattern向前搜索
?pattern向后搜索
n/N下一个/上一个匹配
*搜索光标下的单词
文件操作:w保存
:q退出
:wq保存并退出
:e file打开文件
窗口:sp/:vsp水平/垂直分割
Ctrl+w h/j/k/l窗口导航

高级命令速查表

操作命令说明
替换:s/old/new/替换第一个匹配
:%s/old/new/g全局替换
:%s/old/new/gc全局替换(确认)
qa开始录制宏到寄存器 a
q停止录制
@a执行宏 a
标记ma设置标记 a
'a跳转到标记 a
标签页:tabnew新建标签页
gt/gT下一个/上一个标签页
折叠zi切换折叠
za切换当前折叠
zR/zM打开/关闭所有折叠

键位组合速查表

键位组合功能
Ctrl+w窗口操作前缀
Ctrl+]跳转到定义
Ctrl+t返回跳转
Ctrl+o上一个位置
Ctrl+i下一个位置
Ctrl+f/b下/上翻页
Ctrl+d/u下/上翻半页
g+g文件开头
Shift+k查看手册(如果配置)
Shift+>>增加缩进
Shift+<<减少缩进

学习资源

在线教程

官方文档

:help           " 查看 Vim 帮助
:help user-manual  " 用户手册
:help pattern   " 正则表达式帮助
:help autocmd   " 自动命令帮助

推荐配置文件

总结

Vim 是一个强大的编辑器,掌握它需要时间和练习。建议的学习路径:

  1. 第一周:掌握基础模式和基本移动
  2. 第二周:学习编辑命令和可视模式
  3. 第三周:配置 .vimrc 和安装插件
  4. 第四周:学习高级功能和自定义配置

记住:

  • 每天练习一点,不要贪多
  • 先掌握基础,再学习高级功能
  • 多用 :help 查看文档
  • 参考他人的配置,但要理解每个设置
  • 慢慢形成自己的编辑习惯

Vim 的学习曲线虽然陡峭,但一旦掌握,它将成为你最强大的编辑工具。坚持练习,你会发现编辑效率的显著提升!

练习题

为了巩固所学知识,建议尝试以下练习:

  1. 基础练习

    • 创建一个新文件,输入 10 行文本
    • 使用不同的移动命令导航
    • 练习删除、复制、粘贴操作
    • 尝试撤销和重做
  2. 进阶练习

    • 录制一个宏,在多行行首添加编号
    • 使用可视块模式同时编辑多行
    • 练习搜索和替换命令
    • 尝试分割窗口和标签页操作
  3. 实战练习

    • 用 Vim 编写一个完整的程序
    • 配置你的 .vimrc 文件
    • 安装并配置 5 个常用插件
    • 创建自定义键位映射

祝你学习愉快,早日成为 Vim 高手!