141 lines
4.6 KiB
Lua
141 lines
4.6 KiB
Lua
|
|
-- TODO: don't having to resave to remove extmark
|
|
-- TODO: see the others TODO
|
|
|
|
|
|
local M = {}
|
|
|
|
local api = vim.api
|
|
local cmd = vim.api.nvim_create_autocmd
|
|
local treesitter = vim.treesitter
|
|
local opts = {
|
|
tags = {
|
|
{
|
|
name = "TODO",
|
|
fg = "white",
|
|
bg = "#0a7aca",
|
|
bold = true,
|
|
},
|
|
{
|
|
name = "FIX",
|
|
fg = "white",
|
|
bg = "#f44747",
|
|
bold = true,
|
|
},
|
|
{
|
|
name = "WARNING",
|
|
fg = "#FFA500",
|
|
bold = false,
|
|
},
|
|
{
|
|
name = "FUTURE",
|
|
fg = "#f44747",
|
|
bold = true,
|
|
}
|
|
|
|
},
|
|
}
|
|
|
|
|
|
M.Setup = function(config)
|
|
if config and config.default==false then
|
|
opts.tags = {}
|
|
end
|
|
if config and config.tags then
|
|
opts.tags = vim.tbl_deep_extend("force", opts.tags, config.tags or {})
|
|
end
|
|
|
|
local augroup = vim.api.nvim_create_augroup("better-comments", {clear = true})
|
|
cmd({ 'BufWinEnter', 'BufFilePost', 'BufWritePost', 'TextChanged', 'TextChangedI' }, {
|
|
group = augroup,
|
|
callback = function()
|
|
local current_buffer = api.nvim_get_current_buf()
|
|
local current_buffer_name = api.nvim_buf_get_name(current_buffer)
|
|
if current_buffer_name == '' then
|
|
return
|
|
end
|
|
local fileType = api.nvim_buf_get_option(current_buffer, "filetype")
|
|
local success, parsed_query = pcall(function()
|
|
return treesitter.query.parse(fileType, [[(comment) @all]])
|
|
end)
|
|
if not success then
|
|
return
|
|
end
|
|
local commentsTree = treesitter.query.parse(fileType, [[(comment) @all]])
|
|
|
|
-- FIX: Check if file has treesitter
|
|
local root = Get_root(current_buffer, fileType)
|
|
local comments = {}
|
|
for _, node in commentsTree:iter_captures(root, current_buffer, 0, -1) do
|
|
local range = { node:range() }
|
|
table.insert(comments, {
|
|
line = range[1],
|
|
col_start = range[2],
|
|
finish = range[4],
|
|
text = vim.treesitter.get_node_text(node, current_buffer)
|
|
})
|
|
end
|
|
|
|
if comments == {} then
|
|
return
|
|
end
|
|
Create_hl(opts.tags)
|
|
|
|
for id, comment in ipairs(comments) do
|
|
for hl_id, hl in ipairs(opts.tags) do
|
|
if string.find(comment.text, hl.name) then
|
|
local ns_id = vim.api.nvim_create_namespace(hl.name)
|
|
if hl.virtual_text and hl.virtual_text ~= "" then
|
|
local v_opts = {
|
|
id = id,
|
|
virt_text = { { hl.virtual_text, "" } },
|
|
virt_text_pos = 'overlay',
|
|
virt_text_win_col = comment.finish + 2,
|
|
}
|
|
|
|
-- FIX: comment.line -> 0 in col
|
|
api.nvim_buf_set_extmark(current_buffer, ns_id, comment.line, 0, v_opts)
|
|
end
|
|
|
|
-- FIX: using for ns_id ns_id instead of 0
|
|
-- so that when we clear the namespace the color also clear
|
|
vim.api.nvim_buf_add_highlight(current_buffer, ns_id, tostring(hl_id), comment.line,
|
|
comment.col_start,
|
|
comment.finish)
|
|
else
|
|
-- FIX: added else to delted extmark
|
|
|
|
-- TODO: THIS PART IS CALLED A LOT FIND A WAY TO NOT CHECK EVERY TIME
|
|
if hl.virtual_text ~= "" then
|
|
local ns_id = vim.api.nvim_create_namespace(hl.name)
|
|
|
|
-- FIX: clearing the namespace to delete the extmark and the color
|
|
api.nvim_buf_clear_namespace(current_buffer, ns_id, comment.line, comment.line+1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
})
|
|
end
|
|
|
|
Get_root = function(bufnr, filetype)
|
|
local parser = vim.treesitter.get_parser(bufnr, filetype, {})
|
|
local tree = parser:parse()[1]
|
|
return tree:root()
|
|
end
|
|
|
|
function Create_hl(list)
|
|
for id, hl in ipairs(list) do
|
|
vim.api.nvim_set_hl(0, tostring(id), {
|
|
fg = hl.fg,
|
|
bg = hl.bg,
|
|
bold = hl.bold,
|
|
underline = hl.underline,
|
|
})
|
|
end
|
|
end
|
|
|
|
return M
|
|
|