snacks源码解读

2025-09-10 00:00    #  

起因

发现了一个插件 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})