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 )
2023-01-02 03:20:48 +00:00
local prefix = string.sub ( line , 0 , pos.col - 1 ) ---@diagnostic disable-line: param-type-mismatch
local suffix = string.sub ( line , pos.col ) ---@diagnostic disable-line: param-type-mismatch
2023-01-01 04:56:47 +00:00
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 )
2023-01-02 03:20:48 +00:00
local text_stripped = text : gsub ( ' [{}()%-, ] ' , ' ' ) : gsub ( ' 0x ' , ' ' )
2023-01-02 02:53:18 +00:00
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-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 ( )
2023-01-02 03:50:01 +00:00
local guid_patterns = {
' {0x[0-9a-fA-F] \\ {8 \\ }, \\ s*0x[0-9a-fA-F] \\ {4 \\ }, \\ s*0x[0-9a-fA-F] \\ {4 \\ }, \\ s*{0x[0-9a-fA-F] \\ {2 \\ }, \\ s*0x[0-9a-fA-F] \\ {2 \\ }, \\ s*0x[0-9a-fA-F] \\ {2 \\ }, \\ s*0x[0-9a-fA-F] \\ {2 \\ }, \\ s*0x[0-9a-fA-F] \\ {2 \\ }, \\ s*0x[0-9a-fA-F] \\ {2 \\ }, \\ s*0x[0-9a-fA-F] \\ {2 \\ }, \\ s*0x[0-9a-fA-F] \\ {2 \\ }}} ' , -- x
2023-01-02 03:20:48 +00:00
' ([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 \\ }) ' , -- p
' {[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 \\ }} ' , -- b
2023-01-02 03:50:01 +00:00
' [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 \\ } ' , -- d
' [0-9a-fA-F] \\ {32 \\ } ' , -- n
2023-01-02 02:53:18 +00:00
}
2023-01-01 05:09:47 +00:00
2023-01-02 03:50:01 +00:00
for _ , guid_pattern in ipairs ( guid_patterns ) do
local match_pos = find_pattern_at_pos ( guid_pattern , pos )
2023-01-02 02:53:18 +00:00
if match_pos then
local guid = guid_parse ( match_pos.text )
2023-01-02 03:50:01 +00:00
local guid_printed = guid_print ( guid , style )
2023-01-02 02:53:18 +00:00
local line = vim.fn . getline ( pos.row )
2023-01-02 03:20:48 +00:00
local line_prefix = line : sub ( 1 , match_pos.col - 1 ) ---@diagnostic disable-line: undefined-field
local line_suffix = line : sub ( match_pos.col + # match_pos.text ) ---@diagnostic disable-line: undefined-field
2023-01-02 03:50:01 +00:00
vim.fn . setline ( match_pos.row , line_prefix .. guid_printed .. line_suffix )
2023-01-02 02:53:18 +00:00
return
end
end
2023-01-02 03:20:48 +00:00
vim.api . nvim_notify ( ' GUID not found at cursor! ' , vim.log . levels.ERROR , { } )
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
}