

在我学习 Neovim 的过程中,逐渐对它的启动流程和配置加载机制有了一些理解,分享一下共大家阅读。 如有理解不对的,欢迎在评论区指正
一、Neovim 配置加载结构#
常见的 Neovim 配置目录结构如下:
~/.config/nvim/
├── init.lua # Neovim 启动入口
├── lua/
│ ├── config/ # 核心配置
│ │ ├── options.lua # vim.opt / vim.o
│ │ ├── keymaps.lua # 快捷键
│ │ ├── autocmds.lua # 自动命令
│ │ └── lazy.lua # Lazy.nvim 插件管理器
│ │
│ └── plugins/ # 插件配置
│ ├── ui.lua # UI 类插件
│ ├── lsp.lua # LSP / mason
│ ├── cmp.lua # 自动补全
│ ├── treesitter.lua # 语法高亮
│ └── init.lua # 插件入口
│
└── after/ # 启动后加载
└── ftplugin/
└── python.luaplaintext二、Neovim 启动时做了什么?#
init.lua:启动入口#
-
init.lua是 Neovim 默认且唯一的启动入口 -
启动后,Neovim 会自动加载:
plaintext~/.config/nvim/init.lua
在 init.lua 中写的任何 Lua 代码都会立即执行。
lua/ 目录与模块机制#
lua/目录 本身并不是 runtimepath 的一项- 但它是 runtimepath 中目录的子目录
- Neovim 在
require()时,会自动在所有runtimepath/lua/下查找模块
例如:
require("config.options")luaNeovim 实际查找的是:
~/.config/nvim/lua/config/options.luatext可以通过下面命令查看当前 runtimepath:
:set rtp?vimafter/ 目录的作用#
after/ 目录用于覆盖或补充已有配置,加载顺序在最后:
- 在所有
runtimepath加载完成后 - 自动加载
after/目录中的内容
三、配置拆分与加载方式#
在 init.lua 中,通常只保留最少逻辑:
require("config.options")
require("config.keymaps")
require("config.autocmds")
require("config.lazy")lua四、插件是如何被加载的?(以 Lazy.nvim 为例)#
lazy.nvim 的核心职责是:
- 自动下载插件
- 将插件路径加入 runtimepath
- 控制插件加载时机(懒加载)
require("lazy").setup({
{ "nvim-treesitter/nvim-treesitter", event = "BufReadPost" },
{ "neovim/nvim-lspconfig", ft = "lua" },
})lua当插件被加载后:
-
插件目录会被加入
rtp -
插件中的:
plugin/*.lualua/*.luaafter/*.lua
都会按规则参与加载
五、Neovim Lua API 简介#
Neovim 提供了一套完整的底层 API:
官方文档
底层 API 调用方式类似:
vim.api.nvim_set_keymap(...)
vim.api.nvim_buf_set_lines(...)lua更推荐的 Lua 高级接口#
由于底层 API 较为繁琐,Neovim 提供了更友好的 Lua 封装:
vim.o/vim.opt:设置选项vim.fn:调用 Vimscript 函数vim.cmd():执行 Vim 命令vim.keymap.set():设置快捷键
示例:
vim.opt.number = true
vim.keymap.set("n", "<leader>w", ":w<CR>")
# 如果不用vim.o的话,下面的方式过于繁琐
-- 如果不用 vim.o,下面的方式会更繁琐
vim.api.nvim_set_option_value('number', true, {})
vim.api.nvim_set_keymap(
"n",
"<leader>w",
":w<CR>",
{ noremap = true, silent = true }
)lua因此,在 Neovim 配置中,更推荐优先使用 Lua API
六、小技巧#
查看和设置选项#
是一个非常友好的选项浏览界面,方便配置option
:optionsvim