- 知识管理
- 开发工具
【免费下载链接】neorg
Modernity meets insane extensibility. The future of organizing your life in Neovim.
Neorg 是一款以"现代与极致可扩展"为设计理念的 Neovim 结构化笔记组织工具,其核心功能全部以模块(module)形式存在。本文基于仓库内置的 Cookbook 文档,围绕其中收录的两类高频实战配置——通过nvim-cmp启用 Norg 智能补全与借助image.nvim实现 LaTeX 公式内联渲染——展开完整的手把手配置教程,并结合仓库源码深入解析其底层工作机制。读完本文,你将能够独立完成这两大模块的安装、配置与排障,并理解补全候选从何而来、LaTeX 是如何变成图片的。
若你尚未搭建 Neorg 基础环境,可先参考 Kickstart(零基础一键配置)或 Setup-Guide(模块化配置入门),再回到本文进行功能扩展。
一、前置知识:Neorg 的模块加载机制
在动手配置之前,有必要先理解 Neorg 的配置骨架。所有功能都通过require("neorg").setup({ load = { ... } })中的load表加载,每个键是模块的完整路径,值为该模块的配置表。以下两种写法等价:
-- 写法一:默认配置 require("neorg").setup() -- 写法二:显式等价形式 require("neorg").setup({ load = { ["core.defaults"] = {}, } })其中core.defaults是一个元模块(metamodule),用于一次加载一批关键基础模块;而 Cookbook 中介绍的功能性模块(如core.completion、core.latex.renderer)则需要按需显式加载。给模块传配置时,必须将配置项包在config = { ... }表中——这是新手最常见的出错点,core.highlights模块的健康检查(:checkhealth neorg)会专门校验这一点。
二、场景一:通过nvim-cmp启用 Norg 智能补全
2.1 前置条件
- 已安装 nvim-cmp(Neovim 的通用补全框架)。
- 已加载 Neorg 的
core.defaults基础模块(见 Setup-Guide)。
2.2 配置步骤(分两步)
第一步:在 Neorg 配置中启用补全引擎
require("neorg").setup({ load = { ["core.defaults"] = {}, ["core.completion"] = { config = { engine = "nvim-cmp", -- 指定补全引擎 } }, ["core.integrations.nvim-cmp"] = {}, -- 加载与 nvim-cmp 的集成模块 } })第二步:在nvim-cmp配置中注册neorg补全源
sources = cmp.config.sources({ -- ... 你的其他补全源 { name = "neorg" }, })完成这两步后,重新加载配置并编辑.norg文件,即可看到 Norg 语法专属的补全候选。
2.3 底层原理:core.completion的引擎抽象
core.completion模块本身不直接实现补全 UI,而是一个"补全引擎适配层"。它的职责是:根据engine配置选择具体的集成模块,并把 Norg 语法上下文翻译成补全引擎能够消费的候选列表。
从源码看,引擎分发逻辑位于 lua/neorg/modules/core/completion/module.lua 的module.load():当engine为"nvim-cmp"时,模块会调用modules.load_module_as_dependency("core.integrations.nvim-cmp", ...)加载对应集成模块,并调用其create_source()注册补全源。若engine未设置或无法识别,会输出错误日志并中止加载。
该模块支持的引擎值包括:
engine取值 | 对应集成模块 | 说明 |
|---|---|---|
"nvim-cmp" | core.integrations.nvim-cmp | 主流推荐,本文主角 |
"coq_nvim" | core.integrations.coq_nvim | 通过 coq.nvim 提供补全 |
"nvim-compe" | core.integrations.nvim-compe | 已废弃,不再提供支持,仅作参考 |
{ module_name = "external.lsp-completion" } | 外部模块 | 配合 neorg-interim-ls 使用,为没有补全插件的用户通过 shim Language Server 提供补全 |
nvim-cmp集成模块的注册细节在 nvim-cmp/module.lua:它通过cmp.register_source("neorg", ...)注册补全源,并在is_available()中限定仅在filetype == "norg"时生效。触发字符覆盖了 Norg 语法中的关键符号:@、-、(、空格、.、:、#、*、^、[。
2.4 补全能力清单
core.completion模块头注释完整列出了支持的补全场景(|表示光标位置):
- TODO 列表项:
- (| @标签:@|#标签:#|- 文件路径链接:
{:|(提供工作区相对路径,格式为:$/workspace/relative/path:) - 标题链接:
{*| - 模糊标题链接:
{#| - 脚注:
{^| - 文件路径 + 标题链接:
{:path:*| - 文件路径 + 模糊标题链接:
{:path:#| - 文件路径 + 脚注:
{:path:^| - 锚点名:
[| - 链接名称:
{<somelink>}[|
标题补全只会显示当前或指定文件中与当前层级匹配的有效标题;所有链接类补全都会智能地自动补全结尾的:和}。
2.5 深入:补全候选的生成逻辑
core/completion/module.lua 中的module.public.completions表定义了所有补全规则,每条规则包含四个要素:
regex:匹配光标前文本的正则,决定当前输入是否触发该补全。例如^%s*@(%w*)匹配@tag,^%s*%#(%w*)匹配#tag,^.*{:([^:}]*)匹配文件链接{:。node:TreeSitter AST 校验函数,确保补全只出现在合法的语法位置。例如normal_norg(module.lua)会排除代码块和标签内部。complete:候选内容。可以是静态列表(如@标签补全table、code、image等),也可以是动态生成函数(如generate_file_links遍历工作区中所有.norg文件生成$/相对路径:候选,见 module.lua)。options:传给补全引擎的元信息,如type(决定 LSP CompletionItemKind)与completion_start(触发字符)。
complete()函数(module.lua)递归遍历整张规则表:先对光标前文本逐一匹配正则,再通过 TreeSitter 检查当前/上一个/下一个语法节点,命中后返回候选;未命中则尝试descend深入子规则。这种"正则 + AST + 递归下降"的三层结构,保证了补全既精准又具备上下文感知能力。
三、场景二:LaTeX 公式内联渲染
3.1 前置条件
- 一个支持kitty graphics protocol的终端(如 kitty、ghostty),用于在终端内显示图片。
- 已安装并配置好 image.nvim 插件(Neovim 的终端图片显示库)。
3.2 配置步骤
第一步:在 Neorg 配置中加载相关模块
require("neorg").setup({ load = { ["core.integrations.image"] = {}, -- 图片显示集成(封装 image.nvim) ["core.latex.renderer"] = {}, -- LaTeX 渲染器 } })第二步:在 Norg 文档的数学块中写入 LaTeX 公式
Norg 使用$| ... |$语法标记数学公式:
$|Hello, \LaTeX|$第三步:执行渲染命令
:Neorg render-latex该命令支持子命令:Neorg render-latex enable、:Neorg render-latex disable、:Neorg render-latex toggle,用于控制渲染的开启、关闭与切换。默认情况下图片只会在手动执行该命令后渲染。
3.3 底层原理:从 LaTeX 到终端图片的完整链路
core.latex.renderer是一个实验性模块,要求 Neovim 0.10+。它的完整渲染链路如下(源码见 lua/neorg/modules/core/latex/renderer/module.lua):
- 识别公式:通过 TreeSitter 查询捕获
inline_math节点(module.lua),并剥离$|/|$包裹标记与转义符。 - 生成 LaTeX 文档:
async_create_latex_document(module.lua)将公式包装进一个standalone文档类,并引入amsmath、amssymb、graphicx三个宏包。 - 编译为图片:
async_generate_image(module.lua)先后调用系统命令latex --interaction=nonstopmode --output-format=dvi与dvipng -D <dpi> -T tight -bg Transparent -fg <前景色>,生成透明背景的 PNG。 - 内联显示:通过
core.integrations.image封装 image.nvim 的from_fileAPI,将 PNG 以inline = true方式渲染到终端,并用 extmark 跟踪位置、以conceal隐去原始公式文本(module.lua)。
渲染结果会被缓存(image_paths以"清洗后的公式字符串 → PNG 路径"为键值),相同公式不会重复编译。
3.4 可调配置项
core.latex.renderer的公开配置项(默认值)如下(module.lua):
| 配置项 | 默认值 | 说明 |
|---|---|---|
conceal | true | 渲染出的图片是否覆盖原始 LaTeX 源码。设为false会增加延迟,且在图片数量多时可能出 bug |
dpi | 350 | 图片 DPI(每英寸点数)。调高可获得更清晰的图片,但性能开销更大 |
render_on_enter | false | 进入.norg缓冲区时是否自动渲染(默认需手动执行:Neorg render-latex) |
renderer | "core.integrations.image" | 实际执行渲染的模块,目前仅此一个选项 |
debounce_ms | 200 | 缓冲区停止变化 200ms 后才重新渲染。调低更流畅,但会产生更多临时图片 |
min_length | 3 | 只渲染长度超过此值的公式(转义符不计入、空格计入,$与$|/|$不计入) |
scale | 1 | 图片缩放倍数。conceal = true时不会用虚拟文本填充,图片可能相互重叠;图片不会被放大超过其真实尺寸 |
示例配置:
require("neorg").setup({ load = { ["core.integrations.image"] = {}, ["core.latex.renderer"] = { config = { dpi = 400, -- 更清晰的渲染 render_on_enter = true, -- 进入文件即自动渲染 min_length = 1, -- 允许渲染更短的公式 }, }, } })3.5 系统依赖与配色联动
渲染依赖两个系统可执行文件,二者缺一不可:
latex可执行文件,且需带有standalone、amsmath、amssymb、graphicx四个宏包;dvipng可执行文件(通常随 LaTeX 发行版附带)。
若命令不存在或编译失败,async_generate_image会返回nil并跳过该公式。
此外,渲染出的图片前景色由高亮组@neorg.rendered.latex决定(默认链接到+Normal),该高亮组在 core/highlights/module.lua 中定义。渲染器在compute_foreground()(renderer/module.lua)中将其转换为 RGB 颜色字符串传给dvipng;切换配色方案(colorscheme事件)时也会自动重新计算前景色并触发重渲染。你也可以在core.highlights的配置中自定义该高亮组以调整公式颜色。
四、排障与验证
- 补全不出现:确认
engine = "nvim-cmp"已正确配置、core.integrations.nvim-cmp已加载、且nvim-cmp配置中已加入{ name = "neorg" }源。注意集成模块属于"二等公民",可能在极少数场景下失效,若确实无法工作可向项目提交 bug report(见 nvim-cmp/module.lua 的说明)。 - LaTeX 渲染失败:依次检查终端是否支持 kitty graphics protocol(kitty/ghostty)、
image.nvim是否安装、latex与dvipng是否在 PATH 中且宏包齐全。 - 运行健康检查:
vim内执行:checkhealth neorg,它会检测配置结构是否规范(如模块配置是否被正确包裹在config = {}中)并给出修复指引。
至此,两大 Cookbook 场景已全部配置完毕:nvim-cmp让 Norg 文档拥有了上下文感知的智能补全,LaTeX 渲染让笔记中的数学公式以图片形式直接呈现在终端内,二者共同构成了 Neorg 高效写作体验的关键一环。
- 知识管理
- 开发工具
【免费下载链接】neorg
Modernity meets insane extensibility. The future of organizing your life in Neovim.
相关推荐
QQ空间数据导出:3 步免费跑通全部历史说说本地归档
QQ空间数据导出:3 步免费跑通全部历史说说本地归档 2017 年毕业那晚发的说说,时间线越翻越慢,根本翻不回去了。GetQzonehistory 就干一件事:
网页爬虫数据分析snacks.nvim image 模块实战:在 Neovim 中内联渲染 LaTeX 数学公式与大文档
snacks.nvim image 模块实战:在 Neovim 中内联渲染 LaTeX 数学公式与大文档 本文以仓库 tests/image/big.md ht
开发工具代码编辑器Quartz 数学公式渲染插件 Latex 完全指南:KaTeX / MathJax / Typst 三引擎配置与实战
Quartz 数学公式渲染插件 Latex 完全指南:KaTeX / MathJax / Typst 三引擎配置与实战 本篇指南聚焦于 Quartz 静态站点生
前端开发工具CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考