Skip to content

Commit 30d3104

Browse files
committed
fix(renderer_vimdoc): Fixed compatibility issue with help tips on nightly
Closes #25 fix(parser_vimdoc): Fixed a bug with how bottom borders position is calculated
1 parent 2a77c8f commit 30d3104

3 files changed

Lines changed: 61 additions & 4 deletions

File tree

lua/helpview/parsers/vimdoc.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ vimdoc.code_block = function (buffer, TSNode, text, range)
8484
if range.row_end + 1 > vim.api.nvim_buf_line_count(buffer) - 1 then
8585
return use_virt, false;
8686
elseif range.col_start == 0 then
87-
local bottom = vim.api.nvim_buf_get_lines(buffer, range.row_start - 1, range.row_start, false)[1];
87+
local bottom = vim.api.nvim_buf_get_lines(buffer, range.row_end, range.row_end + 1, false)[1];
88+
8889
return use_virt, bottom:match("^%s*$") == nil;
8990
else
9091
return use_virt, after:match("^%s*$") == nil;

lua/helpview/renderer.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ renderer.get_range = function (content)
384384

385385
local from, to = nil, nil;
386386

387-
for lang, lang_items in pairs(content) do
387+
for _, lang_items in pairs(content) do
388388
for _, item in ipairs(lang_items) do
389389
local range = item.range;
390390

lua/helpview/renderers/vimdoc.lua

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,19 @@ vimdoc.code_block = function (buffer, item)
163163
local decorations = filetypes.get(item.language);
164164
local label = { string.format(" %s%s ", decorations.icon, decorations.name), utils.set_hl(config.label_hl or decorations.icon_hl) };
165165

166+
local function show_tooltip ()
167+
if vim.fn.has("nvim-0.11.0") == 0 then
168+
-- Only do this on nightly versions
169+
return false;
170+
else
171+
local ft = vim.filetype.match({
172+
filename = string.format("example.%s", item.language)
173+
});
174+
175+
return vim.list_contains({ "vim", "lua" }, ft);
176+
end
177+
end
178+
166179
if item.top_border[1] == true then
167180
--- Virtual line
168181
vim.api.nvim_buf_set_extmark(buffer, vimdoc.ns, range.row_start, range.col_start, {
@@ -176,11 +189,13 @@ vimdoc.code_block = function (buffer, item)
176189
},
177190
{
178191
label,
192+
show_tooltip() == true and { "• Run with 󰌏 g==", "HelpviewCodeInfo" } or { "" },
179193
{ string.rep(" ", vim.o.columns), utils.set_hl(config.border_hl) }
180-
}
194+
},
181195
} or {
182196
{
183197
label,
198+
show_tooltip() == true and { "• Run with 󰌏 g==", "HelpviewCodeInfo" } or { "" },
184199
{ string.rep(" ", vim.o.columns), utils.set_hl(config.border_hl) }
185200
}
186201
}
@@ -199,7 +214,10 @@ vimdoc.code_block = function (buffer, item)
199214
} or nil,
200215

201216
virt_text_pos = "overlay",
202-
virt_text = { label },
217+
virt_text = {
218+
label,
219+
show_tooltip() == true and { "• Run with 󰌏 g==", "HelpviewCodeInfo" } or { "" },
220+
},
203221
line_hl_group = utils.set_hl(config.border_hl)
204222
});
205223
end
@@ -1048,6 +1066,9 @@ end
10481066
vimdoc.render = function (buffer, content)
10491067
---+
10501068

1069+
--- Clear the message namespace.
1070+
vimdoc.__message_clear(buffer, content)
1071+
10511072
--- Custom renderers.
10521073
---@type { [string]: fun(buffer: integer, item: table): nil }
10531074
local custom_renderers = spec.get({ "renderers" }, { fallback = {} });
@@ -1073,6 +1094,41 @@ vimdoc.render = function (buffer, content)
10731094
---_
10741095
end
10751096

1097+
--- Clears help message namespace.
1098+
---@param buffer integer
1099+
---@param content table[]
1100+
vimdoc.__message_clear = function (buffer, content)
1101+
---+
1102+
1103+
--- Map of namespace IDs.
1104+
---@type { [string]: integer }
1105+
local namespaces = vim.api.nvim_get_namespaces();
1106+
1107+
if not namespaces["nvim.vimdoc.run_message"] then
1108+
--- Message namespace doesn't exist.
1109+
--- Abort.
1110+
return;
1111+
elseif not package.loaded["helpview.renderer"] or not package.loaded["helpview.renderer"].get_range then
1112+
--- In case the renderer module isn't available
1113+
--- just clear everything.
1114+
vim.api.nvim_buf_clear_namespace(buffer, namespaces["nvim.vimdoc.run_message"], 0, -1);
1115+
else
1116+
--- Line range to clear.
1117+
---@type integer, integer
1118+
local from, to = package.loaded["helpview.renderer"].get_range({
1119+
vimdoc = content
1120+
});
1121+
1122+
vim.api.nvim_buf_clear_namespace(buffer, namespaces["nvim.vimdoc.run_message"], from, to);
1123+
end
1124+
1125+
---_
1126+
end
1127+
1128+
--- Clears preview decorations.
1129+
---@param buffer integer
1130+
---@param from integer | nil
1131+
---@param to integer | nil
10761132
vimdoc.clear = function (buffer, from, to)
10771133
vim.api.nvim_buf_clear_namespace(buffer, vimdoc.ns, from or 0, to or -1);
10781134
end

0 commit comments

Comments
 (0)