diff --git a/lua/inlay-hints/hints.lua b/lua/inlay-hints/hints.lua index a15ea36..089c426 100644 --- a/lua/inlay-hints/hints.lua +++ b/lua/inlay-hints/hints.lua @@ -2,6 +2,8 @@ local ih = require("inlay-hints") local M = {} +local BUFFER_AUTOCMDS = {} + M.namespace = vim.api.nvim_create_namespace("textDocument/inlayHints") local function clear_ns(bufnr) @@ -25,10 +27,26 @@ function M.unset() clear_ns(0) end +local function detach_buf(bufnr) + BUFFER_AUTOCMDS[bufnr] = nil + ih.hint_cache:del(bufnr) +end + function M.on_attach(_, bufnr) + M.enable(bufnr) +end + +-- Enable inlay-hints for bufnr +function M.enable(bufnr) local opts = ih.config.options or {} - vim.api.nvim_create_autocmd({ + if BUFFER_AUTOCMDS[bufnr] then + return -- Already enabled + end + + BUFFER_AUTOCMDS[bufnr] = {} + + local autocmd_id = vim.api.nvim_create_autocmd({ "BufWritePost", "BufReadPost", "BufEnter", @@ -43,24 +61,50 @@ function M.on_attach(_, bufnr) end, }) + table.insert(BUFFER_AUTOCMDS[bufnr], autocmd_id) + vim.api.nvim_buf_attach(bufnr, false, { on_detach = function() - ih.hint_cache:del(bufnr) + detach_buf(bufnr) end, }) if opts.only_current_line then - vim.api.nvim_create_autocmd("CursorHold", { + autocmd_id = vim.api.nvim_create_autocmd("CursorHold", { buffer = bufnr, callback = function() ih.render() end, }) + table.insert(BUFFER_AUTOCMDS[bufnr], autocmd_id) end ih.cache() end +-- Disable inlay-hints for bufnr +function M.disable(bufnr) + if BUFFER_AUTOCMDS[bufnr] == nil then + return -- Already disabled + end + + for _, autocmd_id in ipairs(BUFFER_AUTOCMDS[bufnr]) do + vim.api.nvim_del_autocmd(autocmd_id) + end + + detach_buf(bufnr) + clear_ns(bufnr) +end + +-- Toggle inlay-hints for bufnr +function M.toggle(bufnr) + if BUFFER_AUTOCMDS[bufnr] then + M.disable(bufnr) + else + M.enable(bufnr) + end +end + -- Parses the result into a easily usable format -- example: -- { diff --git a/lua/inlay-hints/init.lua b/lua/inlay-hints/init.lua index b0bf5c8..553213d 100644 --- a/lua/inlay-hints/init.lua +++ b/lua/inlay-hints/init.lua @@ -1,4 +1,5 @@ local Cache = require("inlay-hints.cache") +local BufUtils = require("inlay-hints.utils.buf") local M = { adapter = nil, @@ -49,6 +50,15 @@ function M.setup(opts) M.on_attach = function(client, bufnr) inlay.on_attach(client, bufnr) end + M.enable = function(bufnr) + inlay.enable(BufUtils.parse_buf(bufnr)) + end + M.disable = function(bufnr) + inlay.disable(BufUtils.parse_buf(bufnr)) + end + M.toggle = function(bufnr) + inlay.toggle(BufUtils.parse_buf(bufnr)) + end end return M diff --git a/lua/inlay-hints/utils/buf.lua b/lua/inlay-hints/utils/buf.lua new file mode 100644 index 0000000..326b099 --- /dev/null +++ b/lua/inlay-hints/utils/buf.lua @@ -0,0 +1,14 @@ +local M = {} + +---Return current bufnr if given bufnr is 0 or nil otherwise given bufnr +---@param bufnr number +---@return number +function M.parse_buf(bufnr) + if bufnr == 0 or bufnr == nil then + return vim.api.nvim_get_current_buf() + end + + return bufnr +end + +return M