mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
feat(lsp): lsp.util.fancy_floating_markdown improvements
fix: fancy_floating_markdown: syn region must include keepend to make sure syntax regions are applied correctly. Fixes #14594 feat: fancy_floating_markdown: handle <pre></pre> code blocks as a markdown code block with plaintext fix: possible nil check for markdown code blocks till end of buffer refactor: only one check is needed to see if stripped[h.finish +1] is valid fix(lsp): dont't set doc ownsyntax, since it breaks contained syntaxes. Set regions for the markdown blocks intsead fix: apply markdown formatting for code blocks without a language fix: use markdownCodeBlock when no language was set in a code block
This commit is contained in:
parent
3bd9cce368
commit
07f54201c7
@ -1086,12 +1086,16 @@ function M.fancy_floating_markdown(contents, opts)
|
|||||||
local ft = line:match("^```([a-zA-Z0-9_]*)$")
|
local ft = line:match("^```([a-zA-Z0-9_]*)$")
|
||||||
-- local ft = line:match("^```(.*)$")
|
-- local ft = line:match("^```(.*)$")
|
||||||
-- TODO(ashkan): validate the filetype here.
|
-- TODO(ashkan): validate the filetype here.
|
||||||
|
local is_pre = line:match("^%s*<pre>%s*$")
|
||||||
|
if is_pre then
|
||||||
|
ft = ""
|
||||||
|
end
|
||||||
if ft then
|
if ft then
|
||||||
local start = #stripped
|
local start = #stripped
|
||||||
i = i + 1
|
i = i + 1
|
||||||
while i <= #contents do
|
while i <= #contents do
|
||||||
line = contents[i]
|
line = contents[i]
|
||||||
if line == "```" then
|
if line == "```" or (is_pre and line:match("^%s*</pre>%s*$")) then
|
||||||
i = i + 1
|
i = i + 1
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
@ -1120,12 +1124,19 @@ function M.fancy_floating_markdown(contents, opts)
|
|||||||
local insert_separator = opts.separator
|
local insert_separator = opts.separator
|
||||||
if insert_separator == nil then insert_separator = true end
|
if insert_separator == nil then insert_separator = true end
|
||||||
if insert_separator then
|
if insert_separator then
|
||||||
for i, h in ipairs(highlights) do
|
local offset = 0
|
||||||
h.start = h.start + i - 1
|
for _, h in ipairs(highlights) do
|
||||||
h.finish = h.finish + i - 1
|
h.start = h.start + offset
|
||||||
|
h.finish = h.finish + offset
|
||||||
|
-- check if a seperator already exists and use that one instead of creating a new one
|
||||||
if h.finish + 1 <= #stripped then
|
if h.finish + 1 <= #stripped then
|
||||||
table.insert(stripped, h.finish + 1, string.rep("─", math.min(width, opts.wrap_at or width)))
|
if stripped[h.finish + 1]:match("^---+$") then
|
||||||
height = height + 1
|
stripped[h.finish + 1] = string.rep("─", math.min(width, opts.wrap_at or width))
|
||||||
|
else
|
||||||
|
table.insert(stripped, h.finish + 1, string.rep("─", math.min(width, opts.wrap_at or width)))
|
||||||
|
offset = offset + 1
|
||||||
|
height = height + 1
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -1143,11 +1154,13 @@ function M.fancy_floating_markdown(contents, opts)
|
|||||||
api.nvim_win_set_option(winnr, 'conceallevel', 2)
|
api.nvim_win_set_option(winnr, 'conceallevel', 2)
|
||||||
api.nvim_win_set_option(winnr, 'concealcursor', 'n')
|
api.nvim_win_set_option(winnr, 'concealcursor', 'n')
|
||||||
|
|
||||||
vim.cmd("ownsyntax lsp_markdown")
|
|
||||||
local idx = 1
|
local idx = 1
|
||||||
--@private
|
--@private
|
||||||
local function apply_syntax_to_region(ft, start, finish)
|
local function apply_syntax_to_region(ft, start, finish)
|
||||||
if ft == '' then return end
|
if ft == "" then
|
||||||
|
vim.cmd(string.format("syntax region markdownCodeBlock start=+\\%%%dl+ end=+\\%%%dl+ keepend extend", start, finish + 1))
|
||||||
|
return
|
||||||
|
end
|
||||||
local name = ft..idx
|
local name = ft..idx
|
||||||
idx = idx + 1
|
idx = idx + 1
|
||||||
local lang = "@"..ft:upper()
|
local lang = "@"..ft:upper()
|
||||||
@ -1155,16 +1168,20 @@ function M.fancy_floating_markdown(contents, opts)
|
|||||||
if not pcall(vim.cmd, string.format("syntax include %s syntax/%s.vim", lang, ft)) then
|
if not pcall(vim.cmd, string.format("syntax include %s syntax/%s.vim", lang, ft)) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
vim.cmd(string.format("syntax region %s start=+\\%%%dl+ end=+\\%%%dl+ contains=%s", name, start, finish + 1, lang))
|
vim.cmd(string.format("syntax region %s start=+\\%%%dl+ end=+\\%%%dl+ contains=%s keepend", name, start, finish + 1, lang))
|
||||||
end
|
end
|
||||||
-- Previous highlight region.
|
-- Previous highlight region.
|
||||||
-- TODO(ashkan): this wasn't working for some reason, but I would like to
|
local ph = 1
|
||||||
-- make sure that regions between code blocks are definitely markdown.
|
|
||||||
-- local ph = {start = 0; finish = 1;}
|
|
||||||
for _, h in ipairs(highlights) do
|
for _, h in ipairs(highlights) do
|
||||||
-- apply_syntax_to_region('markdown', ph.finish, h.start)
|
if ph <= h.start - 1 then
|
||||||
|
apply_syntax_to_region('lsp_markdown', ph, h.start - 1)
|
||||||
|
end
|
||||||
apply_syntax_to_region(h.ft, h.start, h.finish)
|
apply_syntax_to_region(h.ft, h.start, h.finish)
|
||||||
-- ph = h
|
ph = h.finish + 1
|
||||||
|
end
|
||||||
|
|
||||||
|
if ph <= #stripped then
|
||||||
|
apply_syntax_to_region('lsp_markdown', ph, #stripped)
|
||||||
end
|
end
|
||||||
|
|
||||||
vim.api.nvim_set_current_win(cwin)
|
vim.api.nvim_set_current_win(cwin)
|
||||||
|
Loading…
Reference in New Issue
Block a user