Skip to content

Commit

Permalink
feat: Implement mark handler
Browse files Browse the repository at this point in the history
  • Loading branch information
Isrothy committed Aug 26, 2024
1 parent 9e3be03 commit e24b1f5
Show file tree
Hide file tree
Showing 13 changed files with 201 additions and 21 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,7 @@ vim.g.neominimap ={
enabled = false, ---@type boolean
mode = "icon", ---@type Neominimap.Handler.Annotation
priority = 10, ---@type integer
key = "m", ---@type string
show_builtins = false, ---@type boolean -- shows the builtin marks like [ ] < >
},

Expand Down
90 changes: 81 additions & 9 deletions lua/neominimap/buffer/autocmds.lua
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ local config = require("neominimap.config")
local create_git_autocmds = function()
api.nvim_create_autocmd("User", {
pattern = "GitSignsUpdate",
desc = "Update git marks when git signs are updated",
desc = "Update git annotations when git signs are updated",
callback = function(args)
local logger = require("neominimap.logger")
logger.log("GitSignsUpdate event triggered.", vim.log.levels.TRACE)
Expand All @@ -26,7 +26,7 @@ local create_git_autocmds = function()
api.nvim_create_autocmd("User", {
group = "Neominimap",
pattern = "MinimapBufferTextUpdated",
desc = "Update git marks when buffer text is updated",
desc = "Update git annotations when buffer text is updated",
callback = function(args)
local bufnr = args.data.buf
local logger = require("neominimap.logger")
Expand All @@ -44,7 +44,7 @@ end
local create_diagnostic_autocmds = function()
api.nvim_create_autocmd("DiagnosticChanged", {
group = "Neominimap",
desc = "Update diagnostic marks when diagnostics are changed",
desc = "Update diagnostic annotations when diagnostics are changed",
callback = function()
local logger = require("neominimap.logger")
logger.log("DiagnosticChanged event triggered.", vim.log.levels.TRACE)
Expand All @@ -58,7 +58,7 @@ local create_diagnostic_autocmds = function()
api.nvim_create_autocmd("User", {
group = "Neominimap",
pattern = "MinimapBufferTextUpdated",
desc = "Update diagnostic marks when buffer text is updated",
desc = "Update diagnostic annotations when buffer text is updated",
callback = function(args)
local bufnr = args.data.buf
local logger = require("neominimap.logger")
Expand All @@ -74,9 +74,10 @@ local create_diagnostic_autocmds = function()
end

local create_search_autocmds = function()
require("neominimap.events.search")
api.nvim_create_autocmd("BufWinEnter", {
group = "Neominimap",
desc = "Update search marks when entering window",
desc = "Update search annotations when entering window",
callback = function()
local logger = require("neominimap.logger")
logger.log("BufWinEnter event triggered.", vim.log.levels.TRACE)
Expand All @@ -90,7 +91,7 @@ local create_search_autocmds = function()
})
api.nvim_create_autocmd("TabEnter", {
group = "Neominimap",
desc = "Update search marks when entering tab",
desc = "Update search annotations when entering tab",
callback = vim.schedule_wrap(function()
local tid = api.nvim_get_current_tabpage()
local logger = require("neominimap.logger")
Expand All @@ -108,7 +109,7 @@ local create_search_autocmds = function()
api.nvim_create_autocmd("User", {
group = "Neominimap",
pattern = "MinimapBufferTextUpdated",
desc = "Update search marks when buffer text is updated",
desc = "Update search annotations when buffer text is updated",
callback = function(args)
local bufnr = args.data.buf
local logger = require("neominimap.logger")
Expand All @@ -121,11 +122,10 @@ local create_search_autocmds = function()
end)
end,
})
require("neominimap.events.search")
api.nvim_create_autocmd("User", {
group = "Neominimap",
pattern = "Search",
desc = "Update search marks when search event is triggered",
desc = "Update search annotations when search event is triggered",
callback = function()
local logger = require("neominimap.logger")
logger.log("Search event triggered", vim.log.levels.TRACE)
Expand All @@ -142,6 +142,75 @@ local create_search_autocmds = function()
})
end

local create_mark_autocmds = function()
require("neominimap.events.mark")(config.mark.key)
api.nvim_create_autocmd("BufWinEnter", {
group = "Neominimap",
desc = "Update mark annotations when entering window",
callback = function()
local logger = require("neominimap.logger")
logger.log("BufWinEnter event triggered.", vim.log.levels.TRACE)
vim.schedule(function()
local bufnr = api.nvim_get_current_buf()
logger.log(string.format("Updating marks for buffer %d.", bufnr), vim.log.levels.TRACE)
require("neominimap.buffer.internal").update_mark(bufnr)
logger.log(string.format("Marks updated for buffer %d.", bufnr), vim.log.levels.TRACE)
end)
end,
})
api.nvim_create_autocmd("TabEnter", {
group = "Neominimap",
desc = "Update marks annotations when entering tab",
callback = vim.schedule_wrap(function()
local tid = api.nvim_get_current_tabpage()
local logger = require("neominimap.logger")
logger.log(string.format("TabEnter event triggered for tab %d.", tid), vim.log.levels.TRACE)
logger.log("Refreshing search status.", vim.log.levels.TRACE)
local visiable_buffers = require("neominimap.util").get_visible_buffers()
for _, bufnr in ipairs(visiable_buffers) do
logger.log(string.format("Updating marks for buffer %d.", bufnr), vim.log.levels.TRACE)
require("neominimap.buffer.internal").update_mark(bufnr)
logger.log(string.format("Marks updated for buffer %d.", bufnr), vim.log.levels.TRACE)
end
logger.log("Marks refreshed.", vim.log.levels.TRACE)
end),
})
api.nvim_create_autocmd("User", {
group = "Neominimap",
pattern = "Mark",
desc = "Update marks annotations when mark event is triggered",
callback = function()
local logger = require("neominimap.logger")
logger.log("Mark event triggered", vim.log.levels.TRACE)
vim.schedule(function()
local visible_buffers = require("neominimap.util").get_visible_buffers()
for _, bufnr in ipairs(visible_buffers) do
logger.log(string.format("Updating marks for buffer %d.", bufnr), vim.log.levels.TRACE)
require("neominimap.buffer.internal").update_mark(bufnr)
logger.log(string.format("Marks updated for buffer %d.", bufnr), vim.log.levels.TRACE)
end
logger.log("Marksrefreshed.", vim.log.levels.TRACE)
end)
end,
})
api.nvim_create_autocmd("User", {
group = "Neominimap",
pattern = "MinimapBufferTextUpdated",
desc = "Update marks annotations when buffer text is updated",
callback = function(args)
local bufnr = args.data.buf
local logger = require("neominimap.logger")
logger.log("User Neominimap event triggered. patter: BufferTextUpdated", vim.log.levels.TRACE)
logger.log(string.format("Buffer ID: %d", bufnr), vim.log.levels.TRACE)
vim.schedule(function()
logger.log(string.format("Refreshing marks for buffer %d.", bufnr), vim.log.levels.TRACE)
require("neominimap.buffer.internal").update_mark(bufnr)
logger.log(string.format("Marks refreshed for buffer %d.", bufnr), vim.log.levels.TRACE)
end)
end,
})
end

M.create_autocmds = function()
api.nvim_create_autocmd({ "BufNew", "BufRead" }, {
group = "Neominimap",
Expand Down Expand Up @@ -205,6 +274,9 @@ M.create_autocmds = function()
if config.search.enabled then
create_search_autocmds()
end
if config.mark.enabled then
create_mark_autocmds()
end
end

return M
29 changes: 29 additions & 0 deletions lua/neominimap/buffer/internal.lua
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,27 @@ M.create_minimap_buffer = function(bufnr)
end),
config.delay
)
var.b[bufnr].update_mark = util.debounce(
vim.schedule_wrap(function()
if not api.nvim_buf_is_valid(bufnr) then
return
end
logger.log(string.format("Generating marks for buffer %d", bufnr), vim.log.levels.TRACE)
local mbufnr_ = buffer_map.get_minimap_bufnr(bufnr)
if not mbufnr_ or not api.nvim_buf_is_valid(mbufnr_) then
logger.log(
string.format("Minimap buffer is not valid. Skipping generation of minimap."),
vim.log.levels.WARN
)
return
end
local handlers = require("neominimap.map.handlers")
local mark = require("neominimap.map.handlers.mark")
handlers.apply(bufnr, mbufnr_, mark.namespace, mark.get_annotations(bufnr), config.mark.mode)
logger.log(string.format("Marks for buffer %d generated successfully", bufnr), vim.log.levels.TRACE)
end),
config.delay
)

logger.log(string.format("Minimap for buffer %d generated successfully", bufnr), vim.log.levels.TRACE)

Expand Down Expand Up @@ -279,6 +300,14 @@ M.update_search = function(bufnr)
end
end

---@param bufnr integer
M.update_mark = function(bufnr)
local var = require("neominimap.variables")
if api.nvim_buf_is_valid(bufnr) and var.b[bufnr].enabled then
var.b[bufnr].update_mark()
end
end

--- Refresh the minimap attached to the given buffer if possible
--- Remove a buffer that is attached to it
--- @param bufnr integer
Expand Down
1 change: 1 addition & 0 deletions lua/neominimap/config/internal.lua
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ local M = {
enabled = false, ---@type boolean
mode = "icon", ---@type Neominimap.Handler.Annotation.Mode
priority = 10, ---@type integer
key = "m", ---@type string
show_builtins = false, ---@type boolean -- shows the builtin marks like [ ] < >
},

Expand Down
2 changes: 2 additions & 0 deletions lua/neominimap/config/meta.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ local M = {}
---@field git? Neominimap.GitConfig
---@field treesitter? Neominimap.TreesitterConfig
---@field search? Neominimap.SearchConfig
---@field mark? Neominimap.MarkConfig
---@field fold? Neominimap.FoldConfig
---@field winopt? fun(opt: vim.wo, winid: integer)
---@field bufopt? fun(opt: vim.bo, bufnr: integer)
Expand Down Expand Up @@ -64,6 +65,7 @@ local M = {}
---@field enabled? boolean
---@field mode? Neominimap.Handler.Annotation.Mode
---@field priority? integer
---@field key? string
---@field show_builtins? boolean

---@class (exact) Neominimap.TreesitterConfig
Expand Down
3 changes: 2 additions & 1 deletion lua/neominimap/config/validator.lua
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,8 @@ M.validate_config = function(cfg)
mark = { cfg.mark, "table" },
["mark.enabled"] = { cfg.mark.enabled, "boolean" },
["mark.mode"] = { cfg.mark.mode, "string" },
["mark.priority"] = { cfg.mark.priority, "integer" },
["mark.priority"] = { cfg.mark.priority, "number" },
["mark.key"] = { cfg.mark.key, "string" },
["mark.show_builtins"] = { cfg.mark.show_builtins, "boolean" },

click = { cfg.click, "table" },
Expand Down
7 changes: 3 additions & 4 deletions lua/neominimap/map/handlers/application.lua
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@ local apply_line = function(bufnr, mbufnr, namespace, annotations)
end_col = 0,
end_row = lineNr,
hl_group = line_annotation.hl,
hl_mode = "combine",
priority = line_annotation.priority,
})
end
Expand Down Expand Up @@ -83,7 +82,6 @@ local apply_sign = function(bufnr, mbufnr, namespace, annotations)
for lineNr, sign_annotation in pairs(signs) do
if lineNr <= line_count then
api.nvim_buf_set_extmark(mbufnr, namespace, lineNr - 1, 0, {
hl_mode = "combine",
sign_text = " " .. coord.bitmap_to_char(sign_annotation.flag),
sign_hl_group = sign_annotation.hl,
priority = sign_annotation.priority,
Expand All @@ -107,6 +105,8 @@ local apply_icon = function(bufnr, mbufnr, namespace, annotations)
local coord = require("neominimap.map.coord")
local fold = require("neominimap.map.fold")
local cached_folds = fold.get_cached_folds(bufnr)

local logger = require("neominimap.logger")
for _, annotation in ipairs(annotations) do
local start_row, end_row = fold.get_visiable_range(cached_folds, annotation.lnum, annotation.end_lnum)
for row = start_row, end_row do
Expand All @@ -119,7 +119,7 @@ local apply_icon = function(bufnr, mbufnr, namespace, annotations)
then
icons[mrow] = {
id = annotation.id,
hl = annotation.sign_highlight,
hl = annotation.icon_highlight,
icon = annotation.icon,
priority = annotation.priority,
}
Expand All @@ -130,7 +130,6 @@ local apply_icon = function(bufnr, mbufnr, namespace, annotations)
for lineNr, icon_annotation in pairs(icons) do
if lineNr <= line_count then
api.nvim_buf_set_extmark(mbufnr, namespace, lineNr - 1, 0, {
hl_mode = "combine",
sign_text = icon_annotation.icon,
sign_hl_group = icon_annotation.hl,
priority = icon_annotation.priority,
Expand Down
6 changes: 3 additions & 3 deletions lua/neominimap/map/handlers/git.lua
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ local toId = {
["delete"] = 3,
}

api.nvim_set_hl(0, "NeominimapGitAddSign", { fg = colors.add, default = true })
api.nvim_set_hl(0, "NeominimapGitChangeSign", { fg = colors.change, default = true })
api.nvim_set_hl(0, "NeominimapGitDeleteSign", { fg = colors.delete, default = true })
api.nvim_set_hl(0, "NeominimapGitAddSign", { fg = colors.add, bg = "NONE", default = true })
api.nvim_set_hl(0, "NeominimapGitChangeSign", { fg = colors.change, bg = "NONE", default = true })
api.nvim_set_hl(0, "NeominimapGitDeleteSign", { fg = colors.delete, bg = "NONE", default = true })

api.nvim_set_hl(0, "NeominimapGitAddIcon", { fg = colors.add, default = true })
api.nvim_set_hl(0, "NeominimapGitChangeIcon", { fg = colors.change, default = true })
Expand Down
76 changes: 76 additions & 0 deletions lua/neominimap/map/handlers/mark.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
local api, fn = vim.api, vim.fn
local config = require("neominimap.config")

local M = {}

M.namespace = api.nvim_create_namespace("neominimap_mark")

local builtin_marks = {
"'.",
"'^",
"''",
"'\"",
"'<",
"'>",
"'[",
"']",
}

--- @param m string mark name
--- @return boolean
local function is_builtin(m)
return vim.list_contains(builtin_marks, m)
end

api.nvim_set_hl(0, "NeominimapMarkSign", { link = "Normal", default = true })
api.nvim_set_hl(0, "NeominimapMarkIcon", { link = "Normal", default = true })
api.nvim_set_hl(0, "NeominimapMarkLine", { link = "CursorLine", default = true })

---@alias Neominimap.Handler.Mark {mark:string, pos:integer[], file:string}

---@param bufnr integer
---@return Neominimap.Handler.Mark[]
local get_marks = function(bufnr)
---@type Neominimap.Handler.Mark[]
local marks = {}
local current_file = api.nvim_buf_get_name(bufnr)
for _, mark in ipairs(fn.getmarklist()) do
---@cast mark Neominimap.Handler.Mark
local mark_file = fn.fnamemodify(mark.file, ":p:a")
if mark_file == current_file and mark.mark:find("[a-zA-Z]") ~= nil then
marks[#marks + 1] = mark
end
end
for _, mark in ipairs(vim.fn.getmarklist(bufnr)) do
marks[#marks + 1] = mark
end
return marks
end

--- @param bufnr integer
---@return Annotation[]
M.get_annotations = function(bufnr)
local marks = get_marks(bufnr)
local annotation = {}
local logger = require("neominimap.logger")
for _, mark in ipairs(marks) do
logger.log(vim.inspect(mark), vim.log.levels.DEBUG)
local lnum = mark.pos[2]
if config.mark.show_builtins or not is_builtin(mark.mark) then
annotation[#annotation + 1] = {
lnum = lnum + 1,
end_lnum = lnum + 1,
priority = config.mark.priority,
id = 1,
icon = string.sub(mark.mark, 2, 3),
line_highlight = "NeominimapMarkLine",
sign_highlight = "NeominimapMarkSign",
icon_highlight = "NeominimapMarkIcon",
}
end
end
logger.log(vim.inspect(annotation), vim.log.levels.DEBUG)
return annotation
end

return M
4 changes: 2 additions & 2 deletions lua/neominimap/map/handlers/search.lua
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ end
--- @param bufnr integer
---@return Annotation[]
M.get_annotations = function(bufnr)
local annotations = get_matches(bufnr)
local matches = get_matches(bufnr)
return vim.tbl_map(function(lnum)
---@type Annotation[]
return {
Expand All @@ -107,7 +107,7 @@ M.get_annotations = function(bufnr)
sign_highlight = "NeominimapSearchSign",
icon_highlight = "NeominimapSearchIcon",
}
end, annotations)
end, matches)
end

return M
Loading

0 comments on commit e24b1f5

Please sign in to comment.