Skip to content
This repository was archived by the owner on Jul 7, 2022. It is now read-only.

Commit 27761bf

Browse files
ebobrowJafarAbdi
authored andcommitted
allow multiple hints per line
1 parent 4011f4a commit 27761bf

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ autocmd CursorHold,CursorHoldI *.rs :lua require'lsp_extensions'.inlay_hints{ on
5353
```
5454

5555
By default only ChainingHint is enabled. This is due to Neovim not able to add virtual text injected into a line. To enable all hints:
56-
**Note:** Hints will overwrite if other hints using this. Only the last hint will be shown.
56+
**Note:** Not all hints will be displayed if this is set. For easier readability, only hints of one type are shown per line.
5757

5858
```vimscript
5959
:lua require('lsp_extensions').inlay_hints{ enabled = {"TypeHint", "ChainingHint", "ParameterHint"} }

lua/lsp_extensions/inlay_hints.lua

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ interface InlayHint {
2525
label: string,
2626
}
2727
```
28-
--]]
28+
--]]
2929

3030
local util = require('lsp_extensions.util')
3131

@@ -83,8 +83,12 @@ inlay_hints.get_callback = function(opts)
8383

8484
for _, hint in ipairs(result) do
8585
local finish = hint.range["end"].line
86-
if not hint_store[finish] and in_list(enabled)(hint.kind) then
87-
hint_store[finish] = hint
86+
if in_list(enabled)(hint.kind) then
87+
if not hint_store[finish] then
88+
hint_store[finish] = {hint}
89+
elseif hint_store[finish][1].kind == hint.kind then
90+
table.insert(hint_store[finish], hint)
91+
end
8892

8993
if aligned then
9094
longest_line = math.max(longest_line,
@@ -93,8 +97,8 @@ inlay_hints.get_callback = function(opts)
9397
end
9498
end
9599

96-
local display_virt_text = function(hint)
97-
local end_line = hint.range["end"].line
100+
local display_virt_text = function(hints)
101+
local end_line = hints[1].range["end"].line
98102

99103
-- Check for any existing / more important virtual text on the line.
100104
-- TODO: Figure out how stackable virtual text works? What happens if there is more than one??
@@ -103,25 +107,27 @@ inlay_hints.get_callback = function(opts)
103107
if not vim.tbl_isempty(existing_virt_text) then return end
104108

105109
local text
106-
if aligned then
107-
local line_length = #vim.api.nvim_buf_get_lines(ctx.bufnr, end_line, end_line + 1, false)[1]
108-
text = string.format("%s %s", (" "):rep(longest_line - line_length), prefix .. hint.label)
109-
else
110-
text = prefix .. hint.label
110+
for _, hint in ipairs(hints) do
111+
if aligned then
112+
local line_length = #vim.api.nvim_buf_get_lines(bufnr, end_line, end_line + 1, false)[1]
113+
text = string.format("%s %s", (" "):rep(longest_line - line_length), prefix .. hint.label)
114+
else
115+
text = (text or "") .. prefix .. hint.label
116+
end
111117
end
112118
vim.api.nvim_buf_set_virtual_text(ctx.bufnr, inlay_hints_ns, end_line, {{text, highlight}}, {})
113119
end
114120

115121
if only_current_line then
116-
local hint = hint_store[vim.api.nvim_win_get_cursor(0)[1] - 1]
122+
local hints = hint_store[vim.api.nvim_win_get_cursor(0)[1] - 1]
117123

118-
if not hint then
124+
if not hints then
119125
return
120126
else
121-
display_virt_text(hint)
127+
display_virt_text(hints)
122128
end
123129
else
124-
for _, hint in pairs(hint_store) do display_virt_text(hint) end
130+
for _, hints in pairs(hint_store) do display_virt_text(hints) end
125131
end
126132
end)
127133
end

0 commit comments

Comments
 (0)