一篇通过使用lazy.nvim进行nvim插件管理的入门笔记。

基础安装

init.lua

路径:stdpath("config")/init.lua

stdpath("config")

macOS/Linux:~/.config/nvim

Windows:~/AppData/Local/nvim

-- bootstrap lazy.nvim
-- ./lua/lazynvim-init.lua
require("lazynvim-init")

意义作用:

nvim启动时会加载init.lua配置,然后通过require("lazynvim-init")查找当前init.lua所在目录下的lua目录下的lazynvim-init.lua文件,运行其内容。

lazynvim-init.lua

路径:stdpath("config")/lua/lazynvim-init.lua

代码内容:

-- 1. 准备lazy.nvim模块(存在性检测)
-- stdpath("data")
-- macOS/Linux: ~/.local/share/nvim
-- Windows: ~/AppData/Local/nvim-data
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", -- latest stable release
lazypath,
})
end
--
-- 2. 将 lazypath 设置为运行时路径
-- rtp(runtime path)
-- nvim进行路径搜索的时候,除已有的路径,还会从prepend的路径中查找
-- 否则,下面 require("lazy") 是找不到的
vim.opt.rtp:prepend(lazypath) -- 3. 加载lazy.nvim模块
require("lazy").setup({})

意义作用:

该配置文件主要有3部分组成:

  1. lazy.nvim的加载与存在性验证;
  2. 将lazy.nvim模块所在目录加入到lua模块搜索路径下,以便可以require到lazy.nvim模块;
  3. 让lazy.nvim加载插件。

第一步,lazy.nvim进行存在性检查。如果不存在,则通过git clone方式,下载lazy.nvim模块代码,并存放到stdpath("data")/lazy/lazy.nvim目录下。

stdpath("data")路径为:

macOS/Linux:~/.local/share/nvim

Windows:~/AppData/Local/nvim-data

第二步,通过"vim.opt.rtp:prepend(lazypath)"代码将lazy.nvim模块所在的路径(也就是上面的变量lazypath)加入到运行时路径(runtimepath)下,只有配置了这行代码才能让下面require("lazy")执行的时候,能够从lazypath中搜索到lazy模块并加载。

在本人macOS机器上,如果第一步成功安装了lazy.nvim模块,则翻看"~/.local/share/nvim/lazy/lazy.nvim"目录,会看到以下内容:

$ cd ~/.local/share/nvim/lazy/lazy.nvim
$ tree -L 2
.
├── CHANGELOG.md
├── LICENSE
├── README.md
├── TODO.md
├── doc
├── lua(这里面还有目录lazy/init.lua文件)
├── selene.toml
├── stylua.toml
├── tests
└── vim.toml

搜索lazy模块的时候,会从~/.local/share/nvim/lazy/lazy.nvim目录下找到lua/lazy/init.lua进行加载。

如果不配置,会看到如下报错:

E5113: Error while calling lua chunk: /Users/w4ngzhen/.config/nvim/lua/lazynvim-init.lua:22: module 'lazy' not found:
no field package.preload['lazy']
no file './lazy.lua'
no file '/usr/local/share/luajit-2.1.0-beta3/lazy.lua'
no file '/usr/local/share/lua/5.1/lazy.lua'
no file '/usr/local/share/lua/5.1/lazy/init.lua'
no file './lazy.so'
no file '/usr/local/lib/lua/5.1/lazy.so'
no file '/usr/local/lib/lua/5.1/loadall.so'

第三步,通过require("lazy").setup({})代码加载下载好的lazy.nvim模块代码。当然,由于setup代码的参数是一个空的table,也就意味着我们还没有让lazy.nvim管理/加载任何的插件,后文将介绍插件的安装与加载、配置。

验证

我们的配置文件结构如下:

$ cd ~/.config/nvim
$ tree
.
├── README.md
├── init.lua
└── lua
└── lazynvim-init.lua

上述配置完毕以后,让我们首次启动nvim,第一次启动的时候,由于会从远端下载lazy.nvim模块,所以会有一定的延迟。然后,我们就会进入正常的nvim界面。然后命令模式下输入指令:Lazy后,我们会看到nvim的界面弹出一个对话框,展示lazy的状态:

至此,我们就完成了lazy.nvim的安装与加载,下面会介绍使用lazy.nvim来安装/管理插件。

插件安装配置

在这一节中,我们将基于上面的成果,尝试安装几个高频的插件(关于这些插件的功能与使用方式,本文不会详细介绍):

  1. 文件树插件:nvim-tree.lua
  2. 文件状态展示插件:lualine.nvim

方式1:直接配置

以直接配置的方式安装插件十分简单,只需要在上面的lazynvim-init.lua的中require("lazy").setup({})添加插件安装代码即可:

local nvim_tree_plugin = {
"nvim-tree/nvim-tree.lua",
version = "*",
dependencies = {"nvim-tree/nvim-web-devicons"},
config = function()
require("nvim-tree").setup {}
end
}
local lualine_plugin = {
'nvim-lualine/lualine.nvim',
config = function()
require('lualine').setup()
end
}
require("lazy").setup({nvim_tree_plugin, lualine_plugin})

上述方式下,我们首先定义了两个插件配置的table;然后,在setup中第一个参数table中,逐个添加插件。这样lazy.nvim就能帮我们将插件进行下载、安装。

这里不验证插件安装的结果,等到下文通过更加优雅的方式配置再看效果。

方式2:plugins目录统一编排

上述方式1固然简单,但每一次想要添加一个插件就需要在lazynvim-init.lua中添加插件代码;另外,大量的插件配置势必造成lazynvim-init.lua愈发臃肿。好在lazy.nvim还支持我们以更加优雅的方式编排插件:使用plugins目录统一编排插件。具体做法为:

第一步:lazynvim-init.lua中的setup参数变为setup("plugins"),同时移除掉有关具体插件安装配置的代码;

第二步:在lazynvim-init.lua所在目录下创建一个名为"plugins"的目录;

第三步:在plugins目录中创建插件配置模块lua脚本。在这一步中,我们分别创建两个lua脚本来分别作为两个插件的配置模块:

  1. plugin-lualine.lua
return {
{
'nvim-lualine/lualine.nvim',
config = function()
require('lualine').setup()
end
}
}
  1. plugin-nvim-tree.lua
return {
{
"nvim-tree/nvim-tree.lua",
version = "*",
dependencies = {"nvim-tree/nvim-web-devicons"},
config = function()
require("nvim-tree").setup {}
end
}
}

这里有两个注意点:1)文件名可以随意;2)每一个脚本模块都将返回一个table,且table的每一项都是一个插件配置(这里每个文件只有一项插件配置),lazy会把这些table合并为一个插件配置的table进行加载(folke/lazy.nvim: A modern plugin manager for Neovim (github.com))。

当然,你也可以只在plugins目录下创建一个lua脚本(譬如叫all-plugins.lua),然后里面return的table包含有上述两个插件的配置,就像下面这样:

-- all-plugins.lua
return {
{
'nvim-lualine/lualine.nvim',
config = function()
require('lualine').setup()
end
}
{
"nvim-tree/nvim-tree.lua",
version = "*",
dependencies = {"nvim-tree/nvim-web-devicons"},
config = function()
require("nvim-tree").setup {}
end
}
}

无论是一个插件一个lua脚本模块还是,统一一个文件都行。但是为了以后安装插件的尽可能不动脚本而是新增脚本,笔者还是建议一个插件配置一个lua文件的方式。

在上述三步完成以后,目录结构如下:

lazynvim-init.lua、plugin-lualine.lua以及plugin-nvim-tree.lua的代码具体代码如下:

安装结果验证

终于,当我们完成了插件的安装配置以后,在此启动nvim,理论上此时会看到lazy对其他插件的加载动画和加载结果:

同时,我们可以看到lualine加载后的效果:

命令模式下可以执行命令:NvimTreeOpen

插件体系机制

插件配置浅析

目前为止,我们通过上面简单的三部分文件(1、init.lua;2、lua/lazynvim-init.lua;3、plugins目录下的plugin-lualine.lua和plugin-nvim-tree.lua),就用上了lazy.nvim这个插件管理工具,以及安装了lualine和nvim-tree两个插件。

接下来我们通过nvim-tree这个插件的配置,来简单分析下lazy.nvim的插件体系机制:

return {
{
"nvim-tree/nvim-tree.lua",
version = "*",
dependencies = {"nvim-tree/nvim-web-devicons"},
config = function()
require("nvim-tree").setup {}
end
}
}

按照lazy.nvim的官方总结,一个插件配置(官方叫plugin spec)的table:

  • "nvim-tree/nvim-tree.lua":指这个插件在github上的short url。lazy.nvim在安装插件的时候,默认就会拉取github上的仓库代码到本地进行存放。

  • version = "*":version是版本配置,使用"*"则表明使用最新版本,如果以后仓库有更新,则拉去最新插件代码。

  • dependencies = {"nvim-tree/nvim-web-devicons"}:说明该插件依赖另一个插件:"nvim-tree/nvim-web-devicons",同样是一个short url,会从github上拉取代码。

  • config = ... ...:当插件启动加载以后,则会执行该config的代码,在本例中,会运行脚本:require("nvim-tree").setup {}

当然,除此之外还有很多的配置,详情可以查看:lazy.nvim#-plugin-spec

关于插件的搜索路径

vim/nvim启动时,会自动寻找runtimepath下的脚本进行加载。你可以在nvim中通过指令:echo &runtimepath或者set runtimepath,在我的macOS的机器上结果如下:

  runtimepath=~/.config/nvim,~/.local/share/nvim/lazy/lazy.nvim,~/.local/share/n
vim/lazy/lualine.nvim,~/.local/share/nvim/lazy/nvim-web-devicons,~/.local/share/
nvim/lazy/nvim-tree.lua,/usr/local/Cellar/neovim/0.9.1/share/nvim/runtime,/usr/l
ocal/Cellar/neovim/0.9.1/share/nvim/runtime/pack/dist/opt/matchit,/usr/local/Cel
lar/neovim/0.9.1/lib/nvim,~/.local/state/nvim/lazy/readme
Press ENTER or type command to continue

可以看到,我们之前安装的lazy.nvim、lualine.nvim以及nvim-tree都在路径列表中有所体现。

此外,有lua开发经验的开发者应该比较了解lua中的require的加载机制,这里不再赘述。但需要注意的是,在nvim中的lua脚本require是有“魔改”的,它会从runtimepath/lua/下寻找 lua 脚本。想更了解的读者可以使用:help lua-require来查看官方文档。

lazy-nvim插件管理器基础入门的更多相关文章

  1. JMeter插件管理器

    JMeter插件管理器 来自官网:https://jmeter-plugins.org/wiki/PluginsManager/ JMeter插件管理器的想法很简单:不是手动安装各种插件,而是通过漂亮 ...

  2. Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(VSM)

    Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(V 时间:2010-04-12 16:06来源:SilverlightChina. ...

  3. Vim插件管理器Vundle使用

    参考地址:http://www.linuxidc.com/Linux/2012-12/75684.htm Vundle(Vim bundle) 是一个vim的插件管理器. 其Github地址为: ht ...

  4. 关于插件管理器Alcatraz

    如何安装插件管理器Alcatraz:去github下载一个Alcatraz安装包,然后运行一下. 会弹出 记得选择左边的Load Bundle 退出Xcode 重新运行一下就OK 了. 然后就可以看到 ...

  5. Vim Vundle 插件管理器

    /********************************************************************** * Vim Vundle 插件管理器 * 说明: * 话 ...

  6. Vim插件之插件管理器Vundle

    Vim插件之插件管理器Vundle 1.介绍下载 相比Sublime.Text2等现代编辑器,Vim缺乏默认的插件管理器,所有插件的文件都散布在~/.vim下的几个文件夹中,配置Vim的过程, 就是在 ...

  7. 使用Vim-plug作为Vim 插件管理器

    ref: https://www.cnblogs.com/jiftle/p/6918157.html - vundle是一款老款的插件管理工具- vim-plug相对较新,特点是支持异步加载,相比vu ...

  8. Confluence 6 关于统一插件管理器

    所有的组件通过 统一插件管理器(Universal Plugin Manager)进行管理,这个也被称为 UPM.UPM 可以在几乎所有的 Atlassian 应用中找到,能够提供完整同意的插件安装管 ...

  9. notepad++添加插件管理器

    notepad++ 是一个很不错的文本编辑器,添加一些插件可以更好地使用. 首先需要使用插件管理器,最新版本的github地址是:https://github.com/bruderstein/nppp ...

  10. Alcatraz插件管理器

    下载地址:https://github.com/supermarin/Alcatraz 虽然能用Alcatraz插件管理器进行管理,但它有时有些插件并不是最新版本,特别是在Xcode更新版本时.这里有 ...

随机推荐

  1. 21.1 动态TLS--《Windows核心编程》

    应用程序通过调用一组4个函数来使用动态 TLS,这些函数实际上最经常为 DLL 所使用. 通常情况下,如果DLL使用 TLS,那么当它用 DLL_PROCESS_ATTACH 标志调用它的 DllMa ...

  2. 4.if语句--《Python编程:从入门到实践》

    4.1 检查多个条件   1.使用 and 检查多个条件   2.使用 or 检查多个条件 4.2 检查特定值是否包含在列表中   使用 in 检查特定值是否在列表中 >>> req ...

  3. Power BI 12 DAY

    电商平台流量分析 案例练习 参数建模 建模-->新建参数 新建度量值使用SWITCH函数将需要的指标数据化 15.关键指标 = switch([指标选择 值],1,[1.访客数合计],2,[2. ...

  4. Java设计模式-建造者模式Builder

    介绍 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式.它可以 将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方 法可以构造出不同表现(属性)的对象 ...

  5. spring boot读取json文件并实现接口查询

    0.源码下载 https://download.csdn.net/download/IndexMan/84238085 1.说明 最近需要在spring boot项目启动时读取json文件并保存到Li ...

  6. EnumColorProfiles WcsGetDefaultColorProfile WcsSetDefaultColorProfile的使用

    #include <Windows.h> #include <Icm.h> #include <iostream> #include <string> ...

  7. win32 - 计算位图所需的字节总数

    BITMAPINFOHEADER文档详细介绍了所需要的步骤, 对于未压缩的RGB格式,最小跨度始终是图像宽度(以字节为单位),四舍五入到最接近的DWORD.可以使用以下公式来计算步幅: stride ...

  8. 以二进制文件安装K8S之高可用部署架构

    在Kubernetes系统中,Master节点扮演着总控中心的角色,通过不间断地与各个工作节点(Node)通信来维护整个集群的健康工作状态,集群中各资源对象的状态则被保存在etcd数据库中. 在正式环 ...

  9. 分发函数singledispatch

    import functools @functools.singledispatch() def myfunc(arg): print("default myfunc({!r})" ...

  10. 在矩池云上使用R和RStudio

    租用机器 在矩池云租用机器的时候,系统环境里搜索:R,选择 R4.2 镜像,如果需要使用RStudio,还需要在高级选项中新增一个自定义端口:8787,然后点击租用即可. 使用 JupyterLab ...