dotfiles/symlinks/config/nvim/plugin/ui.lua

86 lines
1.8 KiB
Lua

-- UI setup
local input = require("nui.input")
local event = require("nui.utils.autocmd").event
-- Notifications
local fidget = require("fidget")
fidget.setup()
vim.notify = fidget.notify
-- Inputs
local input_ui
vim.ui.input = function(opts, on_confirm)
if input_ui then
-- ensure single ui.input operation
vim.notify("busy: another input is pending!", vim.log.levels.WARN)
return
end
local function on_done(value)
if input_ui then
-- if it's still mounted, unmount it
input_ui:unmount()
end
-- pass the input value
on_confirm(value)
-- indicate the operation is done
input_ui = nil
end
local border_top_text = opts.prompt or "[Input]"
local default_value = opts.default
input_ui = input({
relative = "cursor",
position = {
row = 1,
col = 0,
},
size = {
-- minimum width 20
width = math.max(20, type(default_value) == "string" and #default_value or 0),
},
border = {
style = "rounded",
highlight = "Normal",
text = {
top = border_top_text,
top_align = "left",
},
},
win_options = {
winhighlight = "Normal:Normal",
},
}, {
default_value = default_value,
on_close = function()
on_done(nil)
end,
on_submit = function(value)
on_done(value)
end,
})
input_ui:mount()
-- cancel operation if cursor leaves input
input_ui:on(event.BufLeave, function()
on_done(nil)
end, { once = true })
-- cancel operation if <Esc> is pressed
input_ui:map("n", "<Esc>", function()
on_done(nil)
end, { noremap = true, nowait = true })
end
-- Selections
-- Using telescope for select UI
-- Terminal
vim.api.nvim_create_user_command("BottomTerminal", function()
require("esensar.ui").new_bottom_split({})
vim.fn.termopen(os.getenv("SHELL"))
end, { desc = "Open a terminal buffer at the bottom of the editor" })