05-配置与插件基础
第 5 章 配置与插件基础
我已经多次谈到插件,你甚至在第 1 章就看到了 Lazy.nvim 插件管理器的实际操作。LazyVim 有一种独特的多层方法来管理插件,这需要一些学习,但在实践中相当优雅。
安装插件允许你配置 Neovim 来完成它默认无法完成的事情。插件通常用 Lua 或 VimScript 编写,尽管 Neovim 的远程插件架构也支持其他语言。
译者注: Neovim 的远程插件 (Remote Plugins) 允许使用其他语言(如 Python, Ruby, Node.js 等)编写插件,这些插件通过 RPC (远程过程调用) 与 Neovim 核心交互。
我这里也有一个秘制的教程 -> 快速RPC开发
5.1. LazyVim 中插件的三种类别
在 LazyVim 中最容易使用的插件是由 LazyVim 自己预装的。你已经使用过其中的许多了。有些,如 Snacks.nvim 的选择器和 explorer 窗口,以及 Lazy.nvim,提供了自定义 UI 组件来与之交互。其他的,如 flash.nvim 和 which-key,提供了新的命令或模式来使用。还有一些则在后台悄悄运行,自动匹配括号或标签,并自动缩进。
这些插件在 LazyVim 中预先配置了合理的默认值。因为它们集成得很好,当然定制这些默认值也是可行的,但有时需要一些技巧,我们将在本章及后续章节中介绍。
LazyVim 中的第二类插件是“Lazy Extras”。这些插件默认未启用,但如果你需要它们,只需几次按键即可启用。Lazy Extras 的存在是为了方便安装流行的插件,并保证其配置能与 LazyVim 自带的其他插件良好协作。
第三类包括 LazyVim 不知晓的第三方插件。你将不得不从头开始配置这些插件,并自行进行尽职调查,以确保快捷键和视觉效果不与 LazyVim 管理的插件冲突。在非 LazyVim 配置中,所有插件都属于这一类,随着时间的推移,插件的演变和废弃可能导致维护成为一个头痛的问题。在 LazyVim 中,这一类只包含相对较少的插件,因此整个体验要愉快得多。
作为一些具体例子,考虑这三个用于文件管理的 Neovim 插件,我们在前一章讨论了其中两个:
-
Snacks explorer
随 LazyVim 一起提供,并默认激活。Explorer 的 LazyVim 配置默认不与其他 LazyVim 插件冲突。然而,如果你想调整该配置,可能需要费些周折。
-
Mini.files
作为 Lazy Extra 提供,基本上是“一键”(或者,既然我们在谈论 Vim,那就是一次按键!)安装,并且期望能与 LazyVim 良好协作。
-
Oil.nvim
是另一个用于文件系统管理的替代插件,LazyVim 没有明确支持。你可以在 LazyVim 中通过几行配置来安装它,但这不像设置 mini.files 那么容易,并且无法保证它可以正常使用,没有快捷键冲突。
从 Neovim 的角度来看,所有这些插件都完全相同,因为 Neovim 只知道第三方插件。LazyVim 只是附带了一些额外的结构,你在使用插件时需要考虑这些结构。通常这种结构简化了事情,但偶尔也会增加额外的麻烦。
5.2. Lazy Extras
在上一章中,我介绍了如何启用和使用 mini.files
,但安装说明相当简洁。现在我们将深入探讨。
可以通过在启动面板上按 x
来访问 Lazy Extras 模式。如果你不在启动面板上,你需要用 :
进入命令模式,然后输入 LazyExtras
,最后像往常一样按 Enter
确认命令(顺便说一句,你也可以随时通过输入命令 :lua Snacks.dashboard()
或将其绑定到某个按键来显示启动面板)。
无论哪种方式,你都会看到一个可供安装的插件列表。在我的设置中,它看起来如下:
图 24. Lazy Extras
目前我已经安装了十几个 extra,主要是为了我涉猎的各种编程语言。你可以使用所有标准的导航命令(如 j
、k
或 s
)来浏览这个文件。
无论你如何到达那里,一旦你的光标位于你想要安装的 extra(例如 editor.mini-files
)所在的行上,只需按 x
键即可安装该 extra。如果你想卸载它,做同样的事情;移动到相应的行(现在位于 Enabled
extras 列表下),然后按 x
禁用该 extra。这里的助记符是 x
代表“Extra”。
译者注: Lazy Extras 通常按类别组织,如
lang.python
(Python 语言支持),editor.mini-files
(编辑器功能),ui.bufferline
(用户界面) 等。
你可能需要退出并重启 Neovim,Lazy.nvim 才能检测到 extra 已安装并同步其依赖项。
当我们在 LazyExtras
屏幕时,我建议为你最常使用的编程语言启用 lang.*
extras。你也应该安装“推荐插件”部分的所有插件(它们旁边有星形图标)。
我不建议安装任何其他非推荐的 extras,除非你在本书后面遇到它们,或者在读完本书后有机会研究它们。否则,它们可能会以我无法预见的方式改变编辑器的默认行为。
你可以通过访问 https://lazyvim.org 并点击左侧菜单栏上的“Extras”菜单项来查找每个 extra 的更多信息。它包含了每个 extra 安装的插件列表以及 LazyVim 为该 extra 提供的配置的链接。
5.3. 禁用内置插件
早晚有一天,你会想要编辑你的 LazyVim 配置。开箱即用的默认设置非常棒,但它们不可能 100% 符合你的个人需求。
虽然 LazyVim 的绝大多数默认插件都是你想要保留的、无需动脑的选择,但你可能会发现有一两个插件你根本不需要。在大多数情况下,这无关紧要,因为 LazyVim 只在你实际使用插件时才加载它们,所以你可以忽略那些与你无关的插件。
我唯一禁用的 LazyVim 插件是 bufferline。我将演示如何做到这一点,你可以将其应用于任何其他你想禁用的内置插件。
译者注: Bufferline 是一个 UI 组件,通常显示在 Neovim 窗口顶部,用于列出并切换已打开的缓冲区(类似其他编辑器的标签页)。
首先,我想介绍一下 LazyVim 的配置目录。你可以通过按 c
键从启动面板打开配置目录。或者你可以随时使用 <Space>fc
(“查找配置文件”Find Config File)通过 Space 模式访问配置文件。
这将会在你的文件选择器中加载 LazyVim 配置文件夹。这个文件夹通常是 $HOME/.config/nvim
。Neovim 默认加载 $HOME/.config/nvim/init.lua
,如果你没有使用 LazyVim,这里就是你进行所有配置的地方。
译者注:
$HOME
通常指用户的主目录,在 Linux/MacOS 上是~
,在 Windows 上可能是C:\Users\<用户名>
。
使用 LazyVim 时,init.lua
只是使用 Lua 的 require
语句来包含 LazyVim 的配置基础结构。你通常不需要动这个文件,即使大多数第三方插件的安装文件都假定你的配置在这个文件中。相反,请遵循本章概述的“LazyVim 方式”。
除了一个精简的 init.lua
,LazyVim 还在配置目录中放置了一些配置文件和一点文件夹结构。
目前,我们需要知道的主要事情是,lua/plugins
子目录内的任何 Lua 文件都会被 LazyVim 自动加载,无论它们的文件名是什么。我的这个文件夹里有许多不同的文件用于我的自定义配置。
我把我用来存放已禁用插件的文件命名为 disabled.lua
。创建这个文件的最简单方法是打开一个现有的配置文件,然后使用 explorer 或 mini.files 在同一文件夹中创建一个新文件,如第 4 章所述。
当我在 lua/plugins
目录下创建我的 disabled.lua
文件时,我的目的是把我所有不想要的 LazyVim 插件都收集在里面,因为我假设 LazyVim 不会完全符合我的需求。实际上,这个列表非常短!这个文件的内容仅仅是:
列表 12. 禁用 LazyVim 插件
-- lua/plugins/disabled.lua
return {
{ "akinsho/bufferline.nvim", enabled = false },
-- 如果你想禁用其他插件,在这里添加更多行
-- { "插件作者/插件仓库名", enabled = false },
}
如果还有其他 LazyVim 默认启用而你不想使用的插件,只需遵循相同的语法。每个 Lua 表(table)中的第一个参数是包含你想要禁用的 GitHub 仓库(带所有者)的字符串。第二个参数是设置 enabled = false
。就是这样!
译者注: Lua 中的 Table 是一种非常灵活的数据结构,可以同时用作数组(按数字索引)和字典/哈希表(按键索引)。这里的
{ "akinsho/bufferline.nvim", enabled = false }
是一个 Table,其中"akinsho/bufferline.nvim"
是位置 1 的值(数组部分),enabled = false
是一个键值对(字典部分)。整个文件返回一个包含这些 Table 的 Table(作为列表使用)。
你迟早会在某个时候忘记插件文件开头的 return
语句。别担心,最起码现在你知道你要注意它了。
如果你不懂 Lua 语言……老实说,别担心。我从未正式学习过它,但我通过耳濡目染学到的东西足以轻松维护我的 Neovim 配置。
如果你不像我那么傻,你可能想输入 :help lua
并阅读关于该主题的官方 Neovim 文档。然后查看 :help lua-guide-api
来了解 vim 特定的 API。
5.4. 修改快捷键(示例)
快捷键是我不太喜欢使用 LazyVim 的少数几件事之一,尽管这不完全是 LazyVim 的错。我只是总搞不清到底在哪里定义它们!
根据任何一个插件的配置方式,有三个可能的地方来配置快捷键:
- 在
.config/nvim/lua/config/keymaps.lua
中。这通常是你修改核心 Neovim 或 LazyVim 功能的快捷键的地方。 - 在传递给插件的 Lua 表(在 Lua 中,“表”table 类似于许多其他动态语言中数组和记录或字典的组合)的
keys
字段中。这是你映射全局普通模式快捷键来设置插件的地方。我们将对 mini.files 这样做。 - 在传递给插件配置的
opts
(选项)参数中。任何一个插件的选项格式都是插件特定的,但许多插件倾向于通过选项为你设置键映射,而不是让你自己进行映射。如果键映射定义了一个不同的“模式”或者只在插件当前打开或激活时应用,则尤其如此。我也会用 mini.files 给出这方面的一个例子。
为了演示,我想“修复”mini.files 没有“在根目录中打开”选项的设置。我喜欢“在当前文件所在目录中打开”的选项,但我也希望能够打开根目录。
记住,根目录是根据某些特定语言的文件(如 package.json
或 Cargo.toml
)的存在而确定的当前项目的顶层目录。cwd
是编辑器的当前工作目录。
由于我不使用 explorer,我将覆盖掉 <Space>e
和 <Space>E
快捷键并将其用于 mini.files,然后我将重新映射现有的 <Space>fm
快捷键来打开根目录,这样我就可以访问所有三个命令。当然,如果不同的快捷键更符合你的心智模型,或者你喜欢 explorer 的某些功能,你可以选择不同的快捷键。
我使用 mini.files 在我的 .config/nvim/lua/plugins/
目录下创建了一个名为 extend-mini-files.lua
的新文件。与 disabled.lua
文件一样,这个文件只要在 plugins
目录下,可以命名为任何名称。
我习惯于将任何我用来更改 LazyVim 提供的默认值的配置前缀加上 extend
。这使得当我在使用 mini.files 或选择器列出目录时,很容易将其与我安装的非 LazyVim 插件区分开来。
在这个新文件中,我使用了以下代码:
列表 13. Mini.files 自定义键映射
-- lua/plugins/extend-mini-files.lua
return {
"echasnovski/mini.files", -- 指定这是对 mini.files 插件的配置
keys = {
-- 重新映射 <Space>e 打开当前文件所在目录
{
"<leader>e", -- 键位序列 (<leader> 通常是 Space)
function()
-- 打开 mini.files,vim.api.nvim_buf_get_name(0) 获取当前缓冲区文件名作为路径
require("mini.files").open(vim.api.nvim_buf_get_name(0), true)
end,
desc = "打开 mini.files (当前文件所在目录)", -- 在 which-key 菜单中显示的描述
},
-- 重新映射 <Space>E 打开当前工作目录 (cwd)
{
"<leader>E",
function()
-- 打开 mini.files,vim.uv.cwd() 获取当前工作目录作为路径
require("mini.files").open(vim.uv.cwd(), true)
end,
desc = "打开 mini.files (cwd)",
},
-- 重新映射 <Space>fm 打开项目根目录
{
"<leader>fm",
function()
-- 打开 mini.files,LazyVim.root() 获取项目根目录作为路径
require("mini.files").open(LazyVim.root(), true)
end,
desc = "打开 mini.files (根目录)",
},
},
}
我是通过从 LazyVim 网站上方便提供的 Snacks.nvim 配置的默认配置中提取相关函数调用来构建这个的。
为了满足与 Lazy.nvim 的约定,我们需要返回一个用花括号包裹的 Lua 表。Lua 表可以同时像数组和字典一样工作。在这种情况下,表中的第一个元素是字符串 "echasnovski/mini.files"
。它没有命名的键,所以有点像一个“位置参数”。
表中的第二个元素更像一个“命名参数”,因为它用名称 keys
进行索引,其值是另一个 Lua 表。然而,第二个表更像一个包含三个值(另外三个独立的 Lua 表)的“数组”,因为它没有命名的索引。
重要的是要理解 keys
字段与 LazyVim(extras)为 mini.files 配置的默认 keys
合并。如果存在冲突(例如与 <space>fm
),我的值将优先于默认值。
这是 LazyVim 的一个强大功能,它允许你使用 LazyVim 提供的托管配置,并且根据需要覆盖它。旧的 Neovim 发行版往往没有这么大的灵活性,所以你要么被它们的配置困住,要么必须复制整个配置并进行编辑,这使得修改成为一场噩梦。
需要明确的是,keys
是 LazyVim 的一个概念(技术上讲,它实际上是底层 Lazy.nvim 插件管理器的一部分)。任何插件配置都可以有一个 keys
数组表,这些快捷键将与默认的 Neovim 快捷键、LazyVim 快捷键、你的自定义全局快捷键以及任何其他插件快捷键合并。
是的,这存在很多潜在的冲突,这也是为什么我如此庆幸 LazyVim 已经为我完成了大部分配置!
5.4.1. Keys 条目的结构
keys
表中的每一项都是另一个 Lua 表,(在这种情况下)包含三个字段。前两个字段是位置性的,代表快捷键名称和每当调用该快捷键时被调用的 Lua 回调函数。第三个字段是一个命名的字段 desc
,提供了一个将在 Space 模式菜单中显示的字符串描述。
第一个条目中的快捷键序列使用了来自 Vim 的标准语法。注意 <leader>
是一个旧的 Vim 概念,允许你配置哪个键用作自定义快捷键的前缀。在 LazyVim 中(实际上,对于大多数现代 Neovim 用户来说),leader 是 <Space>
。特殊键通过尖括号向 Vim 的快捷键引擎表示,所以你经常会看到像 <Space>
、<Right>
、<Left>
或 <BS>
这样的表示法。
译者注: Leader 键 是 Vim 中一个非常有用的概念。它允许用户自定义一个前缀键(默认为
\
,但常用<Space>
),然后跟其他键组合成用户自定义的快捷键,避免与 Vim 内置命令冲突。例如<leader>e
如果 leader 是空格,就表示按Space
再按e
。
在 <leader>
字符串之后,我们包含任何需要按下的附加键。对于简单的,我们有 e
和 E
来替换我们禁用的 explorer 快捷键,用新的 mini.files 快捷键。第三个有点复杂,因为 f
表示这个动作将在 Space 模式的 file/find
子菜单下可用,而 m
表示将在此菜单中的哪个字母。
对于回调,我们使用 Lua 函数,它们总是以 function
开始,以 end
结束。这些是匿名函数,它们在括号内不接受任何参数。在函数体中,我们调用特定的代码来按我们想要的方式打开 mini.files。在两种情况下,我只是从 LazyVim 的默认 mini.files 配置中复制了这段代码,在第三种情况下,我是通过结合 Snacks.nvim 和 mini.files 配置中的代码拼凑出来的。LazyVim
全局变量是一个方便的库,包含一系列辅助配置的实用函数。LazyVim.root
函数用于查找项目根目录并返回一个我们传递给 mini.files.open
的字符串。
5.4.2. 自定义 Mini.files 选项
正如我提到的,keys
表与 LazyVim 为 mini.files 配置的默认 keys
表合并。类似地,大多数 Neovim 插件都可以用一个 opts
表进行配置,该表包含该插件特定的自定义配置。如果你提供一个 opts
表,它将与默认的 LazyVim opts
表(如果存在)合并。
你需要阅读每个插件的文档(通常在 Github 上提供,并且通常可以通过 :help 插件名称
获得)来确切了解它有哪些可用的选项。你还需要查看 LazyVim 为该插件设置的默认配置,以便理解它将如何合并。
在我的例子中,我将以下 opts
数组传递给 mini.files:
列表 14. Mini.files 自定义选项
-- 在 lua/plugins/extend-mini-files.lua 文件中
return {
"echasnovski/mini.files",
keys = {
-- 上面定义的快捷键...
{ "<leader>e", function() require("mini.files").open(vim.api.nvim_buf_get_name(0), true) end, desc = "打开 mini.files (当前文件所在目录)", },
{ "<leader>E", function() require("mini.files").open(vim.uv.cwd(), true) end, desc = "打开 mini.files (cwd)", },
{ "<leader>fm", function() require("mini.files").open(LazyVim.root(), true) end, desc = "打开 mini.files (根目录)", },
},
opts = {
-- mappings 表用于覆盖 mini.files 激活时的内部键映射
mappings = {
-- 将进入/退出目录映射到左右箭头键 (作者个人偏好)
go_in = "<Right>",
go_out = "<Left>",
},
-- windows 表用于配置 mini.files 的窗口外观
windows = {
width_nofocus = 20, -- 未聚焦窗口的宽度
width_focus = 50, -- 聚焦窗口的宽度
width_preview = 100, -- 预览窗口的宽度
},
-- options 表用于配置 mini.files 的行为
options = {
-- 将 mini.files 设置为默认的文件浏览器 (可能会影响某些操作)
use_as_default_explorer = true,
},
},
}
mini.files 中的 mappings
表用于覆盖当mini.files 视图打开时激活的默认键映射。这与我们之前定义的用于打开 mini.files 的全局键映射不同。在我的例子中,我将 go_in
和 go_out
映射为使用箭头键而不是 h
和 l
,这是因为我之前描述的左手 Dvorak Kinesis 怪癖。我不建议你做这个更改;对于所有不是我的人来说,h
和 l
会工作得更好。
窗口选项在那里是因为我有一个 32 英寸 6k 显示器,这意味着我可以负担得起比正常更大的 explorer 列。有关这些以及其他选项的更多信息,请参阅 :help mini.files
。
所以现在你对在 LazyVim 中配置插件有了一些了解。它既比从头开始配置插件容易一点,也难一点:
- 更容易,因为你只需要更改非默认的值,而不是设置整个配置,而且 LazyVim 带有合理的默认值。
- 但更难,因为你有时必须考虑选项和快捷键的合并是如何发生的,如果你一开始就有一个庞大的配置对象,这是不必要的。对于具有复杂默认 LazyVim 配置的插件,这种合并可能会变得相当棘手。我们稍后会看到一些例子。
5.5. 修改现有选项
有时,LazyVim 用来将你提供的插件覆盖选项覆盖默认选项的“合并”行为过于简单。当你修改的插件调用或定义了一个函数作为选项行为而不是对其进行自定义时,这种情况最常发生。
为了支持这种情况,Lazy.nvim 插件配置表中的 opts
条目可以是一个函数,而不是一个静态表。该函数接受由 LazyVim 配置的前一个 opts
表作为参数。你的函数需要修改这个表以适应你期望的行为。
基于函数的 opts
版本不返回一个新的 opts
表;它需要修改传入的那个。
例如,LazyVim 启动面板的默认配置(作为 snacks.nvim
插件套件的一部分进行配置)是一个包含 keys
数组中多个条目的表。该启动面板已经允许你使用 s
键恢复最近的会话,但如果你想从最近会话列表中选择,你必须使用 <Space>qs
快捷键。(会话将在第 9 章进一步讨论)。
假设你想在启动面板上添加一个“选择会话”条目。你可以使用以下结构来修改由 LazyVim 配置的现有 keys
数组,并添加一个新条目:
列表 15. snacks dashboard
选项函数
-- 在 lua/plugins/ 目录下的某个配置文件中,例如 extend-snacks.lua
return {
"LazyVim/LazyVim", -- 注意:这里可能需要引用 LazyVim 自身或 snacks.nvim
-- 取决于 dashboard 配置的具体位置,查阅 LazyVim 文档确认
-- 假设 dashboard 配置在 LazyVim 主配置下
opts = function(_, opts)
-- opts.ui.dashboard.custom 现在可能是新的配置位置
-- 需要根据 LazyVim 最新版本确认 dashboard 配置路径
-- 以下代码基于假设,可能需要调整
-- 确保 opts.ui.dashboard 和 opts.ui.dashboard.custom 存在
opts = opts or {}
opts.ui = opts.ui or {}
opts.ui.dashboard = opts.ui.dashboard or {}
opts.ui.dashboard.custom = opts.ui.dashboard.custom or {}
opts.ui.dashboard.custom.sections = opts.ui.dashboard.custom.sections or {}
opts.ui.dashboard.custom.sections.buttons = opts.ui.dashboard.custom.sections.buttons or {}
opts.ui.dashboard.custom.sections.buttons.items = opts.ui.dashboard.custom.sections.buttons.items or {}
-- 查找现有的 'Restore Session' (s) 的索引
local restore_session_idx = -1
for i, item in ipairs(opts.ui.dashboard.custom.sections.buttons.items) do
if item.key == "s" then
restore_session_idx = i
break
end
end
-- 在 'Restore Session' 之后插入 'Select Session' (S)
local insert_idx = #opts.ui.dashboard.custom.sections.buttons.items + 1
if restore_session_idx ~= -1 then
insert_idx = restore_session_idx + 1
end
table.insert(
opts.ui.dashboard.custom.sections.buttons.items,
insert_idx,
{ icon = "", key = "S", desc = " 选择会话", action = "Telescope persistence" } -- 使用 Telescope 命令
-- 或者使用 require("persistence").select,如果 persistence.nvim 已配置
-- { icon = "", key = "S", desc = " 选择会话", action = require("persistence").select }
)
-- 可选:如果想移除默认的 <Space>qs,可以在 keymaps.lua 中取消映射
end,
}
译者注:
- 重要: 上述代码示例是基于作者原文的意图,但 LazyVim 的配置结构可能会随版本更新而变化。特别是
opts.dashboard.preset.keys
这个路径已经过时。你需要查阅当前 LazyVim 版本的文档或源代码,找到正确的配置路径来修改 Dashboard 的按键。目前(LazyVim v10+),Dashboard 的配置应该在opts.ui.dashboard.custom.sections.buttons.items
下。我已经更新了示例代码以反映这种可能性,但仍需用户根据自己的版本进行确认和调整。table.insert(list, index, value)
: Lua 内置函数,用于在列表list
的指定index
处插入value
。_
: 在 Lua 中,单个下划线通常用作表示不使用的变量名。这里的第一个参数(通常是插件对象本身)在此函数中未使用。require("persistence").select
: 假设你安装并配置了persistence.nvim
插件,这是调用其选择会话功能的 Lua 代码。另一种常见方式是调用 Telescope 的相关命令,如"Telescope persistence"
。
你可能想用 nerd fonts 套件中的图标替换 icon = "S"
。例如 icon = " "
(冒号图标) 或 icon = " "
(会话图标)。
这个 opts
函数接受 LazyVim 定义的 opts
表作为其第二个参数。我的代码使用 Neovim 提供的 table.insert
函数更改这些 opts
。我添加了一个新条目,它位于列表中的索引 7(译者注:原文假设的索引,实际应动态查找插入位置),紧跟在现有的 Restore Session
条目之后。
这比我一开始就拥有我想要的完整配置更难维护,但比我必须从头开始编写整个配置更容易维护。对于 LazyVim 在所有其他方面比我自己做得更好的配置,我愿意接受这种权衡。
5.6. 安装第三方插件
安装第三方插件与配置 LazyVim 提供的插件差别不大,只是你不需要担心 keys
和 opts
如何与默认配置合并。
只需在 plugins
目录中创建一个新的 Lua 文件(为其取一个合适的插件名称)。在文件中,返回一个 Lua 表,其中第一个条目是插件的 GitHub 仓库和名称,该名称之后是其他配置(opts
和 keys
等)。
例如,我喜欢用 guess-indent.nvim 插件根据我当前编辑的文件的内容来设置我的缩进宽度。它由 github 用户 nmac427
维护,所以我的 plugins/guess-indent.lua
文件看起来像这样:
列表 16. Guess-indent.nvim 第三方插件
-- lua/plugins/guess-indent.lua
return {
"nmac427/guess-indent.nvim", -- 插件仓库路径
event = "BufReadPre", -- 优化:只在读取缓冲区之前加载
opts = {
auto_cmd = true, -- 启用自动命令以在文件加载时猜测缩进
override_editorconfig = true -- 允许覆盖 .editorconfig 的设置
},
}
译者注: 添加了
event = "BufReadPre"
是一个常见的 Lazy.nvim 优化,表示仅在即将读取文件内容时才加载此插件,而不是在 Neovim 启动时加载。
opts
表完全取决于插件期望什么。在这种情况下,我阅读了 guess-indent.nvim 的 README,并找到了我想要设置的两个选项。
大多数现代 Lua 插件的文档会说明需要调用一个 setup
函数,并传入一个包含配置的 Lua 表。如果你尝试设置的插件没有明确的 Lazy.nvim 说明,别担心:传递给那个 setup
函数的内容就是你需要包含在传递给 LazyVim 插件管理器的 opts
中的内容。
例如,我推荐的另一个第三方插件是 chrisgrieser/nvim-spider
,它巧妙地改变了 w
、e
和 b
命令,以支持在 CamelCase 和 snake_case 单词内部导航。我在我的 plugins
目录下有一个名为 nvim-spider.lua
的文件,内容如下:
列表 17. nvim-spider
第三方插件
-- lua/plugins/nvim-spider.lua
return {
"chrisgrieser/nvim-spider",
-- event = "VeryLazy", -- 可以考虑延迟加载
opts = {}, -- 使用默认选项
keys = {
-- 覆盖 'w' 键,使其在普通(n), 操作符待决(o), 可视(x) 模式下调用 nvim-spider 的 'w' 动作
{
"w",
function() require('spider').motion('w') end,
mode = { "n", "o", "x" },
desc = "Spider-w (移动到下一个词/子词开头)",
},
-- 覆盖 'e' 键
{
"e",
function() require('spider').motion('e') end,
mode = { "n", "o", "x" },
desc = "Spider-e (移动到词/子词末尾)",
},
-- 覆盖 'b' 键
{
"b",
function() require('spider').motion('b') end,
mode = { "n", "o", "x" },
desc = "Spider-b (移动到上一个词/子词开头)",
},
-- 注意:你可能还想覆盖 ge, W, E, B 等其他相关移动键
},
}
译者注:
mode = { "n", "o", "x" }
: 指定这些快捷键在哪些模式下生效。n
=Normal,o
=Operator-pending (等待操作符的模式,例如按下d
之后),x
=Visual。function() require('spider').motion('w') end
: 调用 nvim-spider 插件提供的 Lua 函数来执行移动。这是比使用<cmd>lua ... <CR>
更推荐的方式,因为它更高效且不易出错。- 在
desc
中添加 “Spider-” 前缀有助于区分这是插件提供的版本。
这个插件不会自动设置快捷键,所以我向插件配置传递了一个 keys =
表。这个数组不会传递给插件。相反,这些键由 Lazy.nvim 插件管理器解析并添加到全局快捷键中。将键与插件放在一起很方便,这样所有的配置都在一个地方。
我对 nvim-spider
传递给其 setup
函数的默认选项(阅读 README 后)感到满意,所以我传递了一个空的 opts
数组。
寻找第三方插件的最佳资源是 github 仓库 rockerBOO/awesome-neovim。该列表维护良好,并且(最重要的是)定期修剪,因此列表上很少有过时或未维护的插件。
实际上,LazyVim 已经自带了大多数插件的同类最佳版本(内置或作为 extras),所以你不需要添加太多。但如果你遇到任何“我希望 LazyVim 可以…”的情况,答案很可能是“它可以,并且实现它的插件列在 Awesome Neovim 仓库中”。
5.7. 总结
在本章中,我们了解了 LazyVim 如何与更广泛的 Neovim 插件生态系统集成。它提供了合理的默认插件和配置,但可以轻松地根据你自己的需求自定义该配置。
我们了解到内置插件、extras 插件和未知的第三方插件的处理方式略有不同(但一致),并看到了如何安装一些第三方插件的示例。
现在你知道了如何打开文件和配置插件,我们可以回到模式编辑的一些基本要素了。你已经知道如何在普通模式和插入模式之间切换,并且可以在代码中四处导航。在下一章中,我们将介绍一些模糊了导航和插入文本界限的基本编辑功能。