137 lines
3.8 KiB
Lua
137 lines
3.8 KiB
Lua
local M = {}
|
|
|
|
---@param bufnr? integer Default is 0 (current buffer)
|
|
---@return string|nil
|
|
function M.get_project_root(bufnr)
|
|
bufnr = bufnr or 0
|
|
local root_markers = {
|
|
".git",
|
|
"pyproject.toml",
|
|
"setup.py",
|
|
"Makefile",
|
|
"CMakeLists",
|
|
"Cargo.toml",
|
|
}
|
|
return vim.fs.root(bufnr, root_markers) or vim.uv.cwd()
|
|
end
|
|
---
|
|
---@param cmd table
|
|
---@return integer, integer?
|
|
function M.terminal(cmd, opts)
|
|
opts = opts or {}
|
|
local buf, win
|
|
if opts.mode.type == "float" then
|
|
local ui = vim.api.nvim_list_uis()[1]
|
|
|
|
local dim = {
|
|
width = math.max(
|
|
1,
|
|
math.floor(ui.width * 0.9)
|
|
- opts.mode.win.float.padding.left
|
|
- opts.mode.win.float.padding.right
|
|
),
|
|
height = math.max(
|
|
1,
|
|
math.floor(ui.height * 0.9)
|
|
- opts.mode.win.float.padding.top
|
|
- opts.mode.win.float.padding.bottom
|
|
),
|
|
}
|
|
|
|
local pos = {
|
|
row = math.floor(
|
|
(
|
|
ui.height
|
|
- (vim.o.laststatus == 3 and 1 or 0)
|
|
- vim.o.cmdheight
|
|
- dim.height
|
|
) / 2
|
|
),
|
|
col = math.floor((ui.width - dim.width) / 2),
|
|
}
|
|
|
|
buf = vim.api.nvim_create_buf(false, true)
|
|
win = vim.api.nvim_open_win(buf, true, {
|
|
relative = "editor",
|
|
width = dim.width,
|
|
height = dim.height,
|
|
row = pos.row,
|
|
col = pos.col,
|
|
style = "minimal",
|
|
border = opts.mode.win.float.border.enabled
|
|
and opts.mode.win.float.border.type
|
|
or nil,
|
|
})
|
|
end
|
|
if opts.mode.type == "split" then
|
|
if opts.mode.win.split.type == "vertical" then
|
|
if opts.mode.win.split.anchor == "right" then
|
|
vim.cmd("set splitright")
|
|
end
|
|
vim.cmd(opts.mode.win.split.size .. " vsplit")
|
|
end
|
|
if opts.mode.win.split.type == "horizontal" then
|
|
if opts.mode.win.split.anchor == "bottom" then
|
|
vim.cmd("set splitbelow")
|
|
end
|
|
vim.cmd(opts.mode.win.split.size .. " split")
|
|
end
|
|
|
|
buf = vim.api.nvim_create_buf(false, true)
|
|
win = vim.api.nvim_get_current_win()
|
|
|
|
vim.api.nvim_win_set_buf(0, buf)
|
|
end
|
|
vim.fn.jobstart(table.concat(cmd, "/"), { term = true })
|
|
vim.api.nvim_buf_set_keymap(
|
|
buf,
|
|
"n",
|
|
"<ESC>",
|
|
"i<C-\\><C-n>:q<CR>",
|
|
{ noremap = true, silent = true }
|
|
)
|
|
return buf, win
|
|
end
|
|
|
|
return M
|
|
|
|
-- M.opts = {}
|
|
--
|
|
-- function M.setup(opts)
|
|
-- M.opts = vim.tbl_deep_extend("force", {}, require("Polydev.configs").get("terminal"), opts or {})
|
|
-- end
|
|
--
|
|
-- function M.exists(path)
|
|
-- return (io.open(path, "r") ~= nil)
|
|
-- end
|
|
--
|
|
--
|
|
-- ---@return string
|
|
-- function M.get_project_name()
|
|
-- return vim.fn.fnamemodify(M.get_project_root(), ":t")
|
|
-- end
|
|
--
|
|
-- ---@param path_segments table
|
|
-- ---@param content string
|
|
-- function M.write_file(path_segments, content)
|
|
-- local path = table.concat(path_segments, "/")
|
|
-- local file = assert(io.open(path, "w"), "Error creating file: " .. path)
|
|
-- file:write(content)
|
|
-- file:close()
|
|
-- vim.cmd("edit " .. path)
|
|
-- end
|
|
--
|
|
-- ---@param path string
|
|
-- ---@param gitignore_lines table
|
|
-- function M.init_git(path, gitignore_lines)
|
|
-- vim.fn.mkdir(path, "p")
|
|
-- vim.fn.system({ "git", "-C", path, "init" })
|
|
--
|
|
-- if gitignore_lines and #gitignore_lines > 0 then
|
|
-- local contents = table.concat(gitignore_lines, "\n")
|
|
-- M.write_file({ path, ".gitignore" }, contents)
|
|
-- end
|
|
-- end
|
|
----
|
|
-- return M
|