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", "", "i:q", { 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