summaryrefslogtreecommitdiff
path: root/config/nvim/lua/plugins/markdown.lua
blob: b298554984e0ca181e41df135a2a283ac5ae7857 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
-- In-buffer markdown rendering: headings, code blocks, tables, callouts and
-- checkboxes rendered in place, in the one buffer. No preview window or split.
-- The cursor line keeps its raw syntax (the plugin's anti_conceal), so editing
-- is unaffected. <leader>mt toggles rendering for the current buffer.
return {
    {
        "MeanderingProgrammer/render-markdown.nvim",
        ft = { "markdown" },
        dependencies = { "nvim-tree/nvim-web-devicons" },
        opts = {},
        config = function(_, opts)
            require("render-markdown").setup(opts)

            -- render-markdown takes its per-level heading colours from the
            -- treesitter captures @markup.heading.{1..6}.markdown. None of the
            -- colourschemes under config/nvim/colors/ define treesitter groups
            -- at all -- happy_hacking, onehalfdark and ayu were each checked --
            -- so those captures resolve to nothing and every heading level
            -- renders with no colour. Supply a ramp, but only where the theme
            -- left the group undefined, so a theme that does define them keeps
            -- its own. Re-applied on ColorScheme, since cfg-watch switches the
            -- theme at runtime and `:colorscheme` can clear highlight groups.
            local ramps = {
                dark = {
                    { "#F3F2CC", 230 },
                    { "#FAD566", 221 },
                    { "#B3EBBF", 157 },
                    { "#81A2C7", 103 },
                    { "#F77EBD", 211 },
                    { "#fcb280", 179 },
                },
                light = {
                    { "#2F2F2F", 236 },
                    { "#8C6D1F", 136 },
                    { "#3F6B3F", 22 },
                    { "#3A5A8C", 24 },
                    { "#8C3A6B", 89 },
                    { "#8C5A2F", 130 },
                },
            }
            local function set_heading_colors()
                local ramp = ramps[vim.o.background] or ramps.dark
                for level = 1, 6 do
                    local name = "RenderMarkdownH" .. level
                    -- Put render-markdown's own link back first, so a theme that
                    -- does define the capture wins, and so this stays correct
                    -- after a theme switch.
                    vim.api.nvim_set_hl(0, name, { link = "@markup.heading." .. level .. ".markdown" })
                    local hl = vim.api.nvim_get_hl(0, { name = name })
                    if not (hl.fg or hl.bg or hl.bold or hl.italic or hl.underline) then
                        vim.api.nvim_set_hl(0, name, {
                            fg = ramp[level][1],
                            ctermfg = ramp[level][2],
                            bold = true,
                        })
                    end
                end
            end
            set_heading_colors()
            vim.api.nvim_create_autocmd("ColorScheme", { callback = set_heading_colors })

            vim.api.nvim_create_autocmd("FileType", {
                pattern = "markdown",
                callback = function(event)
                    vim.keymap.set("n", "<leader>mt", "<cmd>RenderMarkdown buf_toggle<cr>", {
                        buffer = event.buf,
                        desc = "Toggle markdown rendering",
                    })
                end,
            })
        end,
    },
}