Skip to content

Commit

Permalink
feat: keep track of where messages are displayed
Browse files Browse the repository at this point in the history
  • Loading branch information
folke committed Oct 26, 2022
1 parent f674f03 commit 13097dc
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 11 deletions.
75 changes: 75 additions & 0 deletions lua/noice/message/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,81 @@ function Message:init(event, kind, content)
Message.super.init(self, content)
end

-- Returns the first buffer that has rendered the message
---@return buffer?
function Message:buf()
return self:bufs()[1]
end

function Message:bufs()
return vim.tbl_filter(function(buf)
return vim.api.nvim_buf_is_valid(buf) and self.on_buf(buf)
end, vim.api.nvim_list_bufs())
end

function Message:wins()
return vim.tbl_filter(function(win)
return vim.api.nvim_win_is_valid(win) and self:on_win(win)
end, vim.api.nvim_list_wins())
end

-- Returns the first window that displays the message
---@return window?
function Message:win()
return self:wins()[1]
end

function Message:focus()
local win = self:win()
if win then
vim.api.nvim_set_current_win(win)
-- switch to normal mode
vim.api.nvim_input("<esc>")
return true
end
end

function Message:on_remove()
for _, buf in ipairs(vim.api.nvim_list_bufs()) do
if self:on_buf(buf) then
vim.b[buf].messages = vim.tbl_filter(function(b)
return b ~= buf
end, vim.b[buf].messages)
end
end
end

function Message:on_win(win)
return self:on_buf(vim.api.nvim_win_get_buf(win))
end

function Message:on_buf(buf)
return vim.b[buf].messages and vim.tbl_contains(vim.b[buf].messages, self.id)
end

function Message:_add_buf(buf)
local bufs = vim.b[buf].messages or {}
table.insert(bufs, self.id)
vim.b[buf].messages = bufs
end

---@param bufnr number buffer number
---@param ns_id number namespace id
---@param linenr_start? number line number (1-indexed)
function Message:highlight(bufnr, ns_id, linenr_start)
self:_add_buf(bufnr)
return Message.super.highlight(self, bufnr, ns_id, linenr_start)
end

---@param bufnr number buffer number
---@param ns_id number namespace id
---@param linenr_start? number start line number (1-indexed)
---@param linenr_end? number end line number (1-indexed)
function Message:render(bufnr, ns_id, linenr_start, linenr_end)
self:_add_buf(bufnr)
return Message.super.render(self, bufnr, ns_id, linenr_start, linenr_end)
end

Message.is = Filter.is

return Message
1 change: 1 addition & 0 deletions lua/noice/message/manager.lua
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ function M.remove(message)
M._messages[message.id] = nil
next_tick()
end
message:on_remove()
end

---@param filter? NoiceFilter
Expand Down
5 changes: 0 additions & 5 deletions lua/noice/util/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,6 @@ function M.once(fn)
end
end

---@param message NoiceMessage
function M.buf_has_message(buf, message)
return vim.b[buf].messages and vim.tbl_contains(vim.b[buf].messages, message.id)
end

function M.tag(buf, tag)
local ft = vim.api.nvim_buf_get_option(buf, "filetype")

Expand Down
7 changes: 1 addition & 6 deletions lua/noice/view/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -215,25 +215,20 @@ function View:render(buf, opts)
end

vim.api.nvim_buf_clear_namespace(buf, Config.ns, linenr - 1, -1)
vim.b[buf].messages = {}

if not opts.highlight then
vim.api.nvim_buf_set_lines(buf, linenr - 1, -1, false, {})
end

local buf_messages = vim.b[buf].messages or {}

for _, m in ipairs(opts.messages or self._messages) do
if not vim.tbl_contains(buf_messages, m.id) then
table.insert(buf_messages, m.id)
end
if opts.highlight then
m:highlight(buf, Config.ns, linenr)
else
m:render(buf, Config.ns, linenr)
end
linenr = linenr + m:height()
end
vim.b[buf].messages = buf_messages
end

return View

0 comments on commit 13097dc

Please sign in to comment.