[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-73384":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":35,"trendingCount":16,"starSnapshotCount":16,"syncStatus":36,"lastSyncTime":37,"discoverSource":38},73384,"render-markdown.nvim","MeanderingProgrammer\u002Frender-markdown.nvim","MeanderingProgrammer","Improve viewing Markdown in Neovim","",null,"Lua",4677,115,11,8,0,17,44,132,51,28.19,"MIT License",false,"main",true,[27,28,29,30,31,32],"lua","markdown","neovim","neovim-plugin","nvim","nvim-plugin","2026-06-12 02:03:12","# render-markdown.nvim\n\nImprove viewing Markdown in Neovim\n\n\u003C!-- panvimdoc-ignore-start -->\n\n| Screenshot | Video     |\n| ---------- | --------- |\n| ![Heading](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F40655575-b091-4ab8-b830-38f8004d7746) | ![Heading](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F03f629ea-f6da-4f05-a035-827fd944e8be) |\n| ![Table](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F7d021918-e89c-4b7d-b33a-869390f9a826)   | ![Table](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Ffdbcfbfa-5f9e-49b7-8c19-f7e837979a7a)   |\n| ![Quote](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F822ae62c-bc0f-40a7-b8bb-fb3a885a95f9)   | ![Quote](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Faa002ac7-b30f-4079-bba9-505160a4ad78)   |\n| ![Callout](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fe468a463-bc8d-420c-bb4c-da1263795092) | ![Callout](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fd56cc5c7-43cd-4ce7-ad33-6164c2e23875) |\n| ![Latex](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F68f27ff3-49c8-42b5-bb7a-3b89c1e98401)   | ![Latex](https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F41e657a6-bcc2-464d-ab8c-a23bfcb80b0f)   |\n\n\u003C!-- panvimdoc-ignore-end -->\n\n# Features\n\n- Contained: runs entirely inside Neovim with no external windows\n- Configurable: all components, padding, icons, and colors can be modified\n- File type agnostic: can render `markdown` injected into any file\n  - Automatically runs on lazy load file types defined in `lazy.nvim` `ft`\n- Injections: can directly manipulate treesitter to add logical `markdown` sections\n- Modal rendering: changes between `rendered` and `raw` view based on mode\n- Anti-conceal: hides virtual text added by this plugin on cursor line\n- Window options: changes option values between `rendered` and `raw` view\n- Large files: only renders visible range, can be entirely disabled based on size\n- Custom rendering: provides extension point where user can add anything\n- Renders the following `markdown` components out of the box:\n  - Headings: icon, color, border, padding [^1], width\n  - Code blocks: background, language icon [^1] [^2], border, padding [^1], width\n  - Code inline: background\n  - Horizontal breaks: icon, color, width\n  - List bullets: icon, color, padding [^1]\n  - Checkboxes: icon, color, user defined states\n  - Block quotes: icon, color, line breaks [^1]\n  - Callouts: icon, color, user defined values, Github & Obsidian defaults\n  - Tables: border, color, alignment indicator, auto align cells [^1]\n  - Links [^1]: icon, color, user defined destinations\n  - Latex blocks [^3]: renders formulas\n  - Org indent mode [^1]: per level padding\n\n[^1]: Requires neovim >= `0.10.0`\n[^2]: Requires icon provider, `mini.icons` or `nvim-web-devicons`\n[^3]: Requires `latex` parser and `pylatexenc`\n\n# Requirements\n\n- Neovim `>= 0.9.0` (minimum) `>= 0.10.0` (recommended)\n- Nerd font symbols: [more details](https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim\u002Fwiki\u002FFonts)\n- [treesitter](https:\u002F\u002Fgithub.com\u002Fnvim-treesitter\u002Fnvim-treesitter) parsers:\n  - [markdown & markdown_inline](https:\u002F\u002Fgithub.com\u002Ftree-sitter-grammars\u002Ftree-sitter-markdown):\n    Used to parse `markdown` files\n  - [html](https:\u002F\u002Fgithub.com\u002Ftree-sitter\u002Ftree-sitter-html) (Optional):\n    Used to conceal `HTML` comments\n  - [latex](https:\u002F\u002Fgithub.com\u002Flatex-lsp\u002Ftree-sitter-latex) (Optional):\n    Used to get `latex` blocks from `markdown` files\n  - [yaml](https:\u002F\u002Fgithub.com\u002Ftree-sitter-grammars\u002Ftree-sitter-yaml) (Optional):\n    Used to render elements in `frontmatter` metadata\n- Icon provider plugin (Optional): Used for icon above code blocks\n  - [mini.icons](https:\u002F\u002Fgithub.com\u002Fnvim-mini\u002Fmini.nvim\u002Fblob\u002Fmain\u002Freadmes\u002Fmini-icons.md)\n  - [nvim-web-devicons](https:\u002F\u002Fgithub.com\u002Fnvim-tree\u002Fnvim-web-devicons)\n- System dependencies:\n  - [libtexprintf](https:\u002F\u002Fgithub.com\u002Fbartp5\u002Flibtexprintf) (Optional):\n    Used to transform `latex` strings to appropriate unicode using `utftex`\n  - [pylatexenc](https:\u002F\u002Fpypi.org\u002Fproject\u002Fpylatexenc\u002F) (Optional):\n    Used to transform `latex` strings to appropriate unicode using `latex2text`\n\n# Install\n\n## vim.pack\n\n```lua\nvim.pack.add({\n    'https:\u002F\u002Fgithub.com\u002Fnvim-treesitter\u002Fnvim-treesitter',\n    'https:\u002F\u002Fgithub.com\u002Fnvim-mini\u002Fmini.nvim',            -- if you use the mini.nvim suite\n    -- 'https:\u002F\u002Fgithub.com\u002Fnvim-mini\u002Fmini.icons',        -- if you use standalone mini plugins\n    -- 'https:\u002F\u002Fgithub.com\u002Fnvim-tree\u002Fnvim-web-devicons', -- if you prefer nvim-web-devicons\n    'https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim',\n})\nrequire('render-markdown').setup({}) -- only mandatory if you want to set custom options\n```\n\n## lazy.nvim\n\n```lua\n{\n    'MeanderingProgrammer\u002Frender-markdown.nvim',\n    dependencies = { 'nvim-treesitter\u002Fnvim-treesitter', 'nvim-mini\u002Fmini.nvim' },            -- if you use the mini.nvim suite\n    -- dependencies = { 'nvim-treesitter\u002Fnvim-treesitter', 'nvim-mini\u002Fmini.icons' },        -- if you use standalone mini plugins\n    -- dependencies = { 'nvim-treesitter\u002Fnvim-treesitter', 'nvim-tree\u002Fnvim-web-devicons' }, -- if you prefer nvim-web-devicons\n    ---@module 'render-markdown'\n    ---@type render.md.UserConfig\n    opts = {},\n}\n```\n\n## rocks.nvim\n\nThis plugin is available on [LuaRocks](https:\u002F\u002Fluarocks.org\u002Fmodules\u002FMeanderingProgrammer\u002Frender-markdown.nvim)\n\n```vim\n:Rocks install render-markdown.nvim\n```\n\n## packer.nvim\n\n```lua\nuse({\n    'MeanderingProgrammer\u002Frender-markdown.nvim',\n    after = { 'nvim-treesitter' },\n    requires = { 'nvim-mini\u002Fmini.nvim', opt = true },            -- if you use the mini.nvim suite\n    -- requires = { 'nvim-mini\u002Fmini.icons', opt = true },        -- if you use standalone mini plugins\n    -- requires = { 'nvim-tree\u002Fnvim-web-devicons', opt = true }, -- if you prefer nvim-web-devicons\n    config = function()\n        require('render-markdown').setup({})\n    end,\n})\n```\n\n# Commands\n\n| Command                         | Lua Function                                | Description                                       |\n| ------------------------------- | ------------------------------------------- | ------------------------------------------------- |\n| `:RenderMarkdown`               | `require('render-markdown').enable()`       | Alias for `enable`                                |\n| `:RenderMarkdown enable`        | `require('render-markdown').enable()`       | Alias for `set(true)`                             |\n| `:RenderMarkdown buf_enable`    | `require('render-markdown').buf_enable()`   | Alias for `set_buf(true)`                         |\n| `:RenderMarkdown disable`       | `require('render-markdown').disable()`      | Alias for `set(false)`                            |\n| `:RenderMarkdown buf_disable`   | `require('render-markdown').buf_disable()`  | Alias for `set_buf(false)`                        |\n| `:RenderMarkdown toggle`        | `require('render-markdown').toggle()`       | Alias for `set()`                                 |\n| `:RenderMarkdown buf_toggle`    | `require('render-markdown').buf_toggle()`   | Alias for `set_buf()`                             |\n| `:RenderMarkdown get`           | `require('render-markdown').get()`          | Return current state                              |\n| `:RenderMarkdown set bool?`     | `require('render-markdown').set(bool?)`     | Sets state, `nil` to toggle                       |\n| `:RenderMarkdown set_buf bool?` | `require('render-markdown').set_buf(bool?)` | Sets state for current buffer, `nil` to toggle    |\n| `:RenderMarkdown preview`       | `require('render-markdown').preview()`      | Show rendered buffer to the side                  |\n| `:RenderMarkdown log`           | `require('render-markdown').log()`          | Opens the log file for this plugin                |\n| `:RenderMarkdown expand`        | `require('render-markdown').expand()`       | Increase anti-conceal margin above and below by 1 |\n| `:RenderMarkdown contract`      | `require('render-markdown').contract()`     | Decrease anti-conceal margin above and below by 1 |\n| `:RenderMarkdown debug`         | `require('render-markdown').debug()`        | Prints information about marks on current line    |\n| `:RenderMarkdown config`        | `require('render-markdown').config()`       | Prints difference between config and default      |\n\n# Completions\n\nThis plugin provides completions for both checkboxes and callouts provided you follow\nthe relevant setup.\n\n## in-process lsp\n\nThe recommended way of getting completions from this plugin. Only requires being\nenabled with no additional configuration, assuming you have general LSP completions.\n\nWorks automatically with `nvim-cmp` and `blink.cmp`.\n\n```lua\nrequire('render-markdown').setup({\n    completions = { lsp = { enabled = true } },\n})\n```\n\n## coq_nvim\n\n```lua\nrequire('render-markdown').setup({\n    completions = { coq = { enabled = true } },\n})\n```\n\n# Setup\n\nCheckout the [Wiki](https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim\u002Fwiki)\nfor examples and images associated with different configuration options.\n\nThe full default configuration is provided below for reference.\n\nAny part of it can be modified however for many fields this does not make much sense.\n\nSome of the more useful fields are discussed further down.\n\n\u003Cdetails>\n\n\u003Csummary>Default Configuration\u003C\u002Fsummary>\n\n```lua\nrequire('render-markdown').setup({\n    -- Whether markdown should be rendered by default.\n    enabled = true,\n    -- Vim modes that will show a rendered view of the markdown file, :h mode(), for all enabled\n    -- components. Individual components can be enabled for other modes. Remaining modes will be\n    -- unaffected by this plugin.\n    render_modes = { 'n', 'c', 't' },\n    -- Milliseconds that must pass before updating marks, updates occur.\n    -- within the context of the visible window, not the entire buffer.\n    debounce = 100,\n    -- Pre configured settings that will attempt to mimic various target user experiences.\n    -- User provided settings will take precedence.\n    -- | obsidian | mimic Obsidian UI                                          |\n    -- | lazy     | will attempt to stay up to date with LazyVim configuration |\n    -- | none     | does nothing                                               |\n    preset = 'none',\n    -- The level of logs to write to file: vim.fn.stdpath('state') .. '\u002Frender-markdown.log'.\n    -- Only intended to be used for plugin development \u002F debugging.\n    log_level = 'error',\n    -- Print runtime of main update method.\n    -- Only intended to be used for plugin development \u002F debugging.\n    log_runtime = false,\n    -- Filetypes this plugin will run on.\n    file_types = { 'markdown' },\n    -- Maximum file size (in MB) that this plugin will attempt to render.\n    -- File larger than this will effectively be ignored.\n    max_file_size = 10.0,\n    -- Takes buffer as input, if it returns true this plugin will not attach to the buffer.\n    ignore = function()\n        return false\n    end,\n    -- Whether markdown should be rendered when nested inside markdown, i.e. markdown code block\n    -- inside markdown file.\n    nested = true,\n    -- Additional events that will trigger this plugin's render loop.\n    change_events = {},\n    -- Whether the treesitter highlighter should be restarted after this plugin attaches to its\n    -- first buffer for the first time. May be necessary if this plugin is lazy loaded to clear\n    -- highlights that have been dynamically disabled.\n    restart_highlighter = false,\n    injections = {\n        -- Out of the box language injections for known filetypes that allow markdown to be interpreted\n        -- in specified locations, see :h treesitter-language-injections.\n        -- Set enabled to false in order to disable.\n\n        gitcommit = {\n            enabled = true,\n            query = [[\n                ((message) @injection.content\n                    (#set! injection.combined)\n                    (#set! injection.include-children)\n                    (#set! injection.language \"markdown\"))\n            ]],\n        },\n    },\n    patterns = {\n        -- Highlight patterns to disable for filetypes, i.e. lines concealed around code blocks\n\n        markdown = {\n            disable = true,\n            directives = {\n                { id = 17, name = 'conceal_lines' },\n                { id = 18, name = 'conceal_lines' },\n            },\n        },\n    },\n    anti_conceal = {\n        -- This enables hiding added text on the line the cursor is on.\n        enabled = true,\n        -- Modes to disable anti conceal feature.\n        disabled_modes = false,\n        -- Number of lines above cursor to show.\n        above = 0,\n        -- Number of lines below cursor to show.\n        below = 0,\n        -- Which elements to always show, ignoring anti conceal behavior. Values can either be\n        -- booleans to fix the behavior or string lists representing modes where anti conceal\n        -- behavior will be ignored. Valid values are:\n        --   bullet\n        --   callout\n        --   check_icon, check_scope\n        --   code_background, code_border, code_language\n        --   dash\n        --   head_background, head_border, head_icon\n        --   indent\n        --   latex\n        --   link\n        --   quote\n        --   sign\n        --   table_border\n        --   virtual_lines\n        ignore = {\n            code_background = true,\n            indent = true,\n            sign = true,\n            virtual_lines = true,\n        },\n    },\n    padding = {\n        -- Highlight to use when adding whitespace, should match background.\n        highlight = 'Normal',\n    },\n    latex = {\n        -- Turn on \u002F off latex rendering.\n        enabled = true,\n        -- Additional modes to render latex.\n        render_modes = false,\n        -- Executable used to convert latex formula to rendered unicode.\n        -- If a list is provided the commands run in order until the first success.\n        converter = { 'utftex', 'latex2text' },\n        -- Highlight for latex blocks.\n        highlight = 'RenderMarkdownMath',\n        -- Determines where latex formula is rendered relative to block.\n        -- | above  | above latex block                               |\n        -- | below  | below latex block                               |\n        -- | center | centered with latex block (must be single line) |\n        position = 'center',\n        -- Number of empty lines above latex blocks.\n        top_pad = 0,\n        -- Number of empty lines below latex blocks.\n        bottom_pad = 0,\n    },\n    on = {\n        -- Called when plugin initially attaches to a buffer.\n        attach = function() end,\n        -- Called before adding marks to the buffer for the first time.\n        initial = function() end,\n        -- Called after plugin renders a buffer.\n        render = function() end,\n        -- Called after plugin clears a buffer.\n        clear = function() end,\n    },\n    completions = {\n        -- Settings for blink.cmp completions source\n        blink = { enabled = false },\n        -- Settings for coq_nvim completions source\n        coq = { enabled = false },\n        -- Settings for in-process language server completions\n        lsp = { enabled = false },\n        filter = {\n            callout = function()\n                -- example to exclude obsidian callouts\n                -- return value.category ~= 'obsidian'\n                return true\n            end,\n            checkbox = function()\n                return true\n            end,\n        },\n    },\n    heading = {\n        -- Useful context to have when evaluating values.\n        -- | level    | the number of '#' in the heading marker         |\n        -- | sections | for each level how deeply nested the heading is |\n\n        -- Turn on \u002F off heading icon & background rendering.\n        enabled = true,\n        -- Additional modes to render headings.\n        render_modes = false,\n        -- Turn on \u002F off atx heading rendering.\n        atx = true,\n        -- Turn on \u002F off setext heading rendering.\n        setext = true,\n        -- Turn on \u002F off sign column related rendering.\n        sign = true,\n        -- Replaces '#+' of 'atx_h._marker'.\n        -- Output is evaluated depending on the type.\n        -- | function | `value(context)`              |\n        -- | string[] | `cycle(value, context.level)` |\n        icons = { '󰲡 ', '󰲣 ', '󰲥 ', '󰲧 ', '󰲩 ', '󰲫 ' },\n        -- Determines how icons fill the available space.\n        -- | eol     | '#'s are concealed and icon is placed at right most column   |\n        -- | right   | '#'s are concealed and icon is appended to right side        |\n        -- | inline  | '#'s are concealed and icon is inlined on left side          |\n        -- | overlay | icon is left padded with spaces and overlayed hiding all '#' |\n        position = 'overlay',\n        -- Added to the sign column if enabled.\n        -- Output is evaluated by `cycle(value, context.level)`.\n        signs = { '󰫎 ' },\n        -- Width of the heading background.\n        -- | block | width of the heading text |\n        -- | full  | full width of the window  |\n        -- Can also be a list of the above values evaluated by `clamp(value, context.level)`.\n        width = 'full',\n        -- Amount of margin to add to the left of headings.\n        -- Margin available space is computed after accounting for padding.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        -- Can also be a list of numbers evaluated by `clamp(value, context.level)`.\n        left_margin = 0,\n        -- Amount of padding to add to the left of headings.\n        -- Output is evaluated using the same logic as 'left_margin'.\n        left_pad = 0,\n        -- Amount of padding to add to the right of headings when width is 'block'.\n        -- Output is evaluated using the same logic as 'left_margin'.\n        right_pad = 0,\n        -- Minimum width to use for headings when width is 'block'.\n        -- Can also be a list of integers evaluated by `clamp(value, context.level)`.\n        min_width = 0,\n        -- Determines if a border is added above and below headings.\n        -- Can also be a list of booleans evaluated by `clamp(value, context.level)`.\n        border = false,\n        -- Always use virtual lines for heading borders instead of attempting to use empty lines.\n        border_virtual = false,\n        -- Highlight the start of the border using the foreground highlight.\n        border_prefix = false,\n        -- Used above heading for border.\n        above = '▄',\n        -- Used below heading for border.\n        below = '▀',\n        -- Highlight for the heading icon and extends through the entire line.\n        -- Output is evaluated by `clamp(value, context.level)`.\n        backgrounds = {\n            'RenderMarkdownH1Bg',\n            'RenderMarkdownH2Bg',\n            'RenderMarkdownH3Bg',\n            'RenderMarkdownH4Bg',\n            'RenderMarkdownH5Bg',\n            'RenderMarkdownH6Bg',\n        },\n        -- Highlight for the heading and sign icons.\n        -- Output is evaluated using the same logic as 'backgrounds'.\n        foregrounds = {\n            'RenderMarkdownH1',\n            'RenderMarkdownH2',\n            'RenderMarkdownH3',\n            'RenderMarkdownH4',\n            'RenderMarkdownH5',\n            'RenderMarkdownH6',\n        },\n        -- Define custom heading patterns which allow you to override various properties based on\n        -- the contents of a heading.\n        -- The key is for healthcheck and to allow users to change its values, value type below.\n        -- | pattern    | matched against the heading text @see :h lua-patterns |\n        -- | icon       | optional override for the icon                        |\n        -- | background | optional override for the background                  |\n        -- | foreground | optional override for the foreground                  |\n        custom = {},\n    },\n    paragraph = {\n        -- Useful context to have when evaluating values.\n        -- | text | text value of the node |\n\n        -- Turn on \u002F off paragraph rendering.\n        enabled = true,\n        -- Additional modes to render paragraphs.\n        render_modes = false,\n        -- Amount of margin to add to the left of paragraphs.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        -- Output is evaluated depending on the type.\n        -- | function | `value(context)` |\n        -- | number   | `value`          |\n        left_margin = 0,\n        -- Amount of padding to add to the first line of each paragraph.\n        -- Output is evaluated using the same logic as 'left_margin'.\n        indent = 0,\n        -- Minimum width to use for paragraphs.\n        min_width = 0,\n    },\n    code = {\n        -- Turn on \u002F off code block & inline code rendering.\n        enabled = true,\n        -- Additional modes to render code blocks.\n        render_modes = false,\n        -- Turn on \u002F off sign column related rendering.\n        sign = true,\n        -- Whether to conceal nodes at the top and bottom of code blocks.\n        conceal_delimiters = true,\n        -- Turn on \u002F off language heading related rendering.\n        language = true,\n        -- Determines where language icon is rendered.\n        -- | center | center of code block |\n        -- | right  | right of code block  |\n        -- | left   | left of code block   |\n        position = 'left',\n        -- Whether to include the language icon above code blocks.\n        language_icon = true,\n        -- Whether to include the language name above code blocks.\n        language_name = true,\n        -- Whether to include the language info above code blocks.\n        language_info = true,\n        -- Amount of padding to add around the language.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        language_pad = 0,\n        -- A list of language names for which rendering will be disabled.\n        disable = {},\n        -- A list of language names for which background highlighting will be disabled.\n        -- Likely because that language has background highlights itself.\n        -- Use a boolean to make behavior apply to all languages.\n        -- Borders above & below blocks will continue to be rendered.\n        disable_background = { 'diff' },\n        -- Number of lines from start\u002Fend to skip rendering background.\n        background_inset = 1,\n        -- Width of the code block background.\n        -- | block | width of the code block  |\n        -- | full  | full width of the window |\n        width = 'full',\n        -- Amount of margin to add to the left of code blocks.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        -- Margin available space is computed after accounting for padding.\n        left_margin = 0,\n        -- Amount of padding to add to the left of code blocks.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        left_pad = 0,\n        -- Amount of padding to add to the right of code blocks when width is 'block'.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        right_pad = 0,\n        -- Minimum width to use for code blocks when width is 'block'.\n        min_width = 0,\n        -- Determines how the top \u002F bottom of code block are rendered.\n        -- | none  | do not render a border                               |\n        -- | thick | use the same highlight as the code body              |\n        -- | thin  | when lines are empty overlay the above & below icons |\n        -- | hide  | conceal lines unless language name or icon is added  |\n        border = 'hide',\n        -- Used above code blocks to fill remaining space around language.\n        language_border = '█',\n        -- Added to the left of language.\n        language_left = '',\n        -- Added to the right of language.\n        language_right = '',\n        -- Used above code blocks for thin border.\n        above = '▄',\n        -- Used below code blocks for thin border.\n        below = '▀',\n        -- Turn on \u002F off inline code related rendering.\n        inline = true,\n        -- Icon to add to the left of inline code.\n        inline_left = '',\n        -- Icon to add to the right of inline code.\n        inline_right = '',\n        -- Padding to add to the left & right of inline code.\n        inline_pad = 0,\n        -- Priority to assign to code background highlight.\n        priority = 140,\n        -- Highlight for code blocks.\n        highlight = 'RenderMarkdownCode',\n        -- Highlight for code info section, after the language.\n        highlight_info = 'RenderMarkdownCodeInfo',\n        -- Highlight for language, overrides icon provider value.\n        highlight_language = nil,\n        -- Highlight for border, use false to add no highlight.\n        highlight_border = 'RenderMarkdownCodeBorder',\n        -- Highlight for language, used if icon provider does not have a value.\n        highlight_fallback = 'RenderMarkdownCodeFallback',\n        -- Highlight for inline code.\n        highlight_inline = 'RenderMarkdownCodeInline',\n        -- Highlight for inline code left icon, default to reverse of highlight_inline.\n        highlight_inline_left = nil,\n        -- Highlight for inline code right icon, default to reverse of highlight_inline.\n        highlight_inline_right = nil,\n        -- Determines how code blocks & inline code are rendered.\n        -- | none     | { enabled = false }                           |\n        -- | normal   | { language = false }                          |\n        -- | language | { disable_background = true, inline = false } |\n        -- | full     | uses all default values                       |\n        style = 'full',\n    },\n    dash = {\n        -- Useful context to have when evaluating values.\n        -- | width | width of the current window |\n\n        -- Turn on \u002F off thematic break rendering.\n        enabled = true,\n        -- Additional modes to render dash.\n        render_modes = false,\n        -- Replaces '---'|'***'|'___'|'* * *' of 'thematic_break'.\n        -- The icon gets repeated across the window's width.\n        icon = '─',\n        -- Width of the generated line.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        -- Output is evaluated depending on the type.\n        -- | function | `value(context)`    |\n        -- | number   | `value`             |\n        -- | full     | width of the window |\n        width = 'full',\n        -- Amount of margin to add to the left of dash.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        left_margin = 0,\n        -- Priority to assign to dash.\n        priority = nil,\n        -- Highlight for the whole line generated from the icon.\n        highlight = 'RenderMarkdownDash',\n    },\n    document = {\n        -- Turn on \u002F off document rendering.\n        enabled = true,\n        -- Additional modes to render document.\n        render_modes = false,\n        -- Ability to conceal arbitrary ranges of text based on lua patterns, @see :h lua-patterns.\n        -- Relies entirely on user to set patterns that handle their edge cases.\n        conceal = {\n            -- Matched ranges will be concealed using character level conceal.\n            char_patterns = {},\n            -- Matched ranges will be concealed using line level conceal.\n            line_patterns = {},\n        },\n    },\n    bullet = {\n        -- Useful context to have when evaluating values.\n        -- | level | how deeply nested the list is, 1-indexed          |\n        -- | index | how far down the item is at that level, 1-indexed |\n        -- | value | text value of the marker node                     |\n\n        -- Turn on \u002F off list bullet rendering\n        enabled = true,\n        -- Additional modes to render list bullets\n        render_modes = false,\n        -- Replaces '-'|'+'|'*' of 'list_item'.\n        -- If the item is a 'checkbox' a conceal is used to hide the bullet instead.\n        -- Output is evaluated depending on the type.\n        -- | function   | `value(context)`                                    |\n        -- | string     | `value`                                             |\n        -- | string[]   | `cycle(value, context.level)`                       |\n        -- | string[][] | `clamp(cycle(value, context.level), context.index)` |\n        icons = { '●', '○', '◆', '◇' },\n        -- Replaces 'n.'|'n)' of 'list_item'.\n        -- Output is evaluated using the same logic as 'icons'.\n        ordered_icons = function(ctx)\n            local value = vim.trim(ctx.value)\n            local index = tonumber(value:sub(1, #value - 1))\n            return ('%d.'):format(index > 1 and index or ctx.index)\n        end,\n        -- Padding to add to the left of bullet point.\n        -- Output is evaluated depending on the type.\n        -- | function | `value(context)` |\n        -- | integer  | `value`          |\n        left_pad = 0,\n        -- Padding to add to the right of bullet point.\n        -- Output is evaluated using the same logic as 'left_pad'.\n        right_pad = 0,\n        -- Highlight for the bullet icon.\n        -- Output is evaluated using the same logic as 'icons'.\n        highlight = 'RenderMarkdownBullet',\n        -- Highlight for item associated with the bullet point.\n        -- Output is evaluated using the same logic as 'icons'.\n        scope_highlight = {},\n        -- Priority to assign to scope highlight.\n        scope_priority = nil,\n    },\n    checkbox = {\n        -- Checkboxes are a special instance of a 'list_item' that start with a 'shortcut_link'.\n        -- There are two special states for unchecked & checked defined in the markdown grammar.\n\n        -- Turn on \u002F off checkbox state rendering.\n        enabled = true,\n        -- Additional modes to render checkboxes.\n        render_modes = false,\n        -- Render the bullet point before the checkbox.\n        bullet = false,\n        -- Padding to add to the left of checkboxes.\n        left_pad = 0,\n        -- Padding to add to the right of checkboxes.\n        right_pad = 1,\n        unchecked = {\n            -- Replaces '[ ]' of 'task_list_marker_unchecked'.\n            icon = '󰄱 ',\n            -- Highlight for the unchecked icon.\n            highlight = 'RenderMarkdownUnchecked',\n            -- Highlight for item associated with unchecked checkbox.\n            scope_highlight = nil,\n        },\n        checked = {\n            -- Replaces '[x]' of 'task_list_marker_checked'.\n            icon = '󰱒 ',\n            -- Highlight for the checked icon.\n            highlight = 'RenderMarkdownChecked',\n            -- Highlight for item associated with checked checkbox.\n            scope_highlight = nil,\n        },\n        -- Define custom checkbox states, more involved, not part of the markdown grammar.\n        -- As a result this requires neovim >= 0.10.0 since it relies on 'inline' extmarks.\n        -- The key is for healthcheck and to allow users to change its values, value type below.\n        -- | raw             | matched against the raw text of a 'shortcut_link'           |\n        -- | rendered        | replaces the 'raw' value when rendering                     |\n        -- | highlight       | highlight for the 'rendered' icon                           |\n        -- | scope_highlight | optional highlight for item associated with custom checkbox |\n        -- stylua: ignore\n        custom = {\n            todo = { raw = '[-]', rendered = '󰥔 ', highlight = 'RenderMarkdownTodo', scope_highlight = nil },\n        },\n        -- Priority to assign to scope highlight.\n        scope_priority = nil,\n    },\n    quote = {\n        -- Turn on \u002F off block quote & callout rendering.\n        enabled = true,\n        -- Additional modes to render quotes.\n        render_modes = false,\n        -- Replaces '>' of 'block_quote'.\n        icon = '▋',\n        -- Whether to repeat icon on wrapped lines. Requires neovim >= 0.10. This will obscure text\n        -- if incorrectly configured with :h 'showbreak', :h 'breakindent' and :h 'breakindentopt'.\n        -- A combination of these that is likely to work follows.\n        -- | showbreak      | '  ' (2 spaces)   |\n        -- | breakindent    | true              |\n        -- | breakindentopt | '' (empty string) |\n        -- These are not validated by this plugin. If you want to avoid adding these to your main\n        -- configuration then set them in win_options for this plugin.\n        repeat_linebreak = false,\n        -- Highlight for the quote icon.\n        -- If a list is provided output is evaluated by `cycle(value, level)`.\n        highlight = {\n            'RenderMarkdownQuote1',\n            'RenderMarkdownQuote2',\n            'RenderMarkdownQuote3',\n            'RenderMarkdownQuote4',\n            'RenderMarkdownQuote5',\n            'RenderMarkdownQuote6',\n        },\n    },\n    render = {\n        -- Whether to render when window is in diff-mode.\n        diff = false,\n    },\n    pipe_table = {\n        -- Turn on \u002F off pipe table rendering.\n        enabled = true,\n        -- Additional modes to render pipe tables.\n        render_modes = false,\n        -- Pre configured settings largely for setting table border easier.\n        -- | heavy  | use thicker border characters     |\n        -- | double | use double line border characters |\n        -- | round  | use round border corners          |\n        -- | none   | does nothing                      |\n        preset = 'none',\n        -- Determines how individual cells of a table are rendered.\n        -- | overlay | writes completely over the table, removing conceal behavior and highlights |\n        -- | raw     | replaces only the '|' characters in each row, leaving the cells unmodified |\n        -- | padded  | raw + cells are padded to maximum visual width for each column             |\n        -- | trimmed | padded except empty space is subtracted from visual width calculation      |\n        cell = 'padded',\n        -- Adjust the computed width of table cells using custom logic.\n        cell_offset = function()\n            return 0\n        end,\n        -- Amount of space to put between cell contents and border.\n        padding = 1,\n        -- Minimum column width to use for padded or trimmed cell.\n        min_width = 0,\n        -- Characters used to replace table border.\n        -- Correspond to top(3), delimiter(3), bottom(3), vertical, & horizontal.\n        -- stylua: ignore\n        border = {\n            '┌', '┬', '┐',\n            '├', '┼', '┤',\n            '└', '┴', '┘',\n            '│', '─',\n        },\n        -- Turn on \u002F off top & bottom lines.\n        border_enabled = true,\n        -- Always use virtual lines for table borders instead of attempting to use empty lines.\n        -- Will be automatically enabled if indentation module is enabled.\n        border_virtual = false,\n        -- Gets placed in delimiter row for each column, position is based on alignment.\n        alignment_indicator = '━',\n        -- Highlight for table heading, delimiter, and the line above.\n        head = 'RenderMarkdownTableHead',\n        -- Highlight for everything else, main table rows and the line below.\n        row = 'RenderMarkdownTableRow',\n        -- Determines how the table as a whole is rendered.\n        -- | none   | { enabled = false }        |\n        -- | normal | { border_enabled = false } |\n        -- | full   | uses all default values    |\n        style = 'full',\n    },\n    callout = {\n        -- Callouts are a special instance of a 'block_quote' that start with a 'shortcut_link'.\n        -- The key is for healthcheck and to allow users to change its values, value type below.\n        -- | raw        | matched against the raw text of a 'shortcut_link', case insensitive |\n        -- | rendered   | replaces the 'raw' value when rendering                             |\n        -- | highlight  | highlight for the 'rendered' text and quote markers                 |\n        -- | quote_icon | optional override for quote.icon value for individual callout       |\n        -- | category   | optional metadata useful for filtering                              |\n\n        note      = { raw = '[!NOTE]',      rendered = '󰋽 Note',      highlight = 'RenderMarkdownInfo',    category = 'github'   },\n        tip       = { raw = '[!TIP]',       rendered = '󰌶 Tip',       highlight = 'RenderMarkdownSuccess', category = 'github'   },\n        important = { raw = '[!IMPORTANT]', rendered = '󰅾 Important', highlight = 'RenderMarkdownHint',    category = 'github'   },\n        warning   = { raw = '[!WARNING]',   rendered = '󰀪 Warning',   highlight = 'RenderMarkdownWarn',    category = 'github'   },\n        caution   = { raw = '[!CAUTION]',   rendered = '󰳦 Caution',   highlight = 'RenderMarkdownError',   category = 'github'   },\n        -- Obsidian: https:\u002F\u002Fhelp.obsidian.md\u002FEditing+and+formatting\u002FCallouts\n        abstract  = { raw = '[!ABSTRACT]',  rendered = '󰨸 Abstract',  highlight = 'RenderMarkdownInfo',    category = 'obsidian' },\n        summary   = { raw = '[!SUMMARY]',   rendered = '󰨸 Summary',   highlight = 'RenderMarkdownInfo',    category = 'obsidian' },\n        tldr      = { raw = '[!TLDR]',      rendered = '󰨸 Tldr',      highlight = 'RenderMarkdownInfo',    category = 'obsidian' },\n        info      = { raw = '[!INFO]',      rendered = '󰋽 Info',      highlight = 'RenderMarkdownInfo',    category = 'obsidian' },\n        todo      = { raw = '[!TODO]',      rendered = '󰗡 Todo',      highlight = 'RenderMarkdownInfo',    category = 'obsidian' },\n        hint      = { raw = '[!HINT]',      rendered = '󰌶 Hint',      highlight = 'RenderMarkdownSuccess', category = 'obsidian' },\n        success   = { raw = '[!SUCCESS]',   rendered = '󰄬 Success',   highlight = 'RenderMarkdownSuccess', category = 'obsidian' },\n        check     = { raw = '[!CHECK]',     rendered = '󰄬 Check',     highlight = 'RenderMarkdownSuccess', category = 'obsidian' },\n        done      = { raw = '[!DONE]',      rendered = '󰄬 Done',      highlight = 'RenderMarkdownSuccess', category = 'obsidian' },\n        question  = { raw = '[!QUESTION]',  rendered = '󰘥 Question',  highlight = 'RenderMarkdownWarn',    category = 'obsidian' },\n        help      = { raw = '[!HELP]',      rendered = '󰘥 Help',      highlight = 'RenderMarkdownWarn',    category = 'obsidian' },\n        faq       = { raw = '[!FAQ]',       rendered = '󰘥 Faq',       highlight = 'RenderMarkdownWarn',    category = 'obsidian' },\n        attention = { raw = '[!ATTENTION]', rendered = '󰀪 Attention', highlight = 'RenderMarkdownWarn',    category = 'obsidian' },\n        failure   = { raw = '[!FAILURE]',   rendered = '󰅖 Failure',   highlight = 'RenderMarkdownError',   category = 'obsidian' },\n        fail      = { raw = '[!FAIL]',      rendered = '󰅖 Fail',      highlight = 'RenderMarkdownError',   category = 'obsidian' },\n        missing   = { raw = '[!MISSING]',   rendered = '󰅖 Missing',   highlight = 'RenderMarkdownError',   category = 'obsidian' },\n        danger    = { raw = '[!DANGER]',    rendered = '󱐌 Danger',    highlight = 'RenderMarkdownError',   category = 'obsidian' },\n        error     = { raw = '[!ERROR]',     rendered = '󱐌 Error',     highlight = 'RenderMarkdownError',   category = 'obsidian' },\n        bug       = { raw = '[!BUG]',       rendered = '󰨰 Bug',       highlight = 'RenderMarkdownError',   category = 'obsidian' },\n        example   = { raw = '[!EXAMPLE]',   rendered = '󰉹 Example',   highlight = 'RenderMarkdownHint' ,   category = 'obsidian' },\n        quote     = { raw = '[!QUOTE]',     rendered = '󱆨 Quote',     highlight = 'RenderMarkdownQuote',   category = 'obsidian' },\n        cite      = { raw = '[!CITE]',      rendered = '󱆨 Cite',      highlight = 'RenderMarkdownQuote',   category = 'obsidian' },\n    },\n    link = {\n        -- Turn on \u002F off inline link icon rendering.\n        enabled = true,\n        -- Additional modes to render links.\n        render_modes = false,\n        -- How to handle footnote links, start with a '^'.\n        footnote = {\n            -- Turn on \u002F off footnote rendering.\n            enabled = true,\n            -- Inlined with content.\n            icon = '󰯔 ',\n            -- Custom processing for footnote body to show.\n            -- Runs before prefix \u002F suffix are added and superscript processing.\n            body = function(ctx)\n                return ctx.text\n            end,\n            -- Replace value with superscript equivalent.\n            superscript = true,\n            -- Added before link content.\n            prefix = '',\n            -- Added after link content.\n            suffix = '',\n        },\n        -- Inlined with 'image' elements.\n        image = '󰥶 ',\n        -- Check custom for 'image' elements.\n        image_custom = true,\n        -- Inlined with 'email_autolink' elements.\n        email = '󰀓 ',\n        -- Fallback icon for 'inline_link' and 'uri_autolink' elements.\n        hyperlink = '󰌹 ',\n        -- Applies to the inlined icon as a fallback.\n        highlight = 'RenderMarkdownLink',\n        -- Applies to the link title.\n        highlight_title = 'RenderMarkdownLinkTitle',\n        -- Applies to WikiLink elements.\n        wiki = {\n            -- Turn on \u002F off WikiLink rendering.\n            enabled = true,\n            -- Inlined with content.\n            icon = '󱗖 ',\n            -- Hide destination if there is an alias.\n            conceal_destination = true,\n            -- Custom processing for WikiLink body to show.\n            body = function()\n                return nil\n            end,\n            -- Applies to the inlined icon.\n            highlight = 'RenderMarkdownWikiLink',\n            -- Highlight for item associated with the WikiLink.\n            scope_highlight = nil,\n        },\n        -- Define custom destination patterns so icons can quickly inform you of what a link\n        -- contains. Applies to 'image', 'inline_link', 'uri_autolink', and WikiLink nodes.\n        -- When multiple patterns match a link the one with the longer pattern is used.\n        -- The key is for healthcheck and to allow users to change its values, value type below.\n        -- | icon      | gets inlined before the link text                               |\n        -- | pattern   | matched against the destination text                            |\n        -- | kind      | optional determines how pattern is checked                      |\n        -- |           | pattern | @see :h lua-patterns, is the default if not set       |\n        -- |           | suffix  | @see :h vim.endswith()                                |\n        -- |           | url     | similar to pattern with additional prefix checks      |\n        -- | priority  | optional used when multiple match, uses pattern length if empty |\n        -- | highlight | optional highlight for 'icon', uses fallback highlight if empty |\n        -- stylua: ignore\n        custom = {\n            web = { icon = '󰖟 ', pattern = '^http' },\n            apple = { icon = ' ', pattern = 'apple%.com', kind = 'url' },\n            discord = { icon = '󰙯 ', pattern = 'discord%.com', kind = 'url' },\n            github = { icon = '󰊤 ', pattern = 'github%.com', kind = 'url' },\n            gitlab = { icon = '󰮠 ', pattern = 'gitlab%.com', kind = 'url' },\n            google = { icon = '󰊭 ', pattern = 'google%.com', kind = 'url' },\n            hackernews = { icon = ' ', pattern = 'ycombinator%.com', kind = 'url' },\n            linkedin = { icon = '󰌻 ', pattern = 'linkedin%.com', kind = 'url' },\n            microsoft = { icon = ' ', pattern = 'microsoft%.com', kind = 'url' },\n            neovim = { icon = ' ', pattern = 'neovim%.io', kind = 'url' },\n            reddit = { icon = '󰑍 ', pattern = 'reddit%.com', kind = 'url' },\n            slack = { icon = '󰒱 ', pattern = 'slack%.com', kind = 'url' },\n            stackoverflow = { icon = '󰓌 ', pattern = 'stackoverflow%.com', kind = 'url' },\n            steam = { icon = ' ', pattern = 'steampowered%.com', kind = 'url' },\n            twitter = { icon = ' ', pattern = 'twitter%.com', kind = 'url' },\n            wikipedia = { icon = '󰖬 ', pattern = 'wikipedia%.org', kind = 'url' },\n            x = { icon = ' ', pattern = 'x%.com', kind = 'url' },\n            youtube = { icon = '󰗃 ', pattern = 'youtube[^.]*%.com', kind = 'url' },\n            youtube_short = { icon = '󰗃 ', pattern = 'youtu%.be', kind = 'url' },\n        },\n    },\n    sign = {\n        -- Turn on \u002F off sign rendering.\n        enabled = true,\n        -- Priority to assign to sign.\n        priority = nil,\n        -- Applies to background of sign text.\n        highlight = 'RenderMarkdownSign',\n    },\n    inline_highlight = {\n        -- Mimics Obsidian inline highlights when content is surrounded by double equals.\n        -- The equals on both ends are concealed and the inner content is highlighted.\n\n        -- Turn on \u002F off inline highlight rendering.\n        enabled = true,\n        -- Additional modes to render inline highlights.\n        render_modes = false,\n        -- Applies to background of surrounded text.\n        highlight = 'RenderMarkdownInlineHighlight',\n        -- Define custom highlights based on text prefix.\n        -- The key is for healthcheck and to allow users to change its values, value type below.\n        -- | prefix    | matched against text body, @see :h vim.startswith() |\n        -- | highlight | highlight for text body                             |\n        custom = {},\n    },\n    indent = {\n        -- Mimic org-indent-mode behavior by indenting everything under a heading based on the\n        -- level of the heading. Indenting starts from level 2 headings onward by default.\n\n        -- Turn on \u002F off org-indent-mode.\n        enabled = false,\n        -- Additional modes to render indents.\n        render_modes = false,\n        -- Amount of additional padding added for each heading level.\n        per_level = 2,\n        -- Heading levels \u003C= this value will not be indented.\n        -- Use 0 to begin indenting from the very first level.\n        skip_level = 1,\n        -- Do not indent heading titles, only the body.\n        skip_heading = false,\n        -- Prefix added when indenting, one per level.\n        icon = '▎',\n        -- Priority to assign to extmarks.\n        priority = 0,\n        -- Applied to icon.\n        highlight = 'RenderMarkdownIndent',\n    },\n    html = {\n        -- Turn on \u002F off all HTML rendering.\n        enabled = true,\n        -- Additional modes to render HTML.\n        render_modes = false,\n        comment = {\n            -- Useful context to have when evaluating values.\n            -- | text | text value of the comment node |\n\n            -- Turn on \u002F off HTML comment concealing.\n            conceal = true,\n            -- Text to inline before the concealed comment.\n            -- Output is evaluated depending on the type.\n            -- | function | `value(context)` |\n            -- | string   | `value`          |\n            -- | nil      | nothing          |\n            text = nil,\n            -- Highlight for the inlined text.\n            highlight = 'RenderMarkdownHtmlComment',\n        },\n        -- HTML tags whose start and end will be hidden and icon shown.\n        -- The key is matched against the tag name, value type below.\n        -- | icon            | optional icon inlined at start of tag           |\n        -- | highlight       | optional highlight for the icon                 |\n        -- | scope_highlight | optional highlight for item associated with tag |\n        tag = {},\n    },\n    win_options = {\n        -- Window options to use that change between rendered and raw view.\n\n        -- @see :h 'conceallevel'\n        conceallevel = {\n            -- Used when not being rendered, get user setting.\n            default = vim.o.conceallevel,\n            -- Used when being rendered, concealed text is completely hidden.\n            rendered = 3,\n        },\n        -- @see :h 'concealcursor'\n        concealcursor = {\n            -- Used when not being rendered, get user setting.\n            default = vim.o.concealcursor,\n            -- Used when being rendered, show concealed text in all modes.\n            rendered = '',\n        },\n    },\n    overrides = {\n        -- More granular configuration mechanism, allows different aspects of buffers to have their own\n        -- behavior. Values default to the top level configuration if no override is provided. Supports\n        -- the following fields:\n        --   enabled, render_modes, debounce, anti_conceal, bullet, callout, checkbox, code, dash,\n        --   document, heading, html, indent, inline_highlight, latex, link, padding, paragraph,\n        --   pipe_table, quote, sign, win_options, yaml\n\n        -- Override for different buflisted values, @see :h 'buflisted'.\n        buflisted = {},\n        -- Override for different buftype values, @see :h 'buftype'.\n        buftype = {\n            nofile = {\n                render_modes = true,\n                padding = { highlight = 'NormalFloat' },\n                sign = { enabled = false },\n            },\n        },\n        -- Override for different filetype values, @see :h 'filetype'.\n        filetype = {},\n        -- Override for preview buffer.\n        preview = {\n            render_modes = true,\n        },\n    },\n    custom_handlers = {\n        -- Mapping from treesitter language to user defined handlers.\n        -- @see [Custom Handlers](doc\u002Fcustom-handlers.md)\n    },\n    yaml = {\n        -- Turn on \u002F off all yaml rendering.\n        enabled = true,\n        -- Additional modes to render yaml.\n        render_modes = false,\n    },\n})\n```\n\n\u003C\u002Fdetails>\n\nWe use the following definitions when discussing indexing into lists:\n\n1. Cycle: Indexed `mod` the length.\n   Example: `{ 1, 2, 3 }` @ 4 = 1.\n2. Clamp: Indexed normally but larger values use the last value in the list.\n   Example: `{ 1, 2, 3 }` @ 4 = 3.\n\n## Headings\n\n[Wiki Page](https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim\u002Fwiki\u002FHeadings)\n\n\u003Cdetails>\n\n\u003Csummary>Heading Configuration\u003C\u002Fsummary>\n\n```lua\nrequire('render-markdown').setup({\n    heading = {\n        -- Useful context to have when evaluating values.\n        -- | level    | the number of '#' in the heading marker         |\n        -- | sections | for each level how deeply nested the heading is |\n\n        -- Turn on \u002F off heading icon & background rendering.\n        enabled = true,\n        -- Additional modes to render headings.\n        render_modes = false,\n        -- Turn on \u002F off atx heading rendering.\n        atx = true,\n        -- Turn on \u002F off setext heading rendering.\n        setext = true,\n        -- Turn on \u002F off sign column related rendering.\n        sign = true,\n        -- Replaces '#+' of 'atx_h._marker'.\n        -- Output is evaluated depending on the type.\n        -- | function | `value(context)`              |\n        -- | string[] | `cycle(value, context.level)` |\n        icons = { '󰲡 ', '󰲣 ', '󰲥 ', '󰲧 ', '󰲩 ', '󰲫 ' },\n        -- Determines how icons fill the available space.\n        -- | eol     | '#'s are concealed and icon is placed at right most column   |\n        -- | right   | '#'s are concealed and icon is appended to right side        |\n        -- | inline  | '#'s are concealed and icon is inlined on left side          |\n        -- | overlay | icon is left padded with spaces and overlayed hiding all '#' |\n        position = 'overlay',\n        -- Added to the sign column if enabled.\n        -- Output is evaluated by `cycle(value, context.level)`.\n        signs = { '󰫎 ' },\n        -- Width of the heading background.\n        -- | block | width of the heading text |\n        -- | full  | full width of the window  |\n        -- Can also be a list of the above values evaluated by `clamp(value, context.level)`.\n        width = 'full',\n        -- Amount of margin to add to the left of headings.\n        -- Margin available space is computed after accounting for padding.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        -- Can also be a list of numbers evaluated by `clamp(value, context.level)`.\n        left_margin = 0,\n        -- Amount of padding to add to the left of headings.\n        -- Output is evaluated using the same logic as 'left_margin'.\n        left_pad = 0,\n        -- Amount of padding to add to the right of headings when width is 'block'.\n        -- Output is evaluated using the same logic as 'left_margin'.\n        right_pad = 0,\n        -- Minimum width to use for headings when width is 'block'.\n        -- Can also be a list of integers evaluated by `clamp(value, context.level)`.\n        min_width = 0,\n        -- Determines if a border is added above and below headings.\n        -- Can also be a list of booleans evaluated by `clamp(value, context.level)`.\n        border = false,\n        -- Always use virtual lines for heading borders instead of attempting to use empty lines.\n        border_virtual = false,\n        -- Highlight the start of the border using the foreground highlight.\n        border_prefix = false,\n        -- Used above heading for border.\n        above = '▄',\n        -- Used below heading for border.\n        below = '▀',\n        -- Highlight for the heading icon and extends through the entire line.\n        -- Output is evaluated by `clamp(value, context.level)`.\n        backgrounds = {\n            'RenderMarkdownH1Bg',\n            'RenderMarkdownH2Bg',\n            'RenderMarkdownH3Bg',\n            'RenderMarkdownH4Bg',\n            'RenderMarkdownH5Bg',\n            'RenderMarkdownH6Bg',\n        },\n        -- Highlight for the heading and sign icons.\n        -- Output is evaluated using the same logic as 'backgrounds'.\n        foregrounds = {\n            'RenderMarkdownH1',\n            'RenderMarkdownH2',\n            'RenderMarkdownH3',\n            'RenderMarkdownH4',\n            'RenderMarkdownH5',\n            'RenderMarkdownH6',\n        },\n        -- Define custom heading patterns which allow you to override various properties based on\n        -- the contents of a heading.\n        -- The key is for healthcheck and to allow users to change its values, value type below.\n        -- | pattern    | matched against the heading text @see :h lua-patterns |\n        -- | icon       | optional override for the icon                        |\n        -- | background | optional override for the background                  |\n        -- | foreground | optional override for the foreground                  |\n        custom = {},\n    },\n})\n```\n\n\u003C\u002Fdetails>\n\n## Paragraphs\n\n[Wiki Page](https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim\u002Fwiki\u002FParagraphs)\n\n\u003Cdetails>\n\n\u003Csummary>Paragraph Configuration\u003C\u002Fsummary>\n\n```lua\nrequire('render-markdown').setup({\n    paragraph = {\n        -- Useful context to have when evaluating values.\n        -- | text | text value of the node |\n\n        -- Turn on \u002F off paragraph rendering.\n        enabled = true,\n        -- Additional modes to render paragraphs.\n        render_modes = false,\n        -- Amount of margin to add to the left of paragraphs.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        -- Output is evaluated depending on the type.\n        -- | function | `value(context)` |\n        -- | number   | `value`          |\n        left_margin = 0,\n        -- Amount of padding to add to the first line of each paragraph.\n        -- Output is evaluated using the same logic as 'left_margin'.\n        indent = 0,\n        -- Minimum width to use for paragraphs.\n        min_width = 0,\n    },\n})\n```\n\n\u003C\u002Fdetails>\n\n## Code Blocks\n\n[Wiki Page](https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim\u002Fwiki\u002FCodeBlocks)\n\n\u003Cdetails>\n\n\u003Csummary>Code Block Configuration\u003C\u002Fsummary>\n\n```lua\nrequire('render-markdown').setup({\n    code = {\n        -- Turn on \u002F off code block & inline code rendering.\n        enabled = true,\n        -- Additional modes to render code blocks.\n        render_modes = false,\n        -- Turn on \u002F off sign column related rendering.\n        sign = true,\n        -- Whether to conceal nodes at the top and bottom of code blocks.\n        conceal_delimiters = true,\n        -- Turn on \u002F off language heading related rendering.\n        language = true,\n        -- Determines where language icon is rendered.\n        -- | center | center of code block |\n        -- | right  | right of code block  |\n        -- | left   | left of code block   |\n        position = 'left',\n        -- Whether to include the language icon above code blocks.\n        language_icon = true,\n        -- Whether to include the language name above code blocks.\n        language_name = true,\n        -- Whether to include the language info above code blocks.\n        language_info = true,\n        -- Amount of padding to add around the language.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        language_pad = 0,\n        -- A list of language names for which rendering will be disabled.\n        disable = {},\n        -- A list of language names for which background highlighting will be disabled.\n        -- Likely because that language has background highlights itself.\n        -- Use a boolean to make behavior apply to all languages.\n        -- Borders above & below blocks will continue to be rendered.\n        disable_background = { 'diff' },\n        -- Number of lines from start\u002Fend to skip rendering background.\n        background_inset = 1,\n        -- Width of the code block background.\n        -- | block | width of the code block  |\n        -- | full  | full width of the window |\n        width = 'full',\n        -- Amount of margin to add to the left of code blocks.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        -- Margin available space is computed after accounting for padding.\n        left_margin = 0,\n        -- Amount of padding to add to the left of code blocks.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        left_pad = 0,\n        -- Amount of padding to add to the right of code blocks when width is 'block'.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        right_pad = 0,\n        -- Minimum width to use for code blocks when width is 'block'.\n        min_width = 0,\n        -- Determines how the top \u002F bottom of code block are rendered.\n        -- | none  | do not render a border                               |\n        -- | thick | use the same highlight as the code body              |\n        -- | thin  | when lines are empty overlay the above & below icons |\n        -- | hide  | conceal lines unless language name or icon is added  |\n        border = 'hide',\n        -- Used above code blocks to fill remaining space around language.\n        language_border = '█',\n        -- Added to the left of language.\n        language_left = '',\n        -- Added to the right of language.\n        language_right = '',\n        -- Used above code blocks for thin border.\n        above = '▄',\n        -- Used below code blocks for thin border.\n        below = '▀',\n        -- Turn on \u002F off inline code related rendering.\n        inline = true,\n        -- Icon to add to the left of inline code.\n        inline_left = '',\n        -- Icon to add to the right of inline code.\n        inline_right = '',\n        -- Padding to add to the left & right of inline code.\n        inline_pad = 0,\n        -- Priority to assign to code background highlight.\n        priority = 140,\n        -- Highlight for code blocks.\n        highlight = 'RenderMarkdownCode',\n        -- Highlight for code info section, after the language.\n        highlight_info = 'RenderMarkdownCodeInfo',\n        -- Highlight for language, overrides icon provider value.\n        highlight_language = nil,\n        -- Highlight for border, use false to add no highlight.\n        highlight_border = 'RenderMarkdownCodeBorder',\n        -- Highlight for language, used if icon provider does not have a value.\n        highlight_fallback = 'RenderMarkdownCodeFallback',\n        -- Highlight for inline code.\n        highlight_inline = 'RenderMarkdownCodeInline',\n        -- Highlight for inline code left icon, default to reverse of highlight_inline.\n        highlight_inline_left = nil,\n        -- Highlight for inline code right icon, default to reverse of highlight_inline.\n        highlight_inline_right = nil,\n        -- Determines how code blocks & inline code are rendered.\n        -- | none     | { enabled = false }                           |\n        -- | normal   | { language = false }                          |\n        -- | language | { disable_background = true, inline = false } |\n        -- | full     | uses all default values                       |\n        style = 'full',\n    },\n})\n```\n\n\u003C\u002Fdetails>\n\n## Dashed Line\n\n[Wiki Page](https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim\u002Fwiki\u002FDashedLine)\n\n\u003Cdetails>\n\n\u003Csummary>Dashed Line Configuration\u003C\u002Fsummary>\n\n```lua\nrequire('render-markdown').setup({\n    dash = {\n        -- Useful context to have when evaluating values.\n        -- | width | width of the current window |\n\n        -- Turn on \u002F off thematic break rendering.\n        enabled = true,\n        -- Additional modes to render dash.\n        render_modes = false,\n        -- Replaces '---'|'***'|'___'|'* * *' of 'thematic_break'.\n        -- The icon gets repeated across the window's width.\n        icon = '─',\n        -- Width of the generated line.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        -- Output is evaluated depending on the type.\n        -- | function | `value(context)`    |\n        -- | number   | `value`             |\n        -- | full     | width of the window |\n        width = 'full',\n        -- Amount of margin to add to the left of dash.\n        -- If a float \u003C 1 is provided it is treated as a percentage of available window space.\n        left_margin = 0,\n        -- Priority to assign to dash.\n        priority = nil,\n        -- Highlight for the whole line generated from the icon.\n        highlight = 'RenderMarkdownDash',\n    },\n})\n```\n\n\u003C\u002Fdetails>\n\n## List Bullets\n\n[Wiki Page](https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim\u002Fwiki\u002FListBullets)\n\n\u003Cdetails>\n\n\u003Csummary>Bullet Point Configuration\u003C\u002Fsummary>\n\n```lua\nrequire('render-markdown').setup({\n    bullet = {\n        -- Useful context to have when evaluating values.\n        -- | level | how deeply nested the list is, 1-indexed          |\n        -- | index | how far down the item is at that level, 1-indexed |\n        -- | value | text value of the marker node                     |\n\n        -- Turn on \u002F off list bullet rendering\n        enabled = true,\n        -- Additional modes to render list bullets\n        render_modes = false,\n        -- Replaces '-'|'+'|'*' of 'list_item'.\n        -- If the item is a 'checkbox' a conceal is used to hide the bullet instead.\n        -- Output is evaluated depending on the type.\n        -- | function   | `value(context)`                                    |\n        -- | string     | `value`                                             |\n        -- | string[]   | `cycle(value, context.level)`                       |\n        -- | string[][] | `clamp(cycle(value, context.level), context.index)` |\n        icons = { '●', '○', '◆', '◇' },\n        -- Replaces 'n.'|'n)' of 'list_item'.\n        -- Output is evaluated using the same logic as 'icons'.\n        ordered_icons = function(ctx)\n            local value = vim.trim(ctx.value)\n            local index = tonumber(value:sub(1, #value - 1))\n            return ('%d.'):format(index > 1 and index or ctx.index)\n        end,\n        -- Padding to add to the left of bullet point.\n        -- Output is evaluated depending on the type.\n        -- | function | `value(context)` |\n        -- | integer  | `value`          |\n        left_pad = 0,\n        -- Padding to add to the right of bullet point.\n        -- Output is evaluated using the same logic as 'left_pad'.\n        right_pad = 0,\n        -- Highlight for the bullet icon.\n        -- Output is evaluated using the same logic as 'icons'.\n        highlight = 'RenderMarkdownBullet',\n        -- Highlight for item associated with the bullet point.\n        -- Output is evaluated using the same logic as 'icons'.\n        scope_highlight = {},\n        -- Priority to assign to scope highlight.\n        scope_priority = nil,\n    },\n})\n```\n\n\u003C\u002Fdetails>\n\n## Checkboxes\n\n[Wiki Page](https:\u002F\u002Fgithub.com\u002FMeanderingProgrammer\u002Frender-markdown.nvim\u002Fwiki\u002FCheckboxes)\n\n\u003Cdetails>\n\n\u003Csummary>Checkbox Configuration\u003C\u002Fsummary>\n\n```lua\nrequire('render-markdown').setup({\n    checkbox = {\n        -- Checkboxes are a special instance of a 'list_item' that start with a 'shortcut_link'.\n        -- There are two special states for unchecked & checked defined in the markdown grammar.\n\n        -- Turn on \u002F off checkbox state rendering.\n        enabled = true,\n        -- Additional modes to render checkboxes.\n        render_modes = false,\n        -- Render the bullet point before the checkbox.\n        bullet = false,\n        -- Padding to add to the left of checkboxes.\n        left_pad = 0,\n        -- Padding to add to the right of checkboxes.\n        right_pad = 1,\n        unchecked = {\n            -- Replaces '[ ]' of 'task_list_marker_unchecked'.\n            icon","render-markdown.nvim 是一个用于改善 Neovim 中 Markdown 文件查看体验的插件。它通过内置的渲染机制，无需外部窗口即可展示格式化的 Markdown 内容，并支持自定义组件、颜色和图标等元素。该插件具备模式切换功能，在编辑与预览之间无缝转换；同时针对大文件优化了性能，仅渲染可见区域。此外，它还提供了丰富的扩展点，允许用户根据需要添加更多自定义渲染逻辑。适用于需要在 Neovim 中高效编写和浏览 Markdown 文档的开发者或写作者。",2,"2026-06-11 03:45:17","high_star"]