2023-01-01 03:51:09 +00:00
|
|
|
local function get_cursor_pos()
|
|
|
|
local _, row, col, _ = unpack(vim.fn.getpos('.'))
|
|
|
|
return {row = row, col = col}
|
|
|
|
end
|
2022-12-31 17:56:22 +00:00
|
|
|
|
2023-01-01 04:56:47 +00:00
|
|
|
local function insert_text_at_pos(text, pos)
|
|
|
|
local line = vim.fn.getline(pos.row)
|
|
|
|
---@diagnostic disable-next-line: param-type-mismatch
|
|
|
|
local prefix = string.sub(line, 0, pos.col - 1)
|
|
|
|
---@diagnostic disable-next-line: param-type-mismatch
|
|
|
|
local suffix = string.sub(line, pos.col)
|
|
|
|
vim.fn.setline(pos.row, prefix .. text .. suffix)
|
|
|
|
end
|
|
|
|
|
2023-01-02 02:53:18 +00:00
|
|
|
local function find_pattern(pattern, flags)
|
|
|
|
local row, col = unpack(vim.fn.searchpos(pattern, flags))
|
|
|
|
if row ~= 0 or col ~= 0 then
|
|
|
|
local text = vim.fn.matchstr(vim.fn.getline(row), pattern)
|
|
|
|
return {row = row, col = col, text = text}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
local function find_pattern_at_pos(pattern, pos)
|
|
|
|
for _, flags in ipairs({'cnW', 'bnW'}) do
|
|
|
|
local match_pos = find_pattern(pattern, flags)
|
|
|
|
if match_pos and match_pos.row == pos.row and match_pos.col <= pos.col and match_pos.col + #match_pos.text > pos.col then
|
|
|
|
return match_pos
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2023-01-01 03:51:09 +00:00
|
|
|
local function guid_generate()
|
|
|
|
local bytes = {}
|
|
|
|
for i = 1, 16 do
|
|
|
|
bytes[i] = math.random(0, 255)
|
|
|
|
end
|
|
|
|
return bytes
|
|
|
|
end
|
|
|
|
|
2023-01-02 02:53:18 +00:00
|
|
|
local function guid_parse(text)
|
|
|
|
local text_stripped = text:gsub('[-]', '')
|
|
|
|
assert(#text_stripped == 32)
|
|
|
|
|
|
|
|
local bytes = {}
|
|
|
|
for i = 0, 30, 2 do
|
|
|
|
local text_byte = text_stripped:sub(1 + i, 2 + i)
|
|
|
|
table.insert(bytes, tonumber(text_byte, 16))
|
|
|
|
end
|
|
|
|
|
|
|
|
return bytes
|
|
|
|
end
|
|
|
|
|
2023-01-01 05:09:47 +00:00
|
|
|
local function guid_print(guid, style)
|
|
|
|
if style == '' then
|
|
|
|
style = 'd'
|
|
|
|
end
|
2023-01-01 03:51:09 +00:00
|
|
|
|
2023-01-01 04:56:47 +00:00
|
|
|
-- Format specifier definition:
|
|
|
|
-- https://learn.microsoft.com/en-us/dotnet/api/system.guid.tostring?view=net-7.0
|
|
|
|
|
|
|
|
local format = nil
|
|
|
|
local style_lower = style:lower()
|
|
|
|
if style_lower == 'n' then
|
|
|
|
-- 00000000000000000000000000000000
|
|
|
|
format = '%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x'
|
|
|
|
elseif style_lower == 'd' then
|
|
|
|
-- 00000000-0000-0000-0000-000000000000
|
|
|
|
format = '%.2x%.2x%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x'
|
|
|
|
elseif style_lower == 'b' then
|
|
|
|
-- {00000000-0000-0000-0000-000000000000}
|
|
|
|
format = '{%.2x%.2x%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x}'
|
|
|
|
elseif style_lower == 'p' then
|
|
|
|
-- (00000000-0000-0000-0000-000000000000)
|
|
|
|
format = '(%.2x%.2x%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x-%.2x%.2x%.2x%.2x%.2x%.2x)'
|
|
|
|
elseif style_lower == 'x' then
|
|
|
|
-- {0x00000000,0x0000,0x0000,{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}}
|
|
|
|
format = '{0x%.2x%.2x%.2x%.2x,0x%.2x%.2x,0x%.2x%.2x,{0x%.2x,0x%.2x,0x%.2x,0x%.2x,0x%.2x,0x%.2x,0x%.2x,0x%.2x}}'
|
|
|
|
end
|
|
|
|
|
2023-01-01 05:09:47 +00:00
|
|
|
local guid_printed = string.format(format, unpack(guid))
|
2023-01-01 04:56:47 +00:00
|
|
|
if style:upper() == style then
|
2023-01-01 05:09:47 +00:00
|
|
|
guid_printed = guid_printed:upper():gsub('X', 'x')
|
2023-01-01 04:56:47 +00:00
|
|
|
end
|
|
|
|
|
2023-01-01 05:09:47 +00:00
|
|
|
return guid_printed
|
2023-01-01 03:51:09 +00:00
|
|
|
end
|
|
|
|
|
2023-01-02 02:53:18 +00:00
|
|
|
-- [465a78ad-93cc-732e-a836-9824d49506d6]
|
|
|
|
|
2023-01-01 04:56:47 +00:00
|
|
|
local function guid_insert(style)
|
2023-01-01 03:51:09 +00:00
|
|
|
local pos = get_cursor_pos()
|
|
|
|
local guid = guid_generate()
|
2023-01-01 05:09:47 +00:00
|
|
|
local guid_printed = guid_print(guid, style)
|
|
|
|
insert_text_at_pos(guid_printed, pos)
|
|
|
|
end
|
|
|
|
|
2023-01-02 02:53:18 +00:00
|
|
|
local function guid_format(style)
|
|
|
|
local pos = get_cursor_pos()
|
|
|
|
local patterns = {
|
|
|
|
'[0-9a-fA-F]\\{8\\}-[0-9a-fA-F]\\{4\\}-[0-9a-fA-F]\\{4\\}-[0-9a-fA-F]\\{4\\}-[0-9a-fA-F]\\{12\\}'
|
|
|
|
}
|
2023-01-01 05:09:47 +00:00
|
|
|
|
2023-01-02 02:53:18 +00:00
|
|
|
for _, pattern in ipairs(patterns) do
|
|
|
|
local match_pos = find_pattern_at_pos(pattern, pos)
|
|
|
|
if match_pos then
|
|
|
|
local guid = guid_parse(match_pos.text)
|
|
|
|
local line = vim.fn.getline(pos.row)
|
|
|
|
---@diagnostic disable-next-line: undefined-field
|
|
|
|
local line_prefix = line:sub(1, match_pos.col - 1)
|
|
|
|
---@diagnostic disable-next-line: undefined-field
|
|
|
|
local line_suffix = line:sub(match_pos.col + #match_pos.text)
|
|
|
|
vim.fn.setline(match_pos.row, line_prefix .. guid_print(guid, style) .. line_suffix)
|
|
|
|
return
|
|
|
|
end
|
|
|
|
end
|
2022-12-31 17:56:22 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
return {
|
2023-01-01 05:09:47 +00:00
|
|
|
guid_format = guid_format,
|
|
|
|
guid_insert = guid_insert,
|
2022-12-31 17:56:22 +00:00
|
|
|
}
|