版本信息最后核对:2026-10-25
默认配置能用,但希望统一缩进、显示行号、把常用操作绑到 leader 键,或者需要补全、LSP、语法高亮和文件浏览。这一页从最小 .vimrc 开始,再讲插件安装和启动排错。先确认自己用的是 Vim 还是 Neovim:配置路径不同,Vim9 script 和 Lua 也不能混用;选型见 vim-vs-neovim。
Vim 读取 ~/.vimrc 或 ~/.vim/vimrc;Windows 常见位置是 %USERPROFILE%\_vimrc。Neovim 读 ~/.config/nvim/init.vim 或 init.lua,不自动读 ~/.vimrc。进入编辑器后用 :echo $MYVIMRC 确认实际加载的文件,:source % 重新加载当前配置。
| 环境 | 配置文件 |
|---|---|
| Linux/macOS Vim | ~/.vimrc 或 ~/.vim/vimrc |
| Neovim | ~/.config/nvim/init.vim 或 init.lua |
set nocompatible
filetype plugin indent on
set number relativenumber tabstop=4 shiftwidth=4 expandtab
set ignorecase smartcase hlsearch incsearch mouse=a undofile undodir=~/.vim/undo//
undodir 指向的目录要先建好,否则撤销文件写不进去;团队项目还应配 .editorconfig,不要只靠个人 .vimrc 统一缩进。set clipboard=unnamedplus 只有 Vim 编译了 +clipboard 才生效,先用 :echo has('clipboard') 检查;Neovim 改查 :checkhealth provider。
映射命令的前缀表示模式:n 普通、i 插入、v 可视、x 可视选择、c 命令行、t 终端;map 同时作用于普通、可视和操作符模式。noremap 不递归解析右侧映射,能避免插件之间的连锁替换和循环。
let mapleader = " "
nnoremap <leader>w :w<CR>
inoremap jk <Esc>
nnoremap <silent> <leader>h :nohlsearch<CR>
<leader> 默认是反斜杠,很多配置改成空格;它必须在定义映射之前设置,之后再改不会影响已有映射。用 :verbose nmap <leader>w 查某个映射由哪个文件定义;<localleader> 留给文件类型插件。插件通常提供 <Plug> 映射,优先映射到 <Plug>,不要复制插件内部实现。
插件管理器负责下载、更新和清理;Vim 8 和 Neovim 也自带 package 机制。vim-plug 的入口是 plug.vim,先把它放到 ~/.vim/autoload(可从项目仓库下载),再在配置里声明插件。
call plug#begin('~/.vim/plugged')
Plug 'tpope/vim-surround'
Plug 'junegunn/fzf', { 'do': { -> fzf#install() } }
call plug#end()
装好后用 :PlugInstall、:PlugUpdate、:PlugClean、:PlugStatus 管理。不装管理器时,Vim 8+ 可以把插件克隆到 pack/*/start 随启动加载,或放到 pack/*/opt 用 :packadd 按需加载;例如 mkdir -p ~/.vim/pack/vendor/start 后把插件目录放进去。
Neovim 0.5 起内置 LSP 客户端,0.11 起可用 vim.lsp.config 和 vim.lsp.enable 组织服务器配置;更早的版本通常搭配 nvim-lspconfig。补全、诊断和跳转仍要自己绑键位。Vim 9.1 没有开箱即用的 LSP 客户端,常用 coc.nvim、vim-lsp 或 ALE,它们通过 Vim 的 channel 与语言服务器通信。
-- Neovim 0.11+:先注册服务器,再按文件类型启用
vim.lsp.config('lua_ls', {
settings = { Lua = { diagnostics = { globals = { 'vim' } } } },
})
vim.lsp.enable('lua_ls')
Tree-sitter 在 Neovim 中由 vim.treesitter API 和 nvim-treesitter 等插件提供解析器,负责更准确的语法高亮、折叠和增量选择;Vim 侧仍以正则语法高亮为主。LSP 与 Treesitter 都会增加启动和内存开销,先测量再决定是否常驻。
先看内置能力,再考虑插件:netrw 能浏览文件,:find 和通配符补全能找文件,:make/:grep 能填 quickfix,Neovim 自带 LSP 和终端。插件解决体验问题,不是所有需求都要装。
| 需求 | 内置或轻量方案 | 常见插件方向 |
|---|---|---|
| 文件浏览 | netrw、:e |
oil.nvim、nvim-tree |
| 模糊查找 | :find、通配符补全 |
fzf.vim、telescope.nvim |
| 补全/LSP | Neovim vim.lsp |
nvim-cmp、coc.nvim |
| 语法高亮 | 内置 regex 语法 | nvim-treesitter |
| Git/状态栏 | :!git、默认 statusline |
fugitive、gitsigns、lualine |
选择标准是维护活跃、文档清楚、依赖少、能用 --startuptime 量化成本;优先选能按文件类型或命令懒加载的插件。不要一次装十几个再排查冲突,每加一个就验证启动、撤销、剪贴板和搜索。
启动报错或变慢时,先区分是配置、插件还是环境问题。vim -u NONE 跳过用户配置,--clean 接近默认且不加载用户插件;若问题消失,再逐步二分 .vimrc 和插件列表。
vim --startuptime /tmp/vim-startup.log +q
vim -u NONE
nvim --headless "+checkhealth" +qa
:scriptnames 看加载顺序,:verbose set shiftwidth? 查选项最后由谁设置,:messages 看启动错误。Neovim 用 :checkhealth 检查 provider、LSP 和剪贴板;Vim 侧可用 :profile start /tmp/vim-profile.log 配合 :profile func * 定位慢函数。常见原因:插件管理器没装导致 E117: Unknown function: plug#begin;mapleader 写在映射之后;clipboard 没有编译特性支持;Neovim 仍去改 ~/.vimrc;插件要求更新的版本。
nmap 和 nnoremap 有什么区别?为什么通常优先用 noremap?E117: Unknown function: plug#begin,最可能的原因和修复方式是什么?nmap 会递归解析右侧映射,容易触发插件映射和循环;nnoremap 不递归,行为可预测,所以自定义映射优先用它。plug.vim 没有放到 autoload 目录,或 plug#begin 在插件加载前被调用;按文档安装 plug.vim 后重试。vim --startuptime 看各阶段耗时,用 -u NONE 和 --clean 对照,再用 :scriptnames、:verbose set 和二分配置定位具体文件。
小程序版
微信扫码,随时查命令