local api = vim.api
local ext = require('vim._extui.shared')
ext.msg = require('vim._extui.messages')
ext.cmd = require('vim._extui.cmdline')
local M = {}
local function ui_callback(event, ...)
local handler = ext.msg[event] or ext.cmd[event]
ext.check_targets()
handler(...)
if ext.cmd[event] or event == 'msg_showcmd' and select(1, ...)[1] then
api.nvim__redraw({
flush = handler ~= ext.cmd.cmdline_hide or nil,
cursor = handler == ext.cmd[event] and true or nil,
win = handler == ext.cmd[event] and ext.wins.cmd or nil,
})
end
end
local scheduled_ui_callback = vim.schedule_wrap(ui_callback)
function M.enable(opts)
vim.validate('opts', opts, 'table', true)
if opts.msg then
vim.validate('opts.msg.pos', opts.msg.pos, 'nil', true, 'nil: "pos" moved to opts.target')
vim.validate('opts.msg.box', opts.msg.box, 'nil', true, 'nil: "timeout" moved to opts.msg')
vim.validate('opts.msg.target', opts.msg.target, function(tar)
return tar == 'cmd' or tar == 'msg'
end, "'cmd'|'msg'")
end
ext.cfg = vim.tbl_deep_extend('keep', opts, ext.cfg)
if ext.cfg.enable == false then
for _, win in pairs(ext.wins) do
if api.nvim_win_is_valid(win) then
api.nvim_win_close(win, true)
end
end
for _, buf in pairs(ext.bufs) do
if api.nvim_buf_is_valid(buf) then
api.nvim_buf_delete(buf, {})
end
end
api.nvim_clear_autocmds({ group = ext.augroup })
vim.ui_detach(ext.ns)
return
end
vim.ui_attach(ext.ns, { ext_messages = true, set_cmdheight = false }, function(event, ...)
if not (ext.msg[event] or ext.cmd[event]) then
return
end
if vim.in_fast_event() then
scheduled_ui_callback(event, ...)
else
ui_callback(event, ...)
end
return true
end)
local function check_cmdheight(value)
ext.check_targets()
local cfg = { height = math.max(value, 1), hide = value == 0 }
api.nvim_win_set_config(ext.wins.cmd, cfg)
if value == 0 or ext.cmdheight == 0 then
ext.cfg.msg.target = value == 0 and 'msg' or 'cmd'
ext.msg.prev_msg = ''
end
ext.cmdheight = value
end
if vim.v.vim_did_enter == 0 then
vim.schedule(function()
check_cmdheight(vim.o.cmdheight)
end)
end
api.nvim_create_autocmd('OptionSet', {
group = ext.augroup,
pattern = { 'cmdheight' },
callback = function()
check_cmdheight(vim.v.option_new)
ext.msg.set_pos()
end,
desc = 'Set cmdline and message window dimensions for changed option values.',
})
api.nvim_create_autocmd({ 'VimResized', 'TabEnter' }, {
group = ext.augroup,
callback = function()
ext.msg.set_pos()
end,
desc = 'Set cmdline and message window dimensions after shell resize or tabpage change.',
})
api.nvim_create_autocmd('WinEnter', {
callback = function()
local win = api.nvim_get_current_win()
if vim.tbl_contains(ext.wins, win) and api.nvim_win_get_config(win).hide then
vim.cmd.wincmd('p')
end
end,
desc = 'Make sure hidden extui window is never current.',
})
end
return M