config/.config/nvim/lua/lazyvim/utils/term.lua

69 lines
1.9 KiB
Lua

local M = {}
State = {
floating = {
buf = -1,
win = -1
}
}
function M.create_floating_window(opts)
-- Set default options if not provided
opts = opts or {}
opts.width = opts.width or math.floor(vim.o.columns * 0.8) -- Default 80% of screen width
opts.height = opts.height or math.floor(vim.o.lines * 0.8) -- Default 80% of screen height
-- Create buffer
local buf = nil
if vim.api.nvim_buf_is_valid(opts.buf) then
buf = opts.buf
else
buf = vim.api.nvim_create_buf(false, true) -- no file, scratch buffer
end
-- Calculate center position
local row = math.floor((vim.o.lines - opts.height) / 2)
local col = math.floor((vim.o.columns - opts.width) / 2)
-- Floating window options
local win_opts = {
relative = "editor",
width = opts.width,
height = opts.height,
col = col,
row = row,
style = "minimal",
border = "rounded", -- You can use "none", "single", "double", or "rounded"
}
-- Create the floating window
local win = vim.api.nvim_open_win(buf, true, win_opts)
return { buf = buf, win = win }
end
-- Emable usage:
vim.api.nvim_create_user_command("FloatTerminal", function()
if not vim.api.nvim_win_is_valid(State.floating.win) then
State.floating = M.create_floating_window({ buf = State.floating.buf })
if vim.bo[State.floating.buf].buftype ~= "terminal" then
vim.cmd.term()
end
else
vim.api.nvim_win_hide(State.floating.win)
end
end, {})
function M.float_term(opts)
if not vim.api.nvim_win_is_valid(State.floating.win) then
State.floating = M.create_floating_window({ buf = State.floating.buf })
if vim.bo[State.floating.buf].buftype ~= "terminal" then
vim.cmd.term(opts)
end
else
vim.api.nvim_win_hide(State.floating.win)
end
end
return M