用了好几年 Vim,去年开始切到 Neovim,体验好了不少。把配置思路记下来,省得下次重装又要从头找。

为什么换 Neovim

  • 原生 Lua 配置,比 Vimscript 好写好读
  • 内置 LSP 支持,不需要装 coc.nvim 之类的大插件
  • 异步渲染,不卡
  • 社区活跃,插件生态比 Vim 好很多

配置目录结构

Neovim 的配置放在 ~/.config/nvim/,我用的结构:

~/.config/nvim/
├── init.lua          # 入口文件
└── lua/
    ├── core/
    │   ├── options.lua    # 基础选项
    │   ├── keymaps.lua    # 快捷键
    │   └── autocmds.lua   # 自动命令
    └── plugins/
        ├── init.lua       # 插件列表(lazy.nvim)
        ├── lsp.lua        # LSP 配置
        ├── treesitter.lua # 语法高亮
        └── ...

包管理器:lazy.nvim

目前最好用的 Neovim 插件管理器,支持懒加载,启动速度快。

init.lua 里引导安装:

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("plugins")

基础选项

-- lua/core/options.lua
local opt = vim.opt

opt.number = true           -- 显示行号
opt.relativenumber = true   -- 相对行号
opt.tabstop = 4
opt.shiftwidth = 4
opt.expandtab = true
opt.smartindent = true
opt.wrap = false            -- 不折行
opt.cursorline = true       -- 高亮当前行
opt.termguicolors = true    -- 真彩色
opt.signcolumn = "yes"      -- 始终显示符号列,避免跳动
opt.scrolloff = 8           -- 光标距顶/底保持 8 行
opt.clipboard = "unnamedplus"  -- 与系统剪贴板共享

常用插件

插件用途
nvim-treesitter语法高亮和代码结构解析
nvim-lspconfigLSP 配置框架
nvim-cmp自动补全
telescope.nvim模糊搜索文件/内容
neo-tree.nvim文件树
gitsigns.nvimGit 行内标记
lualine.nvim状态栏
tokyonight.nvim配色方案

LSP 配置

先装语言服务器,以 Python 为例:

# 用 Mason 统一管理 LSP 服务器
:MasonInstall pyright

配置:

local lspconfig = require("lspconfig")

lspconfig.pyright.setup({
  on_attach = function(client, bufnr)
    -- 快捷键绑定
    local opts = { buffer = bufnr }
    vim.keymap.set("n", "gd", vim.lsp.buf.definition, opts)
    vim.keymap.set("n", "K",  vim.lsp.buf.hover, opts)
    vim.keymap.set("n", "<leader>rn", vim.lsp.buf.rename, opts)
    vim.keymap.set("n", "<leader>ca", vim.lsp.buf.code_action, opts)
  end
})

我的 Leader 键映射

vim.g.mapleader = " "   -- 空格作为 leader

-- 文件搜索
vim.keymap.set("n", "<leader>ff", "<cmd>Telescope find_files<cr>")
-- 内容搜索
vim.keymap.set("n", "<leader>fg", "<cmd>Telescope live_grep<cr>")
-- 文件树
vim.keymap.set("n", "<leader>e", "<cmd>Neotree toggle<cr>")
-- 保存
vim.keymap.set("n", "<leader>w", "<cmd>w<cr>")
-- 关闭 buffer
vim.keymap.set("n", "<leader>q", "<cmd>bd<cr>")

整体折腾下来大概花了两三天,配置文件放在 GitHub 上了,换机器直接 clone 下来就能用。