87 lines
2.8 KiB
Lua
87 lines
2.8 KiB
Lua
vim.pack.add({
|
|
{ src = "https://github.com/petertriho/nvim-scrollbar" },
|
|
})
|
|
|
|
-- Show illuminated word matches as scrollbar marks. nvim-scrollbar's render
|
|
-- autocmds (BufWinEnter/WinEnter/TextChanged/VimResized/WinScrolled) do not fire
|
|
-- on CursorMoved, which is when illuminate refreshes its references, so hook
|
|
-- those events directly, mirroring how the built-in diagnostic handler works.
|
|
-- illuminate also refreshes its own refs ~(delay 100ms) after CursorMoved, so
|
|
-- re-run the highlight refresh on a small debounce for snappy bars.
|
|
local utils = require("scrollbar.utils")
|
|
local render = require("scrollbar").throttled_render
|
|
|
|
local function update_illuminate_marks()
|
|
local bufnr = vim.api.nvim_get_current_buf()
|
|
local config = require("scrollbar.config").get()
|
|
if
|
|
config.show == false
|
|
or not vim.api.nvim_buf_is_valid(bufnr)
|
|
or vim.tbl_contains(config.excluded_buftypes, vim.bo[bufnr].buftype)
|
|
or vim.tbl_contains(config.excluded_filetypes, vim.bo[bufnr].filetype)
|
|
then
|
|
return
|
|
end
|
|
|
|
local ok, reference = pcall(require, "illuminate.reference")
|
|
if not ok then
|
|
return
|
|
end
|
|
|
|
-- illuminate stores refs as { {0-indexed line, col}, {0-indexed line, col} },
|
|
-- sorted. Several refs can share a line, so keep one mark per line.
|
|
local illuminate_marks = {}
|
|
local last_line = -1
|
|
for _, ref in ipairs(reference.buf_get_references(bufnr)) do
|
|
local line = ref[1][1]
|
|
if line ~= last_line then
|
|
last_line = line
|
|
illuminate_marks[#illuminate_marks + 1] = {
|
|
line = line,
|
|
text = "≡",
|
|
type = "Illuminate",
|
|
level = 1,
|
|
}
|
|
end
|
|
end
|
|
|
|
local marks = utils.get_scrollbar_marks(bufnr)
|
|
marks.Illuminate = illuminate_marks
|
|
utils.set_scrollbar_marks(bufnr, marks)
|
|
|
|
render()
|
|
end
|
|
|
|
vim.api.nvim_create_autocmd({ "CursorMoved", "CursorHold", "TextChanged", "BufEnter", "WinEnter" }, {
|
|
group = vim.api.nvim_create_augroup("scrollbar_illuminate", { clear = true }),
|
|
callback = function(args)
|
|
update_illuminate_marks()
|
|
if args.event == "CursorMoved" or args.event == "TextChanged" then
|
|
vim.defer_fn(update_illuminate_marks, 250)
|
|
end
|
|
end,
|
|
})
|
|
|
|
require("scrollbar").setup({
|
|
excluded_filetypes = { "neo-tree" },
|
|
handle = {
|
|
highlight = "PmenuSbar",
|
|
},
|
|
marks = {
|
|
Illuminate = { text = "≡", priority = 8, highlight = "Special" },
|
|
Search = { highlight = "DiagnosticVirtualTextInfo" },
|
|
Error = { highlight = "DiagnosticFloatingError" },
|
|
Warn = { highlight = "DiagnosticFloatingWarn" },
|
|
Info = { highlight = "DiagnosticFloatingInfo" },
|
|
Hint = { highlight = "DiagnosticFloatingHint" },
|
|
GitAdd = { highlight = "GitSignsAdd" },
|
|
GitChange = { highlight = "GitSignsChange" },
|
|
GitDelete = { highlight = "GitSignsDelete" },
|
|
},
|
|
handlers = {
|
|
search = false, -- requires hlslens
|
|
diagnostic = true,
|
|
gitsigns = true,
|
|
},
|
|
})
|