初试 Neorg

初次尝试 Neorg ,如果顺利预计替换 Notion

安装 Neorg

根据官方文档,在macOS 下通过 lazy.vim [安装 Neorg] ,初次启动 nvim 后发现 nvim-treesitter 会自动安装 norg 的 parser ,安装过程中会报编译错误,大概错误是说使用的 cc 编译器不支持 C++11 ,目前 Neorg 已经解决了这个问题,具体见 [fix: TSInstall issues on macOS, hopefully once and for good] ,大致思路就是忽略 TS 的报错,进入 nvim 后手动运行 :Neorg sync-parsers 让 Neorg 来安装 parser 即可。 设置 treesitter 不自动安装 norg parser ,在 lunarvim 的 config.lua 文件中增加 lvim.builtin.treesitter.ignore_install = { "norg" \} 不知道是我设置的问题,总之这个方法并不成功,依旧会尝试安装 norg parser ,最后还是通过官方的方法解决的。

配置 Neorg/启用 Concealer

Neorg 的配置是递归的,在 Lazy 的安装配置中修改 config 的值为函数,然后在 load 中增加需要加载的模块,比如要使用 cincealer 那就要 load 的值就应该为:

load = {
    ["core.defaults"] = {},
    ["core.concealer"] = {},
}

然后如果要对 concealer 模块进行进一步的设置就要在对于模块中增加 config table ,具体需要配置的选项可以在 Neorg 的 wiki 中的具体模块确认,具体可参考 [Setup Guide]。

自动生成元数据/summary

运行 :Neorg inject-metadata 即可在 norg 文件的顶部生成元数据,具体可见 metagen 。 在配置文件中加载 core.summary 模块,还可以根据 norg 文件生成工作区间的所有链接,可以有效的减少手动在 index.norg 文件中增加一条一条的链接,加载后运行命令 :Neorg generate-workspace-summary 即可在 index 的 heading 下生成,目前我还没找到特别有效的可以自动更新生成结果的方法,具体可见 summary

导出为 markdown

平时在 Notion 上记录之后,如果觉得需要放到个人博客上,往往我需要将内容复制导出为 markdown 文件,然后手动增加元数据,如果要迁移到 Neorg 那么导出为 markdown 格式也是很重要的功能。 直接使用 core.export.markdown 导出即可,在配置中增加 extensions = "all" ,就可以实现包括 Neorg 生成的元数据导出,具体在导出时需要 nvim 中运行 :Neorg export to-file,具体可见 Exporting Files 。 同时我个人使用的博客框架是 zola ,而 zola 需要的 markdown 文件内要包含 Front matter ,虽然 zola 推荐这个数据采用 TOML 的格式,但是也支持 YAML 格式,而 Neorg 导出后的元数据正是 YAML 格式,所以只需要很小的改动即可快速的将内容修改至兼容 zola 的格式,其中不同的数据内容理论上可以自动化实现。 虽然相比 Notion 好像是更加方便了,但是因为使用了类似 Anchor 的功能,在导出 markdown 和 zola 构建的过程中,依旧会出现不兼容的情况,markdown 的内部锚点链接不支持中文。而对于 Neorg 简化的锚点链接(只需要在 [] 中输入完整的链接名称即可,会调转到那个完整的链接位置),markdown 好像并不支持,目前这两个问题只能暂时规避。

一些问题

strikethrough 渲染不成功

macOS 上我使用的是 iTerm2 在模拟终端中是可以渲染删除线的,但是在 neovim 和 lunarvim 中删除线均不能正常显示,通过修改 term.info 即可实现正常渲染删除线,具体可见删除线渲染。 终端中运行 infocmp $TERM > myterm.info 生成当前终端的信息,然后在 myterm.info 文件末尾加上 smxx=E[9m, rmxx=E[29m, ,最后运行 tic -x myterm.info 将修改后的终端信息写入数据库,具体可见 [Add strikethrough support in terminal] 。 虽然解决了不渲染的问题,但是底层的根本原因我并未弄清楚,留待以后学习吧。

链接 Concealer 渲染

默认 conceallevel 为 0 ,设置 conceallevel 为 2 即可实现链接渲染,通过新增文件 ~/.config/lvim/after/ftplugin/norg.lua,并在其中添加 vim.opt_local.conceallevel = 2 实现只针对 norg 文件设置 conceallevel ,具体可见 :h conceallevel 。 链接渲染成功,但是在开启自动换行(line wrap)后出现了大段的空白,这是一个 vim/neovim 的遗留问题,目前并没有任何可靠的修复,Neorg 官方给出了一些解决方案但都不完美,具体见 [Ugly line wraps when concealing text]。

奇怪的折叠表现

当我第一次使用 nvim 打开文本的时候,折叠并不会发生,但是如果此时再打开一个新的文件,那么折叠就发生了,而且不限制文件类型,例如我第一次打开一个 norg 文件,然后再窗口内打开 lvim 的配置文件 config.lua ,此时这个配置文件就发生了折叠。在 Neorg 的 core.concealer 的配置中设置 folds 为 false 貌似解决了这个问题,因为我并不怎么需要使用折叠,所以目前这个解决方案还行。

中文输入法自动切换

作为文字记录的工具,对于本地输入法的支持就显得尤为重要,这个部分的记录就单独的放在另外的记录中。

结论

目前我的 Neorg 体验并不完美,官方的文档显得有些杂乱,仓库内容也很分散,导致在查找的时候要多方搜索,配置 Neorg 最好的地方是在 Neorg 仓库的 wiki ,需确认 Neorg 语法最好的是直接在 nvim 中运行 :h neorg 其中也有指向 norg spec 的仓库,然后还有一个非官方的 Tutorial 仓库,最后就是作者的 YouTube 视频系列 。即使是不完美的 Neorg 也让我想要将所有 Notion 中的内容进行迁移,Notion 引入了大量的 AI 功能,然后在网速不佳的情况下使用体验实在是太差了,更别提 Notion 的性能了,在我看来 Notion 的缺点远远 Neorg 的缺点,接下来就是慢慢的将 Notion 中的内容逐步进行迁移,并逐渐的扩展 Neorg 和 Neovim 的知识体系。

配置(lazy.vim)

{
    "nvim-neorg/neorg",
    dependencies = { "luarocks.nvim" },
    lazy = false, -- Disable lazy loading as some `lazy.nvim` distributions set `lazy = true` by default
    version = "*", -- Pin Neorg to the latest stable release
    config = function()
        -- setting up Neorg
        require("neorg").setup {
            load = {
                ["core.defaults"] = {},
                ["core.concealer"] = {
                    config = {
                        folds = false,
                        icon_preset = "diamond",
                    },
                },
                ["core.export"] = {},

                ["core.completion"] = {
                    config = {
                        engine = "nvim-cmp",
                    },
                },
                ["core.summary"] = {},
                ["core.esupports.indent"] = {
                    config = {
                        format_on_enter = true,
                        format_on_escape = true,
                    },
                },
                ["core.export.markdown"] = {
                    config = {
                        extensions = "all",
                    },
                },
            },
        }
    end,
    -- fix: TS error see: https://github.com/nvim-neorg/neorg/pull/891
    -- ignore the TS error and run `:Neorg sync-parsers` inside nvim
},

安装

配置

line wrap with concealer

删除线渲染