Skip to content

Vim 高效技巧精选

Vim 是一款功能强大的文本编辑器,以其高效的键盘操作和丰富的定制性著称。虽然初学者可能会感到上手困难,但一旦掌握了核心概念和常用技巧,Vim 将显著提升您的编辑效率。本文汇总了最实用的 Vim 技巧,帮助您在日常编辑中如鱼得水。

1. Vim 基础概念

1.1 Vim 的模式系统

Vim 独特的模式系统是其高效的关键:

  • 普通模式(Normal Mode):默认模式,用于导航和执行命令
  • 插入模式(Insert Mode):用于输入文本
  • 可视模式(Visual Mode):用于选择文本块
  • 命令行模式(Command Mode):用于执行保存、退出等操作

在普通模式下按 i 进入插入模式,按 Esc 返回普通模式,这是最基本的模式切换。

1.2 动作 + 范围 思维模式

Vim 操作遵循 "动词 + 范围" 的模式,这是其高效的核心思想:

  • 动词:操作类型,如 d(删除)、y(复制)、c(修改)
  • 范围:操作的目标,如 w(单词)、$(行尾)、}(段落)

例如,dw 表示删除当前位置到下一个单词开始的内容,ci" 表示修改引号内的内容。

2. 必学导航技巧

2.1 基本移动

普通模式下,忘记方向键,使用这些键更高效:

  • h:左移
  • j:下移
  • k:上移
  • l:右移
  • w:下一个单词的开头
  • e:当前/下一个单词的结尾
  • b:当前/上一个单词的开头
  • 0:行首
  • $:行尾
  • ^:行首第一个非空白字符
  • G:文件末尾
  • gg:文件开头
  • {:上一个空行
  • }:下一个空行

2.2 高效跳转

这些命令可以让您在文件中快速移动:

  • Ctrl+f:向下翻一页(Page Down)
  • Ctrl+b:向上翻一页(Page Up)
  • Ctrl+d:向下翻半页
  • Ctrl+u:向上翻半页
  • H:跳到屏幕顶部
  • M:跳到屏幕中间
  • L:跳到屏幕底部
  • zz:将当前行置于屏幕中央
  • <number>G:number:跳转到指定行
  • %:在匹配的括号之间跳转

2.3 查找和标记

高效导航的关键技巧:

  • /pattern:向下查找字符串
  • ?pattern:向上查找字符串
  • n:继续查找下一个
  • N:反向查找下一个
  • *:向下查找当前光标所在的单词
  • #:向上查找当前光标所在的单词
  • f<char>:在当前行向右查找字符
  • F<char>:在当前行向左查找字符
  • m<letter>:设置标记
  • `<letter>:跳转到标记
  • ``:跳回到上一个位置

3. 高效编辑技巧

3.1 文本操作

普通模式下的基本编辑命令:

  • i:在光标前插入
  • a:在光标后插入
  • I:在行首插入
  • A:在行尾插入
  • o:在当前行下方新建一行并进入插入模式
  • O:在当前行上方新建一行并进入插入模式
  • d<motion>:删除(如 dwddd$
  • c<motion>:删除并进入插入模式(如 cwccc$
  • y<motion>:复制(如 ywyyy$
  • p:在光标后粘贴
  • P:在光标前粘贴
  • x:删除光标下的字符
  • r<char>:替换光标下的字符
  • u:撤销
  • Ctrl+r:重做

3.2 文本对象

文本对象是 Vim 最强大的功能之一,允许您以语义单位操作文本:

  • i 表示 "inner"(内部),a 表示 "around"(周围,包括分隔符)
  • 常见的文本对象:
    • w:单词
    • s:句子
    • p:段落
    • ":双引号字符串
    • ':单引号字符串
    • ):圆括号内容
    • ]:方括号内容
    • }:花括号内容
    • t:XML/HTML 标签

例如:

  • diw:删除整个单词(不包括周围空格)
  • ci":修改双引号中的内容
  • da):删除圆括号及其内容
  • vap:选择整个段落

3.3 多行操作

高效处理多行文本:

  • 可视模式:按 v(字符选择)、V(行选择)或 Ctrl+v(块选择)进入
  • 块操作:使用 Ctrl+v 选择文本块后
    • I 插入文本,然后按 Esc 应用到所有行
    • d 删除选中区域
    • c 修改选中区域

示例:

# 在多行前添加注释
1. 按 Ctrl+v 进入块选择模式
2. 选择多行的行首
3. 按 I 插入 #
4. 按 Esc 完成操作

3.4 替换和宏

批量操作的强大工具:

  • 全局替换:s/pattern/replacement/g

    • :%s/old/new/g:替换整个文件中的所有匹配
    • :5,12s/old/new/g:替换 5-12 行中的所有匹配
    • :%s/old/new/gc:替换整个文件中的所有匹配,但需要确认
  • :录制和播放一系列操作

    • q<letter>:开始录制宏(存储在寄存器 <letter> 中)
    • 执行您想要重复的操作
    • q:停止录制
    • @<letter>:执行宏
    • @@:重复上次执行的宏
    • 5@a:执行宏 "a" 5 次

4. Vim 配置与插件

4.1 基本配置

~/.vimrc 中的常用设置:

vim
" 基本设置
set nocompatible               " 使用 Vim 改进模式,不兼容 Vi
syntax enable                  " 开启语法高亮
set number                     " 显示行号
set relativenumber             " 显示相对行号
set autoindent                 " 自动缩进
set expandtab                  " 使用空格代替 Tab
set tabstop=4                  " Tab 显示宽度
set shiftwidth=4               " 缩进宽度
set softtabstop=4              " 退格键一次删除的空格数
set cursorline                 " 高亮当前行
set ignorecase                 " 搜索时忽略大小写
set smartcase                  " 如果搜索包含大写字母,则大小写敏感
set incsearch                  " 实时搜索
set hlsearch                   " 高亮搜索结果
set wrap                       " 换行显示
set scrolloff=8                " 保持光标距离顶部/底部的行数
set encoding=utf-8             " 使用 UTF-8 编码
set fileencoding=utf-8         " 文件保存编码
set autoread                   " 自动重新加载文件
set hidden                     " 允许在有未保存更改时切换缓冲区
set history=1000               " 历史记录长度
set laststatus=2               " 总是显示状态栏

4.2 按键映射

常用的按键映射示例:

vim
" 设置 Leader 键
let mapleader = " "              " 将空格键设为 Leader 键

" 常用映射
nnoremap <leader>w :w<CR>        " 快速保存
nnoremap <leader>q :q<CR>        " 快速退出
nnoremap <leader>wq :wq<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>v :vsplit<CR>   " 垂直分割窗口
nnoremap <leader>s :split<CR>    " 水平分割窗口
nnoremap <leader>/ :nohlsearch<CR> " 清除搜索高亮

4.3 推荐插件

使用插件管理器(如 vim-plug)安装以下实用插件:

vim
" 使用 vim-plug 安装插件
call plug#begin('~/.vim/plugged')

" 文件浏览器
Plug 'preservim/nerdtree'                 " 树状文件浏览器
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
Plug 'junegunn/fzf.vim'                   " 模糊文件查找

" 编辑增强
Plug 'tpope/vim-surround'                 " 快速处理环绕符号
Plug 'tpope/vim-commentary'               " 快速注释代码
Plug 'jiangmiao/auto-pairs'               " 自动补全括号
Plug 'mattn/emmet-vim'                    " HTML 快速编写

" 代码增强
Plug 'neoclide/coc.nvim', {'branch': 'release'} " 代码补全
Plug 'sheerun/vim-polyglot'               " 语法高亮增强
Plug 'dense-analysis/ale'                 " 异步语法检查

" Git 集成
Plug 'tpope/vim-fugitive'                 " Git 命令集成
Plug 'airblade/vim-gitgutter'             " 显示 Git 差异

" 界面美化
Plug 'vim-airline/vim-airline'            " 状态栏美化
Plug 'vim-airline/vim-airline-themes'     " 状态栏主题
Plug 'morhetz/gruvbox'                    " 配色方案

call plug#end()

" 插件配置
" NERDTree
nnoremap <leader>n :NERDTreeToggle<CR>
" fzf
nnoremap <leader>f :Files<CR>
nnoremap <leader>b :Buffers<CR>
" 配色方案
colorscheme gruvbox
set background=dark

5. 进阶技巧

5.1 Vim 脚本基础

Vim 脚本示例:创建一个快速插入当前日期的函数

vim
" 插入当前日期
function! InsertDate()
    let l:date = strftime('%Y-%m-%d')
    execute "normal! i" . l:date
endfunction
nnoremap <leader>d :call InsertDate()<CR>

5.2 会话管理

保存和恢复工作状态:

vim
" 保存会话
nnoremap <leader>ss :mksession! ~/.vim/sessions/
" 恢复会话
nnoremap <leader>sr :source ~/.vim/sessions/

5.3 多文件编辑

  • :e filename:编辑文件
  • :ls:显示缓冲区列表
  • :bn:下一个缓冲区
  • :bp:上一个缓冲区
  • :bd:删除缓冲区
  • :tab split:在新标签页中打开当前文件
  • :tabnew filename:在新标签页中打开文件
  • gt:下一个标签页
  • gT:上一个标签页

5.4 终端集成

Vim 8 及更高版本支持内置终端:

  • :terminal:打开终端窗口
  • 使用 Ctrl-w N 进入普通模式浏览终端输出
  • 终端配置:
vim
" 终端设置
nnoremap <leader>t :terminal<CR>
" 在插入模式下使用 Esc 退出终端模式
tnoremap <Esc> <C-\><C-n>
" 改变终端大小
nnoremap <leader>ts :resize 10<CR>

6. Vim 日常使用案例

6.1 编程场景

  • 快速导航代码:使用 ctags:tag function_name 跳转到函数定义
  • 查找错误:使用 [c]c 跳转到 Git 变化处(需要 vim-gitgutter 插件)
  • 块注释代码:使用可视块模式批量注释/取消注释
  • 重构变量名:使用 :%s/old_name/new_name/gc 全局替换
  • 快速生成代码块:使用 UltiSnips 或 Coc-snippets 插件

6.2 文档编辑场景

  • 格式化文本:使用 gq 命令配合文本对象(如 gqap 格式化段落)
  • 表格对齐:使用 Tabular 或 vim-easy-align 插件
  • 大纲导航:使用 :set foldmethod=indentzc/zo 折叠/展开章节
  • 拼写检查:set spell 开启拼写检查,]s/[s 导航拼写错误,z= 查看建议

6.3 远程编辑

  • 使用 Vim 通过 SSH 编辑远程文件:vim scp://user@server//path/to/file
  • 或使用 sshfs 挂载远程文件系统

7. 效率倍增技巧

7.1 点命令重复

. 命令重复上一次的更改,可能是 Vim 中最强大的命令之一。策略性地设计你的编辑操作,使其易于重复。

7.2 寄存器使用

Vim 有多个寄存器用于存储复制的文本:

  • 命名寄存器 "a"z:用 "ay 复制到 a 寄存器,"ap 从 a 寄存器粘贴
  • 系统剪贴板:"+y 复制到系统剪贴板,"+p 从系统剪贴板粘贴
  • 查看所有寄存器内容::reg

7.3 窗口管理

  • :split:vsplit:拆分窗口
  • Ctrl-w 命令系列:窗口管理
    • Ctrl-w v:垂直分割
    • Ctrl-w s:水平分割
    • Ctrl-w =:均匀调整窗口大小
    • Ctrl-w _:最大化当前窗口高度
    • Ctrl-w |:最大化当前窗口宽度
    • Ctrl-w o:关闭其他窗口

7.4 代码折叠

  • zf{motion}:手动创建折叠
  • :set foldmethod=syntax:根据语法创建折叠
  • :set foldmethod=indent:根据缩进创建折叠
  • zo:打开折叠
  • zc:关闭折叠
  • za:切换折叠
  • zR:打开所有折叠
  • zM:关闭所有折叠

8. 如何持续提升 Vim 技能

8.1 学习资源

  • 初学者vimtutor(终端中输入即可开始交互教程)
  • 官方文档:help
  • 在线资源

8.2 练习策略

  1. 每天学习一个新命令:通过 :help 或 Vim Tips
  2. 使用 Vim 模式插件:在其他编辑器中使用 Vim 键绑定
  3. 重新映射 Esc 键:考虑使用 jkCtrl-[ 代替
  4. 禁用箭头键,强制使用 hjkl
  5. 每周回顾你的 .vimrc,清理并改进你的配置

8.3 常见疑难解答

  • 问题:Vim 复制粘贴格式错乱 解决:使用 :set paste 然后粘贴,完成后 :set nopaste

  • 问题:终端中的颜色显示不正确 解决:在 .vimrc 中添加 set termguicolors(如果终端支持)

  • 问题:无法使用系统剪贴板 解决:确保 Vim 编译时包含了 +clipboard 特性,检查方法 :echo has('clipboard')

  • 问题:插件未正常工作 解决:检查依赖,查看插件文档和 GitHub issues

总结

Vim 的学习曲线可能较陡,但其功能的强大和效率的提升值得投入时间。从掌握基础的导航和编辑命令开始,逐步整合更多高级功能到您的工作流中。通过实践和持续学习,您将发现 Vim 不仅仅是一个文本编辑器,更是一种提升编程和文本处理效率的思维方式。

记住 Vim 的宗旨:用最少的按键完成最多的工作。随着实践的深入,您会发现自己的编辑效率正在指数级提升,而这正是 Vim 存在并受到狂热追捧的原因。