return { "MeanderingProgrammer/render-markdown.nvim", dependencies = { "nvim-treesitter/nvim-treesitter", "nvim-tree/nvim-web-devicons", }, ---@module 'render-markdown' ---@type render.md.UserConfig opts = { enabled = true, max_file_size = 10.0, -- Max filesize to be rendered (in MB) debounce = 100, preset = "none", -- 'obsidian', 'lazy', or 'none' log_level = "error", log_runtime = false, file_types = { "markdown" }, injections = { gitcommit = { enabled = true, query = [[ ((message) @injection.content (#set! injection.combined) (#set! injection.include-children) (#set! injection.language "markdown")) ]], }, }, render_modes = { "n", "c" }, anti_conceal = { enabled = true, -- This enables hiding any added text on the line the cursor is on ignore = { code_background = true, sign = true, }, above = 0, -- Number of lines above cursor to show below = 0, -- Number of lines below cursor to show }, padding = { highlight = "Normal", }, latex = { enabled = true, converter = "latex2text", highlight = "RenderMarkdownMath", top_pad = 0, bottom_pad = 0, }, on = { attach = function() end, }, heading = { enabled = true, sign = true, position = "inline", -- 'inline' or 'overlay' icons = { "󰲡 ", "󰲣 ", "󰲥 ", "󰲧 ", "󰲩 ", "󰲫 " }, signs = { "󰫎 " }, width = "block", -- 'full' or 'block' --left_margin = 5.0, left_pad = 3.0, right_pad = 3.0, min_width = 0, border = false, border_virtual = false, -- Highlight the start of the border using the foreground highlight border_prefix = false, -- Used above heading for border above = "▄", -- Used below heading for border below = "▀", -- The 'level' is used to index into the list using a clamp -- Highlight for the heading icon and extends through the entire line backgrounds = { "RenderMarkdownH1bg", "RenderMarkdownH2Bg", "RenderMarkdownH3Bg", "RenderMarkdownH4Bg", "RenderMarkdownH5Bg", "RenderMarkdownH6Bg", }, -- The 'level' is used to index into the list using a clamp -- Highlight for the heading and sign icons foregrounds = { "RenderMarkdownH1", "RenderMarkdownH2", "RenderMarkdownH3", "RenderMarkdownH4", "RenderMarkdownH5", "RenderMarkdownH6", }, }, paragraph = { -- Turn on / off paragraph rendering enabled = true, -- Amount of margin to add to the left of paragraphs -- If a floating point value < 1 is provided it is treated as a percentage of the available window space left_margin = 0, -- Minimum width to use for paragraphs min_width = 0, }, code = { -- Turn on / off code block & inline code rendering enabled = true, -- Turn on / off any sign column related rendering sign = true, -- Determines how code blocks & inline code are rendered: -- none: disables all rendering -- normal: adds highlight group to code blocks & inline code, adds padding to code blocks -- language: adds language icon to sign column if enabled and icon + name above code blocks -- full: normal + language style = "full", -- Determines where language icon is rendered: -- right: right side of code block -- left: left side of code block position = "left", -- Amount of padding to add around the language -- If a floating point value < 1 is provided it is treated as a percentage of the available window space language_pad = 0, -- Whether to include the language name next to the icon language_name = true, -- A list of language names for which background highlighting will be disabled -- Likely because that language has background highlights itself disable_background = { "diff" }, -- Width of the code block background: -- block: width of the code block -- full: full width of the window width = "full", -- Amount of margin to add to the left of code blocks -- If a floating point value < 1 is provided it is treated as a percentage of the available window space -- Margin available space is computed after accounting for padding left_margin = 0, -- Amount of padding to add to the left of code blocks -- If a floating point value < 1 is provided it is treated as a percentage of the available window space left_pad = 0, -- Amount of padding to add to the right of code blocks when width is 'block' -- If a floating point value < 1 is provided it is treated as a percentage of the available window space right_pad = 0, -- Minimum width to use for code blocks when width is 'block' min_width = 0, -- Determines how the top / bottom of code block are rendered: -- thick: use the same highlight as the code body -- thin: when lines are empty overlay the above & below icons border = "thin", -- Used above code blocks for thin border above = "▄", -- Used below code blocks for thin border below = "▀", -- Highlight for code blocks highlight = "RenderMarkdownCode", -- Highlight for inline code highlight_inline = "RenderMarkdownCodeInline", -- Highlight for language, overrides icon provider value highlight_language = nil, }, dash = { -- Turn on / off thematic break rendering enabled = true, -- Replaces '---'|'***'|'___'|'* * *' of 'thematic_break' -- The icon gets repeated across the window's width icon = "─", -- Width of the generated line: -- : a hard coded width value -- full: full width of the window width = "full", -- Highlight for the whole line generated from the icon highlight = "RenderMarkdownDash", }, bullet = { -- Turn on / off list bullet rendering enabled = true, -- Replaces '-'|'+'|'*' of 'list_item' -- How deeply nested the list is determines the 'level' which is used to index into the list using a cycle -- The item number in the list is used to index into the value using a clamp if the value is also a list -- If the item is a 'checkbox' a conceal is used to hide the bullet instead icons = { "●", "○", "◆", "◇" }, -- Replaces 'n.'|'n)' of 'list_item' -- How deeply nested the list is determines the 'level' which is used to index into the list using a cycle -- The item number in the list is used to index into the value using a clamp if the value is also a list ordered_icons = {}, -- Padding to add to the left of bullet point left_pad = 0, -- Padding to add to the right of bullet point right_pad = 0, -- Highlight for the bullet icon highlight = "RenderMarkdownBullet", }, -- Checkboxes are a special instance of a 'list_item' that start with a 'shortcut_link' -- There are two special states for unchecked & checked defined in the markdown grammar checkbox = { -- Turn on / off checkbox state rendering enabled = true, -- Determines how icons fill the available space: -- inline: underlying text is concealed resulting in a left aligned icon -- overlay: result is left padded with spaces to hide any additional text position = "inline", unchecked = { -- Replaces '[ ]' of 'task_list_marker_unchecked' icon = "󰄱 ", -- Highlight for the unchecked icon highlight = "RenderMarkdownUnchecked", -- Highlight for item associated with unchecked checkbox scope_highlight = nil, }, checked = { -- Replaces '[x]' of 'task_list_marker_checked' icon = "󰱒 ", -- Highlight for the checked icon highlight = "RenderMarkdownChecked", -- Highlight for item associated with checked checkbox scope_highlight = nil, }, -- Define custom checkbox states, more involved as they are not part of the markdown grammar -- As a result this requires neovim >= 0.10.0 since it relies on 'inline' extmarks -- Can specify as many additional states as you like following the 'todo' pattern below -- The key in this case 'todo' is for healthcheck and to allow users to change its values -- 'raw': Matched against the raw text of a 'shortcut_link' -- 'rendered': Replaces the 'raw' value when rendering -- 'highlight': Highlight for the 'rendered' icon -- 'scope_highlight': Highlight for item associated with custom checkbox custom = { todo = { raw = "[-]", rendered = "󰥔 ", highlight = "RenderMarkdownTodo", scope_highlight = nil }, }, }, quote = { -- Turn on / off block quote & callout rendering enabled = true, -- Replaces '>' of 'block_quote' icon = "▋", -- Whether to repeat icon on wrapped lines. Requires neovim >= 0.10. This will obscure text if -- not configured correctly with :h 'showbreak', :h 'breakindent' and :h 'breakindentopt'. A -- combination of these that is likely to work is showbreak = ' ' (2 spaces), breakindent = true, -- breakindentopt = '' (empty string). These values are not validated by this plugin. If you want -- to avoid adding these to your main configuration then set them in win_options for this plugin. repeat_linebreak = false, -- Highlight for the quote icon highlight = "RenderMarkdownQuote", }, pipe_table = { -- Turn on / off pipe table rendering enabled = true, -- Pre configured settings largely for setting table border easier -- heavy: use thicker border characters -- double: use double line border characters -- round: use round border corners -- none: does nothing preset = "none", -- Determines how the table as a whole is rendered: -- none: disables all rendering -- normal: applies the 'cell' style rendering to each row of the table -- full: normal + a top & bottom line that fill out the table when lengths match style = "full", -- Determines how individual cells of a table are rendered: -- overlay: writes completely over the table, removing conceal behavior and highlights -- raw: replaces only the '|' characters in each row, leaving the cells unmodified -- padded: raw + cells are padded to maximum visual width for each column -- trimmed: padded except empty space is subtracted from visual width calculation cell = "padded", -- Amount of space to put between cell contents and border padding = 1, -- Minimum column width to use for padded or trimmed cell min_width = 0, -- Characters used to replace table border -- Correspond to top(3), delimiter(3), bottom(3), vertical, & horizontal -- stylua: ignore border = { '┌', '┬', '┐', '├', '┼', '┤', '└', '┴', '┘', '│', '─', }, -- Gets placed in delimiter row for each column, position is based on alignment alignment_indicator = "━", -- Highlight for table heading, delimiter, and the line above head = "RenderMarkdownTableHead", -- Highlight for everything else, main table rows and the line below row = "RenderMarkdownTableRow", -- Highlight for inline padding used to add back concealed space filler = "RenderMarkdownTableFill", }, -- Callouts are a special instance of a 'block_quote' that start with a 'shortcut_link' -- Can specify as many additional values as you like following the pattern from any below, such as 'note' -- The key in this case 'note' is for healthcheck and to allow users to change its values -- 'raw': Matched against the raw text of a 'shortcut_link', case insensitive -- 'rendered': Replaces the 'raw' value when rendering -- 'highlight': Highlight for the 'rendered' text and quote markers -- 'quote_icon': Optional override for quote.icon value for individual callout callout = { note = { raw = "[!NOTE]", rendered = "󰋽 Note", highlight = "RenderMarkdownInfo" }, tip = { raw = "[!TIP]", rendered = "󰌶 Tip", highlight = "RenderMarkdownSuccess" }, important = { raw = "[!IMPORTANT]", rendered = "󰅾 Important", highlight = "RenderMarkdownHint" }, warning = { raw = "[!WARNING]", rendered = "󰀪 Warning", highlight = "RenderMarkdownWarn" }, caution = { raw = "[!CAUTION]", rendered = "󰳦 Caution", highlight = "RenderMarkdownError" }, -- Obsidian: https://help.obsidian.md/Editing+and+formatting/Callouts abstract = { raw = "[!ABSTRACT]", rendered = "󰨸 Abstract", highlight = "RenderMarkdownInfo" }, summary = { raw = "[!SUMMARY]", rendered = "󰨸 Summary", highlight = "RenderMarkdownInfo" }, tldr = { raw = "[!TLDR]", rendered = "󰨸 Tldr", highlight = "RenderMarkdownInfo" }, info = { raw = "[!INFO]", rendered = "󰋽 Info", highlight = "RenderMarkdownInfo" }, todo = { raw = "[!TODO]", rendered = "󰗡 Todo", highlight = "RenderMarkdownInfo" }, hint = { raw = "[!HINT]", rendered = "󰌶 Hint", highlight = "RenderMarkdownSuccess" }, success = { raw = "[!SUCCESS]", rendered = "󰄬 Success", highlight = "RenderMarkdownSuccess" }, check = { raw = "[!CHECK]", rendered = "󰄬 Check", highlight = "RenderMarkdownSuccess" }, done = { raw = "[!DONE]", rendered = "󰄬 Done", highlight = "RenderMarkdownSuccess" }, question = { raw = "[!QUESTION]", rendered = "󰘥 Question", highlight = "RenderMarkdownWarn" }, help = { raw = "[!HELP]", rendered = "󰘥 Help", highlight = "RenderMarkdownWarn" }, faq = { raw = "[!FAQ]", rendered = "󰘥 Faq", highlight = "RenderMarkdownWarn" }, attention = { raw = "[!ATTENTION]", rendered = "󰀪 Attention", highlight = "RenderMarkdownWarn" }, failure = { raw = "[!FAILURE]", rendered = "󰅖 Failure", highlight = "RenderMarkdownError" }, fail = { raw = "[!FAIL]", rendered = "󰅖 Fail", highlight = "RenderMarkdownError" }, missing = { raw = "[!MISSING]", rendered = "󰅖 Missing", highlight = "RenderMarkdownError" }, danger = { raw = "[!DANGER]", rendered = "󱐌 Danger", highlight = "RenderMarkdownError" }, error = { raw = "[!ERROR]", rendered = "󱐌 Error", highlight = "RenderMarkdownError" }, bug = { raw = "[!BUG]", rendered = "󰨰 Bug", highlight = "RenderMarkdownError" }, example = { raw = "[!EXAMPLE]", rendered = "󰉹 Example", highlight = "RenderMarkdownHint" }, quote = { raw = "[!QUOTE]", rendered = "󱆨 Quote", highlight = "RenderMarkdownQuote" }, cite = { raw = "[!CITE]", rendered = "󱆨 Cite", highlight = "RenderMarkdownQuote" }, }, link = { -- Turn on / off inline link icon rendering enabled = true, -- Inlined with 'image' elements image = "󰥶 ", -- Inlined with 'email_autolink' elements email = "󰀓 ", -- Fallback icon for 'inline_link' elements hyperlink = "󰌹 ", -- Applies to the fallback inlined icon highlight = "RenderMarkdownLink", -- Applies to WikiLink elements wiki = { icon = "󱗖 ", highlight = "RenderMarkdownWikiLink" }, -- Define custom destination patterns so icons can quickly inform you of what a link -- contains. Applies to 'inline_link' and wikilink nodes. -- Can specify as many additional values as you like following the 'web' pattern below -- The key in this case 'web' is for healthcheck and to allow users to change its values -- 'pattern': Matched against the destination text see :h lua-pattern -- 'icon': Gets inlined before the link text -- 'highlight': Highlight for the 'icon' custom = { web = { pattern = "^http[s]?://", icon = "󰖟 ", highlight = "RenderMarkdownLink" }, }, }, sign = { -- Turn on / off sign rendering enabled = true, -- Applies to background of sign text highlight = "RenderMarkdownSign", }, -- Mimic org-indent-mode behavior by indenting everything under a heading based on the -- level of the heading. Indenting starts from level 2 headings onward. indent = { -- Turn on / off org-indent-mode enabled = false, -- Amount of additional padding added for each heading level per_level = 2, -- Heading levels <= this value will not be indented -- Use 0 to begin indenting from the very first level skip_level = 1, -- Do not indent heading titles, only the body skip_heading = false, }, -- Window options to use that change between rendered and raw view win_options = { -- See :h 'conceallevel' conceallevel = { -- Used when not being rendered, get user setting default = vim.api.nvim_get_option_value("conceallevel", {}), -- Used when being rendered, concealed text is completely hidden rendered = 3, }, -- See :h 'concealcursor' concealcursor = { -- Used when not being rendered, get user setting default = vim.api.nvim_get_option_value("concealcursor", {}), -- Used when being rendered, disable concealing text in all modes rendered = "", }, }, -- More granular configuration mechanism, allows different aspects of buffers -- to have their own behavior. Values default to the top level configuration -- if no override is provided. Supports the following fields: -- enabled, max_file_size, debounce, render_modes, anti_conceal, padding, -- heading, paragraph, code, dash, bullet, checkbox, quote, pipe_table, -- callout, link, sign, indent, win_options overrides = { -- Overrides for different buftypes, see :h 'buftype' buftype = { nofile = { padding = { highlight = "NormalFloat" }, sign = { enabled = false }, }, }, -- Overrides for different filetypes, see :h 'filetype' filetype = {}, }, -- Mapping from treesitter language to user defined handlers -- See 'Custom Handlers' document for more info custom_handlers = {}, }, }