起因
发现了一个插件 https://github.com/folke/snacks.nvim 发现非常适合我,但是在配置的过程中,我发现需要理解并阅读它的源代码,同时我也想知道如何使用lua语言写neovim的插件.
准备
根据 nvim-doc NVIM_APPNAME,我们可以配置出一个单独的专门使用的配置,和我们的主nvim 配置,进行分离
1# 1. 创建一个用于学习的根目录 (可以放在任何你喜欢的地方)
2configPath="$HOME/.config/snacks-learn"
3mkdir -p $configPath
4
5# 2. 创建 lazy.vim 需要的配置、数据和状态目录
6mkdir -p $configPath/config/nvim
7mkdir -p $configPath/data
8mkdir -p $configPath/state
9mkdir -p $configPath/cache
10
11# 3. 把你的 snacks.nvim 插件克隆到这个目录中 (方便管理)
12git clone https://github.com/folke/snacks.nvim.git $configPath/snacks.nvim
1# 在.zshrc 中添加
2# 告诉 Neovim 使用 'snacks-learn' 作为配置名
3# 它会自动查找 $HOME/.config/snacks-learn/init.lua
4NVIM_APPNAME=snacks-learn nvim
1-- ~/.config/snacks-learn/init.lua
2
3-- =============================================================================
4-- 1. 设置 Neovim 的数据、配置、状态等路径
5-- 使其完全隔离在我们的 ~/snacks-learn 目录中
6-- =============================================================================
7-- 注意:我们将在启动 nvim 时使用 NVIM_APP_NAME=snacks-learn 环境变量,
8-- Neovim 会自动将 stdpath('config') 指向 ~/snacks-learn/config/nvim
9-- 我们需要手动设置其他路径,以确保完全隔离
10
11local path = vim.fn.stdpath("config")
12vim.env.XDG_DATA_HOME = path .. "/data"
13vim.env.XDG_STATE_HOME = path .. "/state"
14vim.env.XDG_CACHE_HOME = path .. "/cache"
15
16-- =============================================================================
17-- 2. 基本的 Neovim 设置 (QoL)
18-- =============================================================================
19vim.opt.number = true -- 显示行号
20vim.opt.relativenumber = true -- 显示相对行号
21vim.opt.termguicolors = true -- 启用真彩色
22vim.opt.mouse = "a" -- 启用鼠标
23vim.opt.clipboard = "unnamedplus" -- 使用系统剪贴板
24vim.opt.swapfile = false -- 关闭交换文件
25vim.opt.backup = false -- 关闭备份
26vim.opt.writebackup = false
27
28-- 设置 leader 键为空格
29vim.g.mapleader = " "
30vim.g.maplocalleader = "\\"
31
32-- =============================================================================
33-- 3. lazy.vim 插件管理器 - 引导程序
34-- =============================================================================
35-- local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
36
37-- 这里没用使用stdpath("data") 而是使用了stdpath("config"),方便我们查看
38local lazypath = vim.fn.stdpath("config") .. "/lazy/lazy.nvim"
39if not vim.loop.fs_stat(lazypath) then
40 print("正在克隆 lazy.nvim...")
41 vim.fn.system({
42 "git",
43 "clone",
44 "--filter=blob:none",
45 "https://gh-proxy.com/https://github.com/folke/lazy.nvim.git",
46 "--branch=stable", -- latest stable release
47 lazypath,
48 })
49end
50vim.opt.rtp:prepend(lazypath)
51
52-- =============================================================================
53-- 4. lazy.vim 插件设置
54-- =============================================================================
55require("lazy").setup({
56 -- 这是我们要学习的插件:snacks.nvim
57 {
58 -- 核心:使用 `dir` 关键字指向你本地克隆的路径
59 -- !! 你需要修改这个路径为你克隆 `snacks.nvim` 的实际路径 !!
60 dir = os.getenv("HOME") .. "/.config/snacks-learn/snacks.nvim",
61
62 -- `name` 是可选的,但当使用 `dir` 时,它有助于 lazy.nvim 识别插件
63 name = "snacks.nvim",
64
65 -- snacks.nvim 的依赖项
66 -- lazy.nvim 会自动从 GitHub 下载这些依赖
67 dependencies = {
68 "nvim-tree/nvim-web-devicons", -- (可选) 用于显示图标
69 "rcarriga/nvim-notify", -- (可选) 用于显示通知
70 },
71
72 -- `opts` 表格用于配置 snacks.nvim
73 -- 你可以在这里打开/关闭/配置 snacks 的各个模块
74 opts = { },
75
76 -- `config` 函数会在插件加载后运行
77 -- `snacks.nvim` 会自动调用 `setup(opts)`,所以这里通常是空的
78 -- 但你可以用它来添加额外的键位绑定等
79 config = function(_, opts)
80 require("snacks").setup(opts)
81
82 -- 示例:添加一个键位绑定来切换缩进线
83 vim.keymap.set("n", "<leader>f", function()
84 Snacks.picker.files()
85 end, { desc = "snacks files" })
86 end,
87 },
88
89 -- snacks.nvim 的依赖项 (lazy.nvim 会自动处理)
90 -- 我们不需要在这里再次列出 "nvim-tree/nvim-web-devicons" 和 "rcarriga/nvim-notify"
91 -- 因为它们已经在 snacks.nvim 的 `dependencies` 中了。
92
93 -- (可选) 添加一个主题,让界面更好看
94 { "folke/tokyonight.nvim" },
95
96})