-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathvirtualtext.lua
More file actions
139 lines (112 loc) · 3.85 KB
/
Copy pathvirtualtext.lua
File metadata and controls
139 lines (112 loc) · 3.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
local logger = require("model_cmp.Trace.logger")
local config = require("model_cmp.config")
local utils = require("model_cmp.utils")
---@class ModelCmp.VitualText
---@field aug_id integer augroup id
---@field ns_id integer namespace id
---@field ext_ids integer extmark id
---@class CaptureText
---@field contents string[]
---@field virtual_save string
---@field bufferid integer
---@field line_number integer
local M = {}
M.ns_id = vim.api.nvim_create_namespace("model_cmp.virtualtext")
M.augroup = vim.api.nvim_create_augroup("model_cmp_virtualtext", { clear = true })
M.CaptureText = {
content = nil,
virtual_save = "",
bufferid = 0,
line_number = nil,
}
M.VirtualText = {
aug_id = M.augroup,
ns_id = M.ns_id,
ext_ids = nil,
}
function M.VirtualText:clear_preview()
if self.ext_ids == nil then
return
end
vim.api.nvim_buf_del_extmark(0, self.ns_id, self.ext_ids)
self.ext_ids = nil
end
---@param text string
function M.VirtualText:update_preview(text)
-- Checking all conditions before running update preview
if self.ext_ids ~= nil then
logger:info("clearning preview")
self:clear_preview()
end
if not vim.g.model_cmp_virtualtext_auto_trigger then
return
end
if vim.fn.mode() ~= "i" or vim.g.model_cmp_set_nomode == true then
return
end
logger:info("updating preview")
local cursor = vim.api.nvim_win_get_cursor(0) -- {line, col}
M.CaptureText.line_number = cursor[1]
M.CaptureText.bufferid = vim.api.nvim_get_current_buf()
vim.b.cursor = cursor
local lines = {}
for line in text:gmatch("([^\n]*)[\n]?") do
if line ~= "" then
table.insert(lines, line)
end
end
local ns_id = self.ns_id or vim.api.nvim_create_namespace("MyPluginVirtualText")
self.ns_id = ns_id
local curr = vim.api.nvim_get_current_line()
for idx = 1, #lines do
local suggestion, col_num = utils.partial_match(curr, lines[idx], cursor)
if suggestion ~= nil and col_num ~= nil then
if suggestion ~= "" then
M.CaptureText.content = utils.adjust_suggestion(curr, suggestion, col_num)
self.ext_ids = idx
vim.api.nvim_buf_set_extmark(0, ns_id, cursor[1] - 1, col_num, {
id = idx,
virt_text = { { suggestion, "CustomVirttextHighlight" } },
undo_restore = true,
virt_text_pos = "overlay",
})
return
end
end
end
end
function M.setup()
vim.g.model_cmp_virtualtext_auto_trigger = config.virtualtext.enable
vim.api.nvim_set_hl(0, "CustomVirttextHighlight", config.virtualtext.style)
end
------------------------------------------------------------------------------
---------------------------------ACTION---------------------------------------
------------------------------------------------------------------------------
local action = {}
function action.capturefirstline()
-- TODO: check for buffer
local currline = vim.fn.line(".")
vim.api.nvim_buf_set_lines(0, currline - 1, currline, false, { M.CaptureText.content })
vim.api.nvim_win_set_cursor(0, { currline, #M.CaptureText.content + 1 })
end
function action.capturealllines() end
function action.disable_auto_trigger()
vim.g.model_cmp_virtualtext_auto_trigger = false
M.VirtualText:clear_preview()
end
function action.enable_auto_trigger()
vim.g.model_cmp_virtualtext_auto_trigger = true
end
function action.toggle_auto_trigger()
vim.g.model_cmp_virtualtext_auto_trigger = function()
return not vim.b.model_cmp_virtualtext_auto_trigger
end
if not vim.g.model_cmp_virtualtext_auto_trigger then
M.VirtualText:clear_preview()
end
end
function action.clear_preview()
M.VirtualText:clear_preview()
end
M.action = action
return M