feat: blame single line and remove all blame implemented

This commit is contained in:
2025-09-11 12:51:40 +02:00
parent ffd3fb62f6
commit 2c03780bf5
2 changed files with 51 additions and 11 deletions

View File

@@ -1,6 +1,44 @@
local ns = vim.api.nvim_create_namespace('line_blame');
local lineBlame = function(input_file_path, input_comma_separated_mail_list, blame_text, blame_highlight, blame_position)
local clearBlame = function()
vim.api.nvim_buf_clear_namespace(0, ns, 0, -1)
end
local setNvimMark = function(line_number, blame_text, blame_highlight, blame_position)
vim.api.nvim_buf_set_extmark(0, ns, line_number, 0, {
id = line_number + 1, -- cant be 0
virt_text = { { blame_text, blame_highlight } },
virt_text_pos = blame_position,
priority = 700,
hl_mode = 'combine',
})
end
local lineBlame = function(input_file_path, line_number, input_comma_separated_mail_list, blame_text, blame_highlight,
blame_position)
local handler = io.popen("git blame -L " .. line_number .. "," .. line_number .. " -e " ..
input_file_path .. " | awk '{print $2}'")
if handler == nil then
return nil
end
local result = handler:read("L")
if result == nil then
return nil
end
local mail = string.match(result, "%(<(.+)>")
if not mail then
return nil
end
for target_mail in string.gmatch(input_comma_separated_mail_list, "[^,]+") do
if target_mail == mail then
setNvimMark(tonumber(line_number), blame_text, blame_highlight, blame_position)
end
end
end
-- lineBlame
@@ -8,7 +46,7 @@ end
-- @param blame_highlight: 'Normal'
-- @param blame_position: 'eol' | 'overlay' | 'right_align'
local fileBlame = function(input_file_path, input_comma_separated_mail_list, blame_text, blame_highlight, blame_position)
local handler = io.popen("git blame -e " .. input_file_path .. " | awk '{ print $2$6}'")
local handler = io.popen("git blame -e " .. input_file_path .. " | awk '{print $2$6}'")
if handler == nil then
return nil
@@ -19,13 +57,7 @@ local fileBlame = function(input_file_path, input_comma_separated_mail_list, bla
for current_line_mail, line_number in string.gmatch(result, "%(<(.+)>(%d+)%)") do
for target_mail in string.gmatch(input_comma_separated_mail_list, "[^,]+") do
if target_mail == current_line_mail then
vim.api.nvim_buf_set_extmark(0, ns, tonumber(line_number) - 1, 0, {
id = tonumber(line_number),
virt_text = { { blame_text, blame_highlight } },
virt_text_pos = blame_position,
priority = 700,
hl_mode = 'combine',
})
setNvimMark(tonumber(line_number) - 1, blame_text, blame_highlight, blame_position)
end
end
end
@@ -35,6 +67,7 @@ local fileBlame = function(input_file_path, input_comma_separated_mail_list, bla
end
return {
clearBlame = clearBlame,
lineBlame = lineBlame,
fileBlame = fileBlame,
}

View File

@@ -18,12 +18,19 @@ local function blameCurrentFile()
end
local function blameCurrentLine()
blame.lineBlame(vim.api.nvim_buf_get_name(0), vim.g.monkeyMailList, vim.g.monkeyBlameText,
local row = vim.api.nvim_win_get_cursor(0)[1]
blame.lineBlame(vim.api.nvim_buf_get_name(0), tonumber(row) - 1, vim.g.monkeyMailList,
vim.g.monkeyBlameText,
"Monkey", vim.g.monkeyBlamePosition)
end
local function clearBlame()
blame.clearBlame()
end
return {
setup = setup,
blameLine = blameCurrentLine,
blameFile = blameCurrentFile
blameFile = blameCurrentFile,
blameClear = clearBlame
}