nvim
Neovim(nvim)是 Vim 的社区重构版本,目标是可扩展、可嵌入、可维护。原生支持 Lua 配置、内置 LSP 客户端、异步任务,现代插件生态远活跃于 Vim。
# 轻量吗
| 维度 | 数值 |
|---|---|
| 二进制大小 | ~30MB |
| 无插件启动时间 | 30-50ms |
| 空编辑器内存 | 10-20MB |
| 常用插件后内存 | 100-200MB |
| VS Code 对比 | 500MB+ |
结论:nvim 本身很轻量,"重"的是插件。通过懒加载(lazy.nvim)可以保持启动速度 < 100ms。
# 安装
# macOS
brew install neovim
# 启动
nvim
# 查看版本
nvim --version
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
配置文件路径:~/.config/nvim/init.lua(推荐 Lua)或 init.vim。
# nvim vs vim
| 维度 | vim | nvim |
|---|---|---|
| 配置语言 | Vimscript | Lua 原生支持 |
| LSP | 需插件(coc.nvim) | 0.5+ 内置 LSP 客户端 |
| 异步 | vim 8 后支持,API 老 | 原生成熟 job API |
| 终端 | 有但集成一般 | 内置终端,可当 pane |
| 插件生态 | 老旧稳定 | 现代插件爆发,很多 nvim 专属 |
| 启动速度 | 较快 | 通常更快 |
| 维护 | 缓慢维护 | 活跃迭代 |
会 vim 就会 nvim:所有快捷键、操作模式、命令 100% 兼容。
# 基础配置(init.lua)
-- 基础选项
vim.opt.number = true -- 显示行号
vim.opt.relativenumber = true -- 相对行号
vim.opt.tabstop = 4 -- Tab 宽度
vim.opt.shiftwidth = 4 -- 缩进宽度
vim.opt.expandtab = true -- Tab 转空格
vim.opt.smartindent = true -- 智能缩进
vim.opt.termguicolors = true -- 真彩色
vim.opt.cursorline = true -- 高亮当前行
vim.opt.mouse = 'a' -- 启用鼠标
vim.opt.clipboard = 'unnamedplus' -- 与系统剪贴板共享
vim.opt.ignorecase = true -- 搜索忽略大小写
vim.opt.smartcase = true -- 搜索含大写时区分大小写
vim.opt.wrap = false -- 不自动换行
vim.opt.swapfile = false -- 不生成 swap 文件
vim.opt.backup = false -- 不生成备份文件
vim.opt.undofile = true -- 持久化撤销
-- 领导者键
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
-- 常用快捷键
vim.keymap.set('n', '<leader>w', ':w<CR>', { desc = '保存' })
vim.keymap.set('n', '<leader>q', ':q<CR>', { desc = '退出' })
vim.keymap.set('n', '<leader>x', ':x<CR>', { desc = '保存并退出' })
vim.keymap.set('n', '<leader>h', ':nohlsearch<CR>', { desc = '清除搜索高亮' })
vim.keymap.set('n', '<C-l>', '<C-w>l', { desc = '移动到右窗口' })
vim.keymap.set('n', '<C-h>', '<C-w>h', { desc = '移动到左窗口' })
vim.keymap.set('n', '<C-j>', '<C-w>j', { desc = '移动到下窗口' })
vim.keymap.set('n', '<C-k>', '<C-w>k', { desc = '移动到上窗口' })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 插件管理:lazy.nvim
-- 自动安装 lazy.nvim
local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim'
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
'git', 'clone', '--filter=blob:none',
'https://github.com/folke/lazy.nvim.git',
'--branch=stable', lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
-- 插件列表
require('lazy').setup({
-- 颜色主题
{ 'folke/tokyonight.nvim', config = function() vim.cmd('colorscheme tokyonight') end },
-- 文件树
{ 'nvim-tree/nvim-tree.lua', dependencies = { 'nvim-tree/nvim-web-devicons' },
config = true, keys = { { '<leader>e', ':NvimTreeToggle<CR>', desc = '文件树' } } },
-- 模糊搜索
{ 'nvim-telescope/telescope.nvim', dependencies = { 'nvim-lua/plenary.nvim' },
keys = {
{ '<leader>ff', ':Telescope find_files<CR>', desc = '搜索文件' },
{ '<leader>fg', ':Telescope live_grep<CR>', desc = '搜索内容' },
{ '<leader>fb', ':Telescope buffers<CR>', desc = '搜索缓冲区' },
} },
-- LSP 配置
{ 'neovim/nvim-lspconfig' },
{ 'williamboman/mason.nvim', config = true },
{ 'williamboman/mason-lspconfig.nvim', config = true },
-- 补全
{ 'hrsh7th/nvim-cmp', dependencies = {
'hrsh7th/cmp-nvim-lsp', 'hrsh7th/cmp-buffer', 'hrsh7th/cmp-path',
'L3MON4D3/LuaSnip', 'saadparwaiz1/cmp_luasnip',
} },
-- 快捷键提示
{ 'folke/which-key.nvim', config = true },
-- 状态栏
{ 'nvim-lualine/lualine.nvim', config = true },
-- 语法高亮
{ 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate',
config = function()
require('nvim-treesitter.configs').setup({
ensure_installed = { 'lua', 'python', 'javascript', 'typescript', 'go', 'rust', 'bash', 'json', 'yaml', 'markdown' },
highlight = { enable = true },
})
end },
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 常用插件推荐
| 插件 | 用途 |
|---|---|
telescope.nvim | 模糊搜索(文件、内容、Git) |
nvim-tree.lua / neo-tree.nvim | 文件树 |
nvim-lspconfig | LSP 配置 |
mason.nvim | LSP 服务器一键安装 |
nvim-cmp | 补全引擎 |
LuaSnip | 代码片段 |
nvim-treesitter | 语法高亮(比默认更准) |
which-key.nvim | 快捷键提示 |
lualine.nvim | 状态栏 |
bufferline.nvim | 标签栏 |
tokyonight.nvim | 颜色主题 |
gitsigns.nvim | Git 行内标记 |
comment.nvim | 快速注释 |
autopairs | 自动配对括号 |
# LSP 配置示例
local lspconfig = require('lspconfig')
local capabilities = require('cmp_nvim_lsp').default_capabilities()
-- Python
lspconfig.pyright.setup({ capabilities = capabilities })
-- TypeScript/JavaScript
lspconfig.tsserver.setup({ capabilities = capabilities })
-- Go
lspconfig.gopls.setup({ capabilities = capabilities })
-- Rust
lspconfig.rust_analyzer.setup({ capabilities = capabilities })
-- Lua(nvim 配置专用)
lspconfig.lua_ls.setup({
capabilities = capabilities,
settings = { Lua = { diagnostics = { globals = { 'vim' } } } },
})
-- LSP 快捷键
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { desc = '跳转到定义' })
vim.keymap.set('n', 'gr', vim.lsp.buf.references, { desc = '查找引用' })
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, { desc = '跳转到实现' })
vim.keymap.set('n', 'K', vim.lsp.buf.hover, { desc = '悬浮文档' })
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, { desc = '重命名' })
vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, { desc = '代码操作' })
vim.keymap.set('n', '<leader>f', vim.lsp.buf.format, { desc = '格式化' })
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = '上一个诊断' })
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = '下一个诊断' })
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 内置终端
:terminal " 打开终端
:ter " 简写
1
2
2
终端模式快捷键:
Ctrl+\ Ctrl+n— 从终端模式回到普通模式- 在普通模式下按
i或a回到终端交互
# 学习路径
- 会 vim:nvim 的操作与 vim 完全一致,先掌握 vim 基础
- init.lua:从基础选项开始,逐步添加配置
- lazy.nvim:用插件管理器管理插件
- LSP:配置语言服务器,获得 IDE 级体验
- Telescope:掌握模糊搜索,提升效率
- 自定义:根据自己的工作流调整快捷键和插件
推荐入门配置:kickstart.nvim (opens new window) — 官方推荐的单文件入门配置,注释详尽。
# 注意事项
- nvim 的配置目录是
~/.config/nvim/,与 vim 的~/.vimrc不冲突,可以共存 - 插件数据目录是
~/.local/share/nvim/,出问题可以删除后重装 - 第一次启动会自动安装 lazy.nvim 和插件,需要网络连接
- LSP 服务器通过
:Mason命令管理,图形化界面安装/更新/卸载
上次更新: 2026/09/10, 14:32:04