Skip to content

Commit f30ec6b

Browse files
committed
feat(ui): inline edit
1 parent 3510b84 commit f30ec6b

File tree

3 files changed

+56
-20
lines changed

3 files changed

+56
-20
lines changed

lua/copilot-lsp/nes/ui.lua

Lines changed: 51 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ function M._calculate_lines(suggestion)
3636
local deleted_lines_count = suggestion.range["end"].line - suggestion.range.start.line
3737
local added_lines = vim.split(trim_end(suggestion.newText), "\n")
3838
local added_lines_count = suggestion.newText == "" and 0 or #added_lines
39-
local same_line = 0
39+
local same_line = false
4040

4141
if deleted_lines_count == 0 and added_lines_count == 1 then
4242
---changing within line
4343
deleted_lines_count = 1
44-
same_line = 1
44+
same_line = true
4545
end
4646

4747
-- if
@@ -87,7 +87,8 @@ end
8787
---@param edits copilotlsp.InlineEdit[]
8888
---@param ns_id integer
8989
function M._display_next_suggestion(edits, ns_id)
90-
local state = vim.b[vim.api.nvim_get_current_buf()].nes_state
90+
local bufnr = vim.api.nvim_get_current_buf()
91+
local state = vim.b[bufnr].nes_state
9192
if state then
9293
M.clear_suggestion(vim.api.nvim_get_current_buf(), ns_id)
9394
end
@@ -101,20 +102,55 @@ function M._display_next_suggestion(edits, ns_id)
101102

102103
local lines = M._calculate_lines(suggestion)
103104

104-
if lines.deleted_lines_count > 0 then
105-
-- Deleted range red highlight
106-
vim.api.nvim_buf_set_extmark(bufnr, ns_id, lines.delete_extmark.row, 0, {
107-
hl_group = "CopilotLspNesDelete",
108-
end_row = lines.delete_extmark.end_row,
109-
})
105+
local line_replacement = false
106+
if lines.same_line then
107+
local row = suggestion.range.start.line
108+
local start_col = suggestion.range.start.character
109+
local end_col = suggestion.range["end"].character
110+
111+
local line_text = vim.api.nvim_buf_get_lines(bufnr, row, row + 1, false)[1]
112+
if start_col == 0 and end_col == #line_text then
113+
line_replacement = true
114+
end
110115
end
111-
if lines.added_lines_count > 0 then
112-
local text = trim_end(edits[1].text)
113-
local virt_lines = require("copilot-lsp.util").hl_text_to_virt_lines(text, vim.bo[bufnr].filetype)
114116

115-
vim.api.nvim_buf_set_extmark(bufnr, ns_id, lines.virt_lines_extmark.row, 0, {
116-
virt_lines = virt_lines,
117-
})
117+
if lines.same_line and not line_replacement then
118+
local row = suggestion.range.start.line
119+
local start_col = suggestion.range.start.character
120+
local end_col = suggestion.range["end"].character
121+
122+
-- inline edit
123+
if start_col < end_col then
124+
vim.api.nvim_buf_set_extmark(bufnr, ns_id, row, start_col, {
125+
hl_group = "CopilotLspNesDelete",
126+
end_col = end_col,
127+
})
128+
end
129+
if suggestion.text ~= "" then
130+
local virt_lines =
131+
require("copilot-lsp.util").hl_text_to_virt_lines(suggestion.text, vim.bo[bufnr].filetype)
132+
local virt_text = virt_lines[1]
133+
vim.api.nvim_buf_set_extmark(bufnr, ns_id, row, end_col, {
134+
virt_text = virt_text,
135+
virt_text_pos = "inline",
136+
})
137+
end
138+
else
139+
if lines.deleted_lines_count > 0 then
140+
-- Deleted range red highlight
141+
vim.api.nvim_buf_set_extmark(bufnr, ns_id, lines.delete_extmark.row, 0, {
142+
hl_group = "CopilotLspNesDelete",
143+
end_row = lines.delete_extmark.end_row,
144+
})
145+
end
146+
if lines.added_lines_count > 0 then
147+
local text = trim_end(edits[1].text)
148+
local virt_lines = require("copilot-lsp.util").hl_text_to_virt_lines(text, vim.bo[bufnr].filetype)
149+
150+
vim.api.nvim_buf_set_extmark(bufnr, ns_id, lines.virt_lines_extmark.row, 0, {
151+
virt_lines = virt_lines,
152+
})
153+
end
118154
end
119155

120156
vim.b[bufnr].nes_state = suggestion

lua/copilot-lsp/types.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@
2626
---@field deleted_lines_count number
2727
---@field added_lines string[]
2828
---@field added_lines_count number
29-
---@field same_line number
29+
---@field same_line boolean
3030
---@field delete_extmark copilotlsp.nes.DeleteExtmark
3131
---@field virt_lines_extmark copilotlsp.nes.AddExtmark

tests/nes/test_ui.lua

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ T["diff placement calculations"] = MiniTest.new_set({
3535
row = 0,
3636
},
3737
deleted_lines_count = 1,
38-
same_line = 1,
38+
same_line = true,
3939
virt_lines_extmark = {
4040
row = 0,
4141
virt_lines_count = 1,
@@ -71,7 +71,7 @@ T["diff placement calculations"] = MiniTest.new_set({
7171
row = 0,
7272
},
7373
deleted_lines_count = 1,
74-
same_line = 0,
74+
same_line = false,
7575
virt_lines_extmark = {
7676
row = 0,
7777
virt_lines_count = 0,
@@ -107,7 +107,7 @@ T["diff placement calculations"] = MiniTest.new_set({
107107
row = 0,
108108
},
109109
deleted_lines_count = 1,
110-
same_line = 0,
110+
same_line = false,
111111
virt_lines_extmark = {
112112
row = 0,
113113
virt_lines_count = 2,
@@ -137,7 +137,7 @@ T["diff placement calculations"] = MiniTest.new_set({
137137
end_row = 2,
138138
row = 2,
139139
},
140-
same_line = 1,
140+
same_line = true,
141141
virt_lines_extmark = {
142142
row = 1,
143143
virt_lines_count = 1,

0 commit comments

Comments
 (0)