* WIP * WIP * Fix #226 * Insert text * Emulate vim native * テキトウ * Tekito * Move scrollbar impl * aaa * Ignore unexpected event * fix * fix scroll * Refactor (conflict...) * Fix bug * Positive integer * Refactor a bit * Fix for pumheight=0 * fx * Improve matching highlight * Improve colorscheme handling * fmt * Add cmp.visible * Fix pum pos * ABBR_MARGIN * Fix cel calculation * up * refactor * fix * a * a * compat * Remove current completion state * Fix ghost text * Add feature toggle * highlight customization * Update * Add breaking change announcement * Add README.md * Remove unused function * extmark ephemeral ghost text * Support native comp * Fix docs pos * a * Remove if native menu visible * theme async * Improvement idea: option to disables insert on select item (#240) * use ghost text instead of insertion on prev/next item * add disables_insert_on_selection option * move disable_insert_on_select option as argumet on * update README * use an enum behavior to disable insert on select * Adopt contribution * Preselect * Improve * Change configuration option * a * Improve * Improve * Implement proper <C-e> behavior to native/custom * Support <C-c> maybe * Improve docs view * Improve * Avoid syntax leak * TODO: refactor * Fix * Revert win pos * fmt * ghost text remaining * Don't use italic by default * bottom * dedup by label * Ignore events * up * Hacky native view partial support * up * perf * improve * more cache * fmt * Fix format option * fmt * recheck * Fix * Improve * Improve * compat * implement redraw * improve * up * fmt/lint * immediate ghost text * source timeout * up * Support multibyte * disable highlight * up * improve * fmt * fmt * fix * fix * up * up * Use screenpos * Add undojoin check * Fix height * matcher bug * Fix dot-repeat * Remove undojoin * macro * Support dot-repeat * MacroSafe * Default item count is 200 * fmt Co-authored-by: Eric Puentes <eric.puentes@mercadolibre.com.co>
171 lines
3.4 KiB
Lua
171 lines
3.4 KiB
Lua
local misc = {}
|
|
|
|
---Return concatenated list
|
|
---@param list1 any[]
|
|
---@param list2 any[]
|
|
---@return any[]
|
|
misc.concat = function(list1, list2)
|
|
local new_list = {}
|
|
for _, v in ipairs(list1) do
|
|
table.insert(new_list, v)
|
|
end
|
|
for _, v in ipairs(list2) do
|
|
table.insert(new_list, v)
|
|
end
|
|
return new_list
|
|
end
|
|
|
|
---Get cursor before line
|
|
---@return string
|
|
misc.get_cursor_before_line = function()
|
|
local cursor = vim.api.nvim_win_get_cursor(0)
|
|
return string.sub(vim.api.nvim_get_current_line(), 1, cursor[2])
|
|
end
|
|
|
|
---Return current mode is insert-mode or not.
|
|
---@return boolean
|
|
misc.is_insert_mode = function()
|
|
return string.sub(vim.api.nvim_get_mode().mode, 1, 1) == 'i'
|
|
end
|
|
|
|
---Merge two tables recursively
|
|
---@generic T
|
|
---@param v1 T
|
|
---@param v2 T
|
|
---@return T
|
|
misc.merge = function(v1, v2)
|
|
local merge1 = type(v1) == 'table' and (not vim.tbl_islist(v1) or vim.tbl_isempty(v1))
|
|
local merge2 = type(v2) == 'table' and (not vim.tbl_islist(v2) or vim.tbl_isempty(v2))
|
|
if merge1 and merge2 then
|
|
local new_tbl = {}
|
|
for k, v in pairs(v2) do
|
|
new_tbl[k] = misc.merge(v1[k], v)
|
|
end
|
|
for k, v in pairs(v1) do
|
|
if v2[k] == nil then
|
|
new_tbl[k] = v
|
|
end
|
|
end
|
|
return new_tbl
|
|
end
|
|
if v1 == nil then
|
|
return v2
|
|
end
|
|
if v1 == true then
|
|
if merge2 then
|
|
return v2
|
|
end
|
|
return {}
|
|
end
|
|
|
|
return v1
|
|
end
|
|
|
|
---Generate id for group name
|
|
misc.id = setmetatable({
|
|
group = {},
|
|
}, {
|
|
__call = function(_, group)
|
|
misc.id.group[group] = misc.id.group[group] or vim.loop.now()
|
|
misc.id.group[group] = misc.id.group[group] + 1
|
|
return misc.id.group[group]
|
|
end,
|
|
})
|
|
|
|
---Check the value is nil or not.
|
|
---@param v boolean
|
|
---@return boolean
|
|
misc.safe = function(v)
|
|
if v == nil or v == vim.NIL then
|
|
return nil
|
|
end
|
|
return v
|
|
end
|
|
|
|
---Treat 1/0 as bool value
|
|
---@param v boolean|"1"|"0"
|
|
---@param def boolean
|
|
---@return boolean
|
|
misc.bool = function(v, def)
|
|
if misc.safe(v) == nil then
|
|
return def
|
|
end
|
|
return v == true or v == 1
|
|
end
|
|
|
|
---Set value to deep object
|
|
---@param t table
|
|
---@param keys string[]
|
|
---@param v any
|
|
misc.set = function(t, keys, v)
|
|
local c = t
|
|
for i = 1, #keys - 1 do
|
|
local key = keys[i]
|
|
c[key] = misc.safe(c[key]) or {}
|
|
c = c[key]
|
|
end
|
|
c[keys[#keys]] = v
|
|
end
|
|
|
|
---Copy table
|
|
---@generic T
|
|
---@param tbl T
|
|
---@return T
|
|
misc.copy = function(tbl)
|
|
if type(tbl) ~= 'table' then
|
|
return tbl
|
|
end
|
|
|
|
if vim.tbl_islist(tbl) then
|
|
local copy = {}
|
|
for i, value in ipairs(tbl) do
|
|
copy[i] = misc.copy(value)
|
|
end
|
|
return copy
|
|
end
|
|
|
|
local copy = {}
|
|
for key, value in pairs(tbl) do
|
|
copy[key] = misc.copy(value)
|
|
end
|
|
return copy
|
|
end
|
|
|
|
---Safe version of vim.str_utfindex
|
|
---@param text string
|
|
---@param vimindex number
|
|
---@return number
|
|
misc.to_utfindex = function(text, vimindex)
|
|
return vim.str_utfindex(text, math.max(0, math.min(vimindex - 1, #text)))
|
|
end
|
|
|
|
---Safe version of vim.str_byteindex
|
|
---@param text string
|
|
---@param utfindex number
|
|
---@return number
|
|
misc.to_vimindex = function(text, utfindex)
|
|
for i = utfindex, 1, -1 do
|
|
local s, v = pcall(function()
|
|
return vim.str_byteindex(text, i) + 1
|
|
end)
|
|
if s then
|
|
return v
|
|
end
|
|
end
|
|
return utfindex + 1
|
|
end
|
|
|
|
---Mark the function as deprecated
|
|
misc.deprecated = function(fn, msg)
|
|
local printed = false
|
|
return function(...)
|
|
if not printed then
|
|
print(msg)
|
|
printed = true
|
|
end
|
|
return fn(...)
|
|
end
|
|
end
|
|
|
|
return misc
|