From c3bfb4c48fd3058f33ca9369ec62218f0ddf9b58 Mon Sep 17 00:00:00 2001 From: Pegasust Date: Tue, 30 May 2023 09:35:27 -0700 Subject: [PATCH] feat: add :Noh --- lua/tsql.lua | 99 +++++++++++++++++++++++++++++++++++++++++------ lua/tsql/sink.lua | 14 ------- 2 files changed, 87 insertions(+), 26 deletions(-) delete mode 100644 lua/tsql/sink.lua diff --git a/lua/tsql.lua b/lua/tsql.lua index 0971ed7..95f5982 100644 --- a/lua/tsql.lua +++ b/lua/tsql.lua @@ -1,3 +1,7 @@ +---TODO: how does this work with changing texts? +---TODO: add reducer as formatter +---TODO: Add reducer as buf_select predicate + ---@type mod_buf_select local buf_select = require('tsql.buf_select') ---@type mod_token_select @@ -13,9 +17,6 @@ M.sink_by = {} ---@alias Format fun(nodes: QNode[]): string M.format = {} -M.nvim_ns = vim.api.nvim_create_namespace("tsql") -M.nvim_hl_group = "Search" - ---@class Sink ---@field sink fun(self, nodes: QNode[]) M.Sink = {} @@ -29,8 +30,8 @@ function M.sink_by.highlight() for _, node in ipairs(nodes) do vim.highlight.range( node.buf.bufnr, - M.nvim_ns, - M.nvim_hl_group, + M.config.nvim_ns, + M.config.nvim_hl_group, { node.start.row_0, node.start.col_0 }, { node.end_ex_col.row_0, node.end_ex_col.col_0 }, {} @@ -128,14 +129,88 @@ function M.t(buf_match, codeql, sink) }, M.Tsql) end ----NOTE: This is now exiting the functional core and entering ---- imperative shell -function M.Tsql:do_nvim() - self.sink:sink( - self.codeql:find_nodes( - self.buf_match:filter_on(M.nvim_get_qbufs()) - ) +---NOTE: requires nvim runtime +function M.Tsql:q_nodes() + return self.codeql:find_nodes( + self.buf_match:filter_on(M.nvim_get_qbufs()) ) end +---NOTE: This is now exiting the functional core and entering +--- imperative shell +--- @param store StaticStore +function M.Tsql:do_nvim(store) + self.sink:sink(self:q_nodes()) + store:add_highlight(self) +end + +---@param config RtConfig +---@param store StaticStore +function M._delete_all_highlights(config, store) + ---@type table + local bufs = {} + for _, highlight_q in pairs(store.highlighting) do + for _, qnode in ipairs(highlight_q:q_nodes()) do + table.insert(bufs, qnode.buf.bufnr, qnode.buf) + end + end + + for _, buf in pairs(bufs) do + vim.api.nvim_buf_clear_namespace(buf.bufnr, config.nvim_ns, 0, -1) + end + store:clear_highlights() +end + +---NOTE: Collocated with `M.setup` +---@class Config +---@field nvim_hl_group string +local Config = {} +---@type Config +M.config_default = { + nvim_hl_group = "Search" +} + +---@class RtConfig: Config +---@field nvim_ns number +M.RtConfig = {} +---@type RtConfig +M.config = {} + +---@class StaticStore +---@field highlighting Tsql[] +---This is needed to undo the highlighting done by this plugin and potentially +---subscribe to the changing buffers to re-highlight if necessary +M.Store = {} +M.Store.__index = M.Store + +---@param tsql Tsql +function M.Store:add_highlight(tsql) + table.insert(self.highlighting, tsql) +end + +function M.Store:clear_highlights() + self.highlighting = {} +end + +---@return StaticStore +function M.Store:new() + local o = { highlighting = {} } + setmetatable(o, self) + return o +end + +function M.clear_highlights() + return M._delete_all_highlights(M.config, M.store) +end + +---@param config Config +function M.setup(config) + M.config = vim.tbl_deep_extend("force", M.config, config or M.config_default) + M.config.nvim_ns = vim.api.nvim_create_namespace("tsql") + + vim.api.nvim_create_user_command("Noh", M.clear_highlights) + + M.store = M.Store:new() +end + return M diff --git a/lua/tsql/sink.lua b/lua/tsql/sink.lua deleted file mode 100644 index 5282f7a..0000000 --- a/lua/tsql/sink.lua +++ /dev/null @@ -1,14 +0,0 @@ -local M = {} - -M.Sink = {} - -function M.print() -end - -function M.highlight() -end - -function M.mutate() -end - -return M