Vim 简介VimVi IMproved是Bram Moolenaar于1991年发布的Vi编辑器增强版。它遵循Unix哲学做好一件事并做到极致。为什么程序员应该选择Vim特性说明速度全键盘操作手不离键盘普适性几乎存在于所有Unix/Linux系统可定制性高度可配置适应任何工作流轻量级启动快资源占用极低思维模型编辑文本的语言而非单纯工具学习曲线真相效率 ^ │ /‾‾‾‾‾‾‾‾‾‾ │ / Vim │ / │ / │_____/__________________ 时间 普通编辑器Vim初期学习成本较高但一旦掌握基础效率将指数级超越传统编辑器。基础操作三种模式Vim的核心在于模式编辑。理解这三种模式是掌握Vim的第一步1. 普通模式Normal Mode默认模式用于导航和执行命令。 进入普通模式 按 Esc 或 Ctrl-[2. 插入模式Insert Mode文本输入模式类似传统编辑器。快捷键作用记忆i光标前插入inserta光标后插入appendI行首插入大写 更强A行尾插入大写 更强o下方新开一行openO上方新开一行大写 反向3. 可视模式Visual Mode选择模式用于批量操作。快捷键作用v字符可视模式V行可视模式Ctrl-v块可视模式列选择模式切换图┌─────────────┐ │ 普通模式 │◄────── Esc │ (Normal) │ └──────┬──────┘ │ ┌──────────┼──────────┐ │ │ │ ▼ ▼ ▼ ┌───────┐ ┌───────┐ ┌─────────┐ │ i │ │ : │ │ v │ │插入模式│ │命令模式│ │可视模式 │ │(Insert)│ │(Cmd) │ │(Visual) │ └───────┘ └───────┘ └─────────┘高效移动与导航基础移动hjklk h l j为什么用hjkl而不是方向键手不需要离开主键区与后续组合命令形成肌肉记忆单词级移动命令作用说明w下一个单词开头wordb上一个单词开头backe当前/下一个单词结尾endge上一个单词结尾反向end大写 vs 小写区别w/b/e以非单词字符分隔如空格、标点W/B/E以空白字符分隔更快跨越代码行内移动命令作用0行首第0列^行首第一个非空字符$行尾g_行尾最后一个非空字符f{char}跳到字符findt{char}跳到字符前till;重复上次f/t,反向重复上次f/t示例defhello_world():# ^ 按 ^ 到这里# ^^^^^ 按 fw 跳到 w# ^ 按 $ 到这里屏幕与文件导航命令作用gg文件开头G文件结尾:{n}跳到第n行Ctrl-u上半页upCtrl-d下半页downCtrl-b上一页backwardCtrl-f下一页forwardH屏幕顶部HighM屏幕中间MiddleL屏幕底部Low代码结构导航命令作用%匹配括号()[]{}*搜索当前单词向下#搜索当前单词向上gd跳转到局部定义gD跳转到全局定义编辑与修改艺术操作符Operator 动作Motion这是Vim最强大的概念动词 名词常用操作符操作符作用ddelete删除cchange修改yyank复制缩进反缩进自动格式化组合示例dw 删除到下一个单词开头 diw 删除当前单词delete inner word ci 修改引号内的内容change inside yap 复制当前段落yank around paragraph dt; 删除到分号前文本对象Text Objects文本对象允许你操作成对或结构化的内容对象说明示例iw/aw单词inner/arounddiw删除单词is/as句子yas复制句子ip/ap段落dap删除段落i/a引号内ci修改引号内容i(/a(括号内da(删除包括括号i{/a{花括号内yi{复制花括号内it/atHTML标签内cat修改标签内容记忆法i inner内部a around包括边界寄存器系统Vim不使用系统剪贴板而是有多级寄存器寄存器用途默认寄存器0复制专用寄存器1-9删除历史9个系统剪贴板*主选择区Linux/上次搜索:上次命令使用示例ayy 复制当前行到寄存器a ap 粘贴寄存器a的内容 yy 复制到系统剪贴板 p 从系统剪贴板粘贴宏录制Macro自动化重复任务的神器qa 开始录制到寄存器a ... 执行操作 q 停止录制 a 播放宏 重复上次宏 10a 播放10次实战示例将CSV转换为JSON 录制宏a qa I{ name: EscA, age: Escj0q 应用到剩余行 VG:normal aVim 配置与个性化基础配置~/.vimrc 基础设置 set nocompatible 关闭Vi兼容模式 set number 显示行号 set relativenumber 相对行号方便跳转 set cursorline 高亮当前行 set laststatus2 总是显示状态栏 set showcmd 显示部分命令 缩进与格式 set expandtab Tab转空格 set shiftwidth4 自动缩进宽度 set softtabstop4 Tab键宽度 set tabstop4 Tab显示宽度 set autoindent 自动缩进 set smartindent 智能缩进 搜索设置 set hlsearch 高亮搜索结果 set incsearch 增量搜索 set ignorecase 忽略大小写 set smartcase 智能大小写有大写时区分 性能优化 set lazyredraw 批量操作时不重绘 set ttyfast 快速终端连接 set updatetime300 更新延迟 实用功能 set clipboardunnamedplus 使用系统剪贴板 set undofile 持久化撤销 set backupdir~/.vim/backup// 备份文件目录 set directory~/.vim/swap// 交换文件目录 set wildmenu 命令行补全增强 set wildmodelist:longest,full 快捷键映射 let mapleader 设置leader键为空格 快速保存/退出 nnoremap leaderw :wCR nnoremap leaderq :qCR nnoremap leaderx :xCR 快速切换窗口 nnoremap C-h C-wh nnoremap C-j C-wj nnoremap C-k C-wk nnoremap C-l C-wl 清除搜索高亮 nnoremap leaderh :nohlsearchCR 系统复制粘贴 vnoremap leadery y nnoremap leaderp p 编程增强 syntax on 语法高亮 filetype plugin indent on 文件类型检测 set completeoptmenu,menuone,noselect 补全选项配色方案推荐 内置配色 colorscheme desert colorscheme molokai colorscheme gruvbox 推荐安装 - gruvbox复古护眼 - dracula现代暗色 - nord北极蓝调 - one-darkAtom风格插件生态系统现代Vim开发离不开插件管理器。推荐使用vim-plug安装vim-plugcurl-fLo~/.vim/autoload/plug.vim --create-dirs\https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.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代码补全 安装后配置 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-analyzer2. NERDTree文件树nnoremap leadern :NERDTreeToggleCR nnoremap leaderf :NERDTreeFindCR 自动关闭 autocmd BufEnter * if tabpagenr($) 1 winnr($) 1 exists(b:NERDTree) b:NERDTree.isTabTree() | quit | endif3. fzf模糊查找nnoremap leaderff :FilesCR nnoremap leaderfg :RgCR nnoremap leaderfb :BuffersCR nnoremap leaderfh :HistoryCR编程语言支持Python开发配置 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 安装 coc-tsserver 后 autocmd FileType javascript,typescript setlocal shiftwidth2 tabstop2 常用快捷键 nmap leaderrn Plug(coc-rename) 重命名 nmap leaderf Plug(coc-format-selected) 格式化Rust 使用 coc-rust-analyzer let g:rustfmt_autosave 1 保存时自动格式化 Cargo集成 command! CargoBuild :!cargo build command! CargoTest :!cargo test nnoremap leadercb :CargoBuildCR nnoremap leaderct :CargoTestCR高级技巧与工作流1. 多文件编辑 缓冲区管理 :buffers 列出所有缓冲区 :b 2 切换到缓冲区2 :bd 删除当前缓冲区 :bnext / :bprev 切换缓冲区 分屏 :split 或 :sp 水平分割 :vsplit 或 :vsp 垂直分割 Ctrl-w c 关闭当前窗口 Ctrl-w o 只保留当前窗口 标签页 :tabnew 新建标签页 gt / gT 切换标签页 :tabs 列出标签页2. 外部命令集成:!ls 执行shell命令 :r !date 插入命令输出到文件 :.!python3 用Python处理当前行 :%!jq . 用jq格式化JSON3. 快速替换 基础替换 :s/old/new/ 替换当前行第一个 :s/old/new/g 替换当前行所有 :%s/old/new/g 替换整个文件 :%s/old/new/gc 替换前确认 使用当前单词 :%s/C-rC-w/new/g 将当前单词替换为new 多文件替换 :arg *.py :argdo %s/foo/bar/gc | update4. 标记与跳转ma 在当前位置设置标记a a 跳转到标记a精确位置 a 跳转到标记a行首 :marks 列出所有标记 特殊标记 . 上次编辑位置 ^ 上次插入位置 [ 上次修改开始 ] 上次修改结束5. 会话管理: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 WikiReddit r/vim书籍《Practical Vim》- Drew Neil《Learn Vimscript the Hard Way》