@@ -23,6 +23,53 @@ function M.clear_suggestion(bufnr, ns_id)
23
23
vim .b [bufnr ].nes_state = nil
24
24
end
25
25
26
+ --- @private
27
+ --- @param suggestion copilotlsp.InlineEdit
28
+ --- @return nes.LineCalculationResult
29
+ function M ._calculate_lines (suggestion )
30
+ local deleted_lines_count = suggestion .range [" end" ].line - suggestion .range .start .line
31
+ local added_lines = vim .split (suggestion .newText , " \n " )
32
+ local added_lines_count = suggestion .newText == " " and 0 or # added_lines
33
+ local same_line = 0
34
+
35
+ if deleted_lines_count == 0 and added_lines_count == 1 then
36
+ --- changing within line
37
+ deleted_lines_count = 1
38
+ same_line = 1
39
+ end
40
+
41
+ -- Calculate positions for delete highlight extmark
42
+ --- @type nes.DeleteExtmark
43
+ local delete_extmark = {
44
+ row = suggestion .range .start .line ,
45
+ end_row = suggestion .range [" end" ].line + 1 ,
46
+ }
47
+
48
+ -- Calculate positions for virtual lines extmark
49
+ --- @type nes.VirtLinesExtmark
50
+ local virt_lines_extmark = {
51
+ row = suggestion .range [" end" ].line ,
52
+ virt_lines_count = added_lines_count ,
53
+ }
54
+
55
+ -- Calculate positions for floating window
56
+ --- @type nes.FloatWin
57
+ local float_win = {
58
+ height = # added_lines ,
59
+ row = suggestion .range [" end" ].line + deleted_lines_count + 1 ,
60
+ }
61
+
62
+ return {
63
+ deleted_lines_count = deleted_lines_count ,
64
+ added_lines = added_lines ,
65
+ added_lines_count = added_lines_count ,
66
+ same_line = same_line ,
67
+ delete_extmark = delete_extmark ,
68
+ virt_lines_extmark = virt_lines_extmark ,
69
+ float_win = float_win ,
70
+ }
71
+ end
72
+
26
73
--- @private
27
74
--- @param edits copilotlsp.InlineEdit[]
28
75
--- @param ns_id integer
@@ -36,38 +83,29 @@ function M._display_next_suggestion(edits, ns_id)
36
83
local suggestion = edits [1 ]
37
84
38
85
local ui = {}
39
- local deleted_lines_count = suggestion .range [" end" ].line - suggestion .range .start .line
40
- local added_lines = vim .split (suggestion .newText , " \n " )
41
- local added_lines_count = suggestion .newText == " " and 0 or # added_lines
42
- local same_line = 0
43
-
44
- if deleted_lines_count == 0 and added_lines_count == 1 then
45
- --- changing within line
46
- deleted_lines_count = 1
47
- same_line = 1
48
- end
86
+ local lines = M ._calculate_lines (suggestion )
49
87
50
- if deleted_lines_count > 0 then
88
+ if lines . deleted_lines_count > 0 then
51
89
-- Deleted range red highlight
52
- vim .api .nvim_buf_set_extmark (bufnr , ns_id , suggestion . range . start . line , 0 , {
90
+ vim .api .nvim_buf_set_extmark (bufnr , ns_id , lines . delete_extmark . row , 0 , {
53
91
hl_group = " NesDelete" ,
54
- end_row = suggestion . range [ " end " ]. line + 1 ,
92
+ end_row = lines . delete_extmark . end_row ,
55
93
})
56
94
end
57
- if added_lines_count > 0 then
95
+ if lines . added_lines_count > 0 then
58
96
-- Create space for float
59
97
local virt_lines = {}
60
- for _ = 1 , added_lines_count do
98
+ for _ = 1 , lines . virt_lines_extmark . virt_lines_count do
61
99
table.insert (virt_lines , {
62
100
{ " " , " Normal" },
63
101
})
64
102
end
65
- vim .api .nvim_buf_set_extmark (bufnr , ns_id , suggestion . range [ " end " ]. line , 0 , {
103
+ vim .api .nvim_buf_set_extmark (bufnr , ns_id , lines . virt_lines_extmark . row , 0 , {
66
104
virt_lines = virt_lines ,
67
105
})
68
106
69
107
local preview_bufnr = vim .api .nvim_create_buf (false , true )
70
- vim .api .nvim_buf_set_lines (preview_bufnr , 0 , - 1 , false , added_lines )
108
+ vim .api .nvim_buf_set_lines (preview_bufnr , 0 , - 1 , false , lines . added_lines )
71
109
vim .bo [preview_bufnr ].modifiable = false
72
110
vim .bo [preview_bufnr ].buflisted = false
73
111
vim .bo [preview_bufnr ].bufhidden = " wipe"
@@ -79,8 +117,8 @@ function M._display_next_suggestion(edits, ns_id)
79
117
local preview_winnr = vim .api .nvim_open_win (preview_bufnr , false , {
80
118
relative = " cursor" ,
81
119
width = win_width - offset ,
82
- height = # added_lines ,
83
- row = ( suggestion . range [ " end " ]. line + deleted_lines_count + 1 ) - cursor [1 ],
120
+ height = lines . float_win . height ,
121
+ row = lines . float_win . row - cursor [1 ],
84
122
col = 0 ,
85
123
style = " minimal" ,
86
124
border = " none" ,
0 commit comments