Expand your neovim sense with small UI components
0

Configure Feed

Select the types of activity you want to include in your feed.

refactor: add public API

- setup autocommands from `api.register()`
- some test tweaks
- rearrange some codes

+70 -35
+1
.gitattributes
··· 1 + spec/samples/** linguist-vendored
+20
lua/sense/api.lua
··· 1 + local state = require("sense.state") 2 + local autocmds = require("sense.autocmds") 3 + 4 + local M = {} 5 + 6 + ---@param indicator sense.Indicator 7 + function M.register(indicator) 8 + -- HACK: when used as lua-module and not as neovim plugin, try setup autocmds here 9 + if not vim.g.loaded_sense_nvim then 10 + autocmds.setup() 11 + vim.g.loaded_sense_nvim = true 12 + end 13 + table.insert(state.indicators, indicator) 14 + end 15 + 16 + function M.clear_registered() 17 + state.indicators = {} 18 + end 19 + 20 + return M
+1
lua/sense/autocmds.lua
··· 81 81 ui().render(info) 82 82 end, 83 83 }) 84 + -- TODO: properly detach UIs 84 85 end 85 86 86 87 return M
+13
lua/sense/state.lua
··· 1 1 local M = {} 2 2 3 + ---@class sense.state.WindowState 4 + ---@field indicators sense.Indicator[] 5 + 6 + ---@type sense.Indicator[] registered indicators 7 + M.indicators = {} 8 + 9 + ---@type table<integer, sense.state.WindowState> 10 + M.windows = vim.defaulttable(function(_winid) 11 + return { 12 + indicators = {} 13 + } 14 + end) 15 + 3 16 ---@type table<integer, vim.Diagnostic[]> 4 17 M.diag_cache = {} 5 18
+9 -27
lua/sense/ui/init.lua
··· 1 - local config = require("sense.config") 2 1 local log = require("sense.log") 3 - local statuscol = require("sense.ui.builtin.statuscol") 4 - local virtualtext = require("sense.ui.builtin.virtualtext") 5 - -- local virtual = require("sense.ui.virtual") 6 - 7 - local M = { 8 - ---@type sense.Indicator[] 9 - indicators = {}, 10 - ---@type table<integer, sense.Indicator[]> 11 - windows = {}, 12 - } 2 + local state = require("sense.state") 13 3 14 - if config.presets.virtualtext.enabled then 15 - table.insert(M.indicators, virtualtext.gen_virtualtext_top(virtualtext.render_diagnostic_top)) 16 - table.insert(M.indicators, virtualtext.gen_virtualtext_bot(virtualtext.render_diagnostic_bot)) 17 - end 18 - if config.presets.statuscolumn.enabled then 19 - table.insert(M.indicators, statuscol.gen_statuscol_top(statuscol.render_diagnostic_top)) 20 - table.insert(M.indicators, statuscol.gen_statuscol_bot(statuscol.render_diagnostic_bot)) 21 - end 4 + local M = {} 22 5 23 6 function M.attach(winid) 24 - M.windows[winid] = M.windows[winid] or {} 25 - if #M.windows[winid] > 0 then 7 + if #state.windows[winid].indicators > 0 then 26 8 return 27 9 end 28 - for _, i in ipairs(M.indicators) do 29 - table.insert(M.windows[winid], i:new(winid)) 10 + for _, i in ipairs(state.indicators) do 11 + table.insert(state.windows[winid].indicators, i:new(winid)) 30 12 end 31 - log.debug("attached to window:", M.windows) 13 + log.debug("attached to window:", state.windows) 32 14 end 33 15 34 16 function M.detach(winid) 35 - for _, i in ipairs(M.windows[winid]) do 17 + for _, i in ipairs(state.windows[winid].indicators) do 36 18 i:destroy() 37 19 end 38 - M.windows[winid] = nil 20 + state.windows[winid] = nil 39 21 end 40 22 41 23 function M.render(wininfo) 42 24 M.attach(wininfo.winid) 43 - for _, c in ipairs(M.windows[wininfo.winid]) do 25 + for _, c in ipairs(state.windows[wininfo.winid].indicators) do 44 26 c:render(wininfo) 45 27 end 46 28 end
+18 -2
plugin/sense.lua
··· 1 - local autocmds = require("sense.autocmds") 1 + if vim.g.loaded_sense_nvim then return end 2 + 3 + local api = require("sense.api") 4 + local config = require("sense.config") 2 5 local highlights = require("sense.highlights") 6 + local statuscol = require("sense.ui.builtin.statuscol") 7 + local virtualtext = require("sense.ui.builtin.virtualtext") 3 8 4 - autocmds.setup() 9 + api.clear_registered() 10 + if config.presets.virtualtext.enabled then 11 + api.register(virtualtext.gen_virtualtext_top(virtualtext.render_diagnostic_top)) 12 + api.register(virtualtext.gen_virtualtext_bot(virtualtext.render_diagnostic_bot)) 13 + end 14 + if config.presets.statuscolumn.enabled then 15 + api.register(statuscol.gen_statuscol_top(statuscol.render_diagnostic_top)) 16 + api.register(statuscol.gen_statuscol_bot(statuscol.render_diagnostic_bot)) 17 + end 18 + 5 19 highlights.setup() 20 + 21 + vim.g.loaded_sense_nvim = true
+1
spec/minimal_init.lua
··· 1 + vim.g.loaded_sense_nvim = nil 1 2 vim.opt.runtimepath:append(assert(vim.env.SENSE_NVIM_PLUGIN_DIR)) 2 3 vim.cmd("runtime! ftplugin.vim") 3 4 vim.cmd("runtime! ftdetect/*.{vim,lua}")
+6 -5
spec/ui/statuscol_spec.lua
··· 1 1 ---@module 'luassert' 2 2 3 - require("spec.minimal_init") 4 - local testutils = require("spec.testutils") 5 - 6 3 vim.g.sense_nvim = { 7 - indicators = { 4 + presets = { 8 5 virtualtext = { 9 6 enabled = false, 10 7 }, ··· 13 10 }, 14 11 }, 15 12 } 13 + 14 + require("spec.minimal_init") 15 + local testutils = require("spec.testutils") 16 16 17 17 local TEST_NS = vim.api.nvim_create_namespace("sense.test") 18 18 local diags = { ··· 48 48 vim.cmd("silent! wincmd o") 49 49 50 50 -- open new buffer and set diagnostics 51 - testutils.open_file("spec/example.go") 51 + testutils.open_file("spec/samples/error_at_top.go") 52 52 vim.diagnostic.set(TEST_NS, 0, diags) 53 53 end) 54 54 it("assert vim window size", function() ··· 63 63 testutils.emulate_missing_events("WinScrolled", { 64 64 match = vim.api.nvim_get_current_win(), 65 65 }) 66 + assert.same(1, #testutils.list_visible_float_wins()) 66 67 assert.same(2, #testutils.list_visible_wins()) 67 68 end) 68 69 it("split windows should work separately", function()
+1 -1
spec/ui/virtual_spec.lua
··· 49 49 vim.cmd("silent! wincmd o") 50 50 51 51 -- open new buffer and set diagnostics 52 - testutils.open_file("spec/example.go") 52 + testutils.open_file("spec/samples/error_at_top.go") 53 53 vim.diagnostic.set(TEST_NS, 0, diags) 54 54 end) 55 55 it("assert vim window size", function()