From 91e69efe031bdd66c0ba20aa0c3f41b549dec05c Mon Sep 17 00:00:00 2001 From: DarthMooMancer <107283522+DarthMooMancer@users.noreply.github.com> Date: Thu, 13 Mar 2025 23:44:58 -0400 Subject: [PATCH] Update init.lua for automatically loading language based on filetype --- lua/Polydev/c.lua | 244 +++++++++++++-------------- lua/Polydev/init.lua | 29 +++- lua/Polydev/java.lua | 382 +++++++++++++++++++++---------------------- 3 files changed, 338 insertions(+), 317 deletions(-) diff --git a/lua/Polydev/c.lua b/lua/Polydev/c.lua index b4f580e..07964cd 100644 --- a/lua/Polydev/c.lua +++ b/lua/Polydev/c.lua @@ -7,111 +7,111 @@ M.new_c_header_file = nil M.new_c_project = nil M.config = { - project_root = "~/Projects/C", - keybinds = { - [""] = "CloseTerminal", - ["cb"] = "CBuild", - ["cr"] = "CRun", - ["cnf"] = "NewCFile", - ["cnp"] = "NewCProject", - ["cnh"] = "NewCHeaderFile", - }, - terminal = { - right_padding = 0, - bottom_padding = 0, - left_padding = 0, - top_padding = 0, - border = true, - number = true, - relativenumber = true, - scroll = true, - } + project_root = "~/Projects/C", + keybinds = { + [""] = "CloseTerminal", + ["cb"] = "CBuild", + ["cr"] = "CRun", + ["cnf"] = "NewCFile", + ["cnp"] = "NewCProject", + ["cnh"] = "NewCHeaderFile", + }, + terminal = { + right_padding = 0, + bottom_padding = 0, + left_padding = 0, + top_padding = 0, + border = true, + number = true, + relativenumber = true, + scroll = true, + } } function M.setup(opts) - M.config = vim.tbl_deep_extend("force", M.config, opts or {}) - for key, command in pairs(M.config.keybinds) do - if command == "CloseTerminal" then M.close_key = key end - if command == "CBuild" then M.c_build = key end - if command == "CRun" then M.c_run = key end - if command == "NewCFile" then M.new_c_file = key end - if command == "NewCProject" then M.new_c_project = key end - if command == "NewCHeaderFile" then M.new_c_header_file = key end - end + M.config = vim.tbl_deep_extend("force", M.config, opts or {}) + for key, command in pairs(M.config.keybinds) do + if command == "CloseTerminal" then M.close_key = key end + if command == "CBuild" then M.c_build = key end + if command == "CRun" then M.c_run = key end + if command == "NewCFile" then M.new_c_file = key end + if command == "NewCProject" then M.new_c_project = key end + if command == "NewCHeaderFile" then M.new_c_header_file = key end + end - vim.api.nvim_create_user_command("NewCProject", M.create_project, {}) - vim.api.nvim_create_user_command("NewCHeaderFile", M.create_new_header_file, {}) - vim.api.nvim_create_user_command("NewCFile", M.create_new_file, {}) - vim.api.nvim_create_user_command("CBuild", M.build, {}) - vim.api.nvim_create_user_command("CRun", M.run, {}) + vim.api.nvim_create_user_command("NewCProject", M.create_project, {}) + vim.api.nvim_create_user_command("NewCHeaderFile", M.create_new_header_file, {}) + vim.api.nvim_create_user_command("NewCFile", M.create_new_file, {}) + vim.api.nvim_create_user_command("CBuild", M.build, {}) + vim.api.nvim_create_user_command("CRun", M.run, {}) - vim.keymap.set("n", M.c_build, ":CBuild", { silent = true }) - vim.keymap.set("n", M.c_run, ":CRun", { silent = true }) - vim.keymap.set("n", M.new_c_file, ":NewCFile", { silent = true }) - vim.keymap.set("n", M.new_c_project, ":NewCProject", { silent = true }) - vim.keymap.set("n", M.new_c_header_file, ":NewCHeaderFile", { silent = true }) + vim.keymap.set("n", M.c_build, ":CBuild", { silent = true }) + vim.keymap.set("n", M.c_run, ":CRun", { silent = true }) + vim.keymap.set("n", M.new_c_file, ":NewCFile", { silent = true }) + vim.keymap.set("n", M.new_c_project, ":NewCProject", { silent = true }) + vim.keymap.set("n", M.new_c_header_file, ":NewCHeaderFile", { silent = true }) end function M.open_float_terminal(cmd) - local ui = vim.api.nvim_list_uis()[1] - local term_cfg = M.config.terminal + local ui = vim.api.nvim_list_uis()[1] + local term_cfg = M.config.terminal - local width = math.max(1, math.floor(ui.width * 0.9) - term_cfg.left_padding - term_cfg.right_padding) - local height = math.max(1, math.floor(ui.height * 0.9) - term_cfg.top_padding - (term_cfg.bottom_padding + 1)) - local row = math.max(1, math.floor((ui.height - height) / 2) + term_cfg.top_padding) - local col = math.max(1, math.floor((ui.width - width) / 2) + term_cfg.left_padding) + local width = math.max(1, math.floor(ui.width * 0.9) - term_cfg.left_padding - term_cfg.right_padding) + local height = math.max(1, math.floor(ui.height * 0.9) - term_cfg.top_padding - (term_cfg.bottom_padding + 1)) + local row = math.max(1, math.floor((ui.height - height) / 2) + term_cfg.top_padding) + local col = math.max(1, math.floor((ui.width - width) / 2) + term_cfg.left_padding) - local buf = vim.api.nvim_create_buf(false, true) - local win = vim.api.nvim_open_win(buf, true, { - relative = "editor", - width = width, - height = height, - row = row, - col = col, - style = "minimal", - border = term_cfg.border and "rounded" or "none", - }) + local buf = vim.api.nvim_create_buf(false, true) + local win = vim.api.nvim_open_win(buf, true, { + relative = "editor", + width = width, + height = height, + row = row, + col = col, + style = "minimal", + border = term_cfg.border and "rounded" or "none", + }) - vim.api.nvim_win_set_option(win, "winblend", vim.o.pumblend) - vim.api.nvim_win_set_option(win, "winhighlight", "Normal:Pmenu,FloatBorder:Pmenu") - vim.api.nvim_win_set_option(win, "cursorline", true) - if(term_cfg.number == true) then - vim.api.nvim_win_set_option(win, "number", true) - if(term_cfg.relativenumber == true) then - vim.api.nvim_win_set_option(win, "relativenumber", true) + vim.api.nvim_win_set_option(win, "winblend", vim.o.pumblend) + vim.api.nvim_win_set_option(win, "winhighlight", "Normal:Pmenu,FloatBorder:Pmenu") + vim.api.nvim_win_set_option(win, "cursorline", true) + if(term_cfg.number == true) then + vim.api.nvim_win_set_option(win, "number", true) + if(term_cfg.relativenumber == true) then + vim.api.nvim_win_set_option(win, "relativenumber", true) + end + end + if(term_cfg.scroll == true) then + vim.api.nvim_win_set_option(win, "scrolloff", 5) end - end - if(term_cfg.scroll == true) then - vim.api.nvim_win_set_option(win, "scrolloff", 5) - end - vim.fn.termopen(cmd) - vim.api.nvim_buf_set_keymap(buf, "n", M.close_key, "i:q", { noremap = true, silent = true }) - return buf, win + vim.fn.termopen(cmd) + vim.api.nvim_buf_set_keymap(buf, "n", M.close_key, "i:q", { noremap = true, silent = true }) + return buf, win end local function write_file(path, content) - local file = assert(io.open(path, "w"), "Error creating file: " .. path) - file:write(content) - file:close() - vim.cmd("edit " .. path) - print(path .. " created successfully!") + local file = assert(io.open(path, "w"), "Error creating file: " .. path) + file:write(content) + file:close() + vim.cmd("edit " .. path) + print(path .. " created successfully!") end function M.create_project() - vim.ui.input({ prompt = "Enter project name: " }, function(project_name) - if not project_name or project_name == "" then - print("Project creation canceled.") - return - end + vim.ui.input({ prompt = "Enter project name: " }, function(project_name) + if not project_name or project_name == "" then + print("Project creation canceled.") + return + end - local project_root = vim.fn.expand(M.config.project_root) .. "/" .. project_name - for _, path in ipairs({ "/src", "/build", "/include" }) do - vim.fn.mkdir(project_root .. path, "p") - end + local project_root = vim.fn.expand(M.config.project_root) .. "/" .. project_name + for _, path in ipairs({ "/src", "/build", "/include" }) do + vim.fn.mkdir(project_root .. path, "p") + end - write_file(project_root .. "/build/" .. project_name .. ".polydev", project_name) - write_file(project_root .. "/src/main.c", [[ + write_file(project_root .. "/build/" .. project_name .. ".polydev", project_name) + write_file(project_root .. "/src/main.c", [[ #include int main() { @@ -120,7 +120,7 @@ int main() { } ]]) - write_file(project_root .. "/CMakeLists.txt", string.format([[ + write_file(project_root .. "/CMakeLists.txt", string.format([[ cmake_minimum_required(VERSION 3.10) project(%s C) set(CMAKE_C_STANDARD 11) @@ -130,26 +130,26 @@ set(SOURCES src/main.c) add_executable(%s ${SOURCES}) ]], project_name, project_name)) - vim.cmd("edit " .. project_root .. "/src/main.c") - end) + vim.cmd("edit " .. project_root .. "/src/main.c") + end) end function M.create_new_file() - vim.ui.input({ prompt = "Enter file name: " }, function(class_name) - if not class_name or class_name == "" then return print("File creation canceled.") end - local root_dir = M.get_project_root() - if not root_dir then return print("Error: Project root not found.") end - write_file(root_dir .. "/src/" .. class_name .. ".c", "") - end) + vim.ui.input({ prompt = "Enter file name: " }, function(class_name) + if not class_name or class_name == "" then return print("File creation canceled.") end + local root_dir = M.get_project_root() + if not root_dir then return print("Error: Project root not found.") end + write_file(root_dir .. "/src/" .. class_name .. ".c", "") + end) end function M.create_new_header_file() - vim.ui.input({ prompt = "Enter header file name: " }, function(header_name) - if not header_name then return print("Header file creation canceled.") end - local root_dir = M.get_project_root() - if not root_dir then return print("Error: Project root not found.") end - local guard_macro = header_name:upper():gsub("[^A-Z0-9]", "_") .. "_H" - local content = string.format([[ + vim.ui.input({ prompt = "Enter header file name: " }, function(header_name) + if not header_name then return print("Header file creation canceled.") end + local root_dir = M.get_project_root() + if not root_dir then return print("Error: Project root not found.") end + local guard_macro = header_name:upper():gsub("[^A-Z0-9]", "_") .. "_H" + local content = string.format([[ #ifndef %s #define %s @@ -160,39 +160,39 @@ void example_function(); #endif // %s ]], guard_macro, guard_macro, guard_macro) - write_file(root_dir .. "/include/" .. header_name .. ".h", content) - end) + write_file(root_dir .. "/include/" .. header_name .. ".h", content) + end) end function M.get_project_root() - local dir = vim.fn.expand("%:p:h") - while dir ~= "/" do - if vim.fn.isdirectory(dir .. "/src") == 1 or vim.fn.filereadable(dir .. "/CMakeLists.txt") == 1 then - return dir + local dir = vim.fn.expand("%:p:h") + while dir ~= "/" do + if vim.fn.isdirectory(dir .. "/src") == 1 or vim.fn.filereadable(dir .. "/CMakeLists.txt") == 1 then + return dir + end + dir = vim.fn.fnamemodify(dir, ":h") end - dir = vim.fn.fnamemodify(dir, ":h") - end end function M.build() - local root = M.get_project_root() - if not root then return print("Error: Project root not found.") end - local cmd = "cd " .. root .. "/build && cmake .. && make" - local term_buf = M.open_float_terminal(cmd) - vim.api.nvim_buf_set_option(term_buf, "modifiable", true) - local output = vim.fn.system(cmd) - local success = vim.v.shell_error == 0 - vim.api.nvim_buf_set_lines(term_buf, 0, -1, false, vim.list_extend({ success and "Compilation successful!" or "Error during compilation:" }, vim.split(output, "\n", { trimempty = true }))) - vim.api.nvim_buf_set_option(term_buf, "modifiable", false) + local root = M.get_project_root() + if not root then return print("Error: Project root not found.") end + local cmd = "cd " .. root .. "/build && cmake .. && make" + local term_buf = M.open_float_terminal(cmd) + vim.api.nvim_buf_set_option(term_buf, "modifiable", true) + local output = vim.fn.system(cmd) + local success = vim.v.shell_error == 0 + vim.api.nvim_buf_set_lines(term_buf, 0, -1, false, vim.list_extend({ success and "Compilation successful!" or "Error during compilation:" }, vim.split(output, "\n", { trimempty = true }))) + vim.api.nvim_buf_set_option(term_buf, "modifiable", false) end function M.run() - local root = M.get_project_root() - if not root then return print("Error: Project root not found.") end - local build_dir = root .. "/build" - local files = vim.fn.glob(build_dir .. "/*.polydev", true, true) - if #files == 0 then return print("Error: No .polydev file found in build directory.") end - M.open_float_terminal("cd " .. build_dir .. " && ./" .. files[1]:match("([^/]+)%.polydev$")) + local root = M.get_project_root() + if not root then return print("Error: Project root not found.") end + local build_dir = root .. "/build" + local files = vim.fn.glob(build_dir .. "/*.polydev", true, true) + if #files == 0 then return print("Error: No .polydev file found in build directory.") end + M.open_float_terminal("cd " .. build_dir .. " && ./" .. files[1]:match("([^/]+)%.polydev$")) end return M diff --git a/lua/Polydev/init.lua b/lua/Polydev/init.lua index 3290e5b..7da84d5 100644 --- a/lua/Polydev/init.lua +++ b/lua/Polydev/init.lua @@ -1,8 +1,29 @@ --- init.lua local M = {} -M.java = require("Polydev.java") -M.c = require("Polydev.c") +-- Store loaded language modules +M.loaded_languages = {} + +-- Function to load the appropriate language module +function M.load_language_module() + local filetype = vim.bo.filetype + if M.loaded_languages[filetype] then return end -- Prevent redundant loading + + local ok, lang_module = pcall(require, "Polydev." .. filetype) + if ok and lang_module.setup then + lang_module.setup() + M.loaded_languages[filetype] = true + end +end + +-- Setup function to initialize the plugin +function M.setup() + -- Auto-load the correct module when opening a file + vim.api.nvim_create_autocmd("FileType", { + pattern = "*", + callback = function() + M.load_language_module() + end, + }) +end return M - diff --git a/lua/Polydev/java.lua b/lua/Polydev/java.lua index 4220e08..47a73a1 100644 --- a/lua/Polydev/java.lua +++ b/lua/Polydev/java.lua @@ -7,260 +7,260 @@ M.new_java_project = nil -- Default config M.config = { - project_root = "~/Projects/Java", - keybinds = { - [""] = "CloseTerminal", - ["jb"] = "JavaBuild", - ["jr"] = "JavaRun", - ["jnf"] = "NewJavaFile", - ["jnp"] = "NewJavaProject", - }, - terminal = { - right_padding = 0, - bottom_padding = 0, - left_padding = 0, - top_padding = 0, - border = true, - number = true, - relativenumber = true, - scroll = true, - } + project_root = "~/Projects/Java", + keybinds = { + [""] = "CloseTerminal", + ["jb"] = "JavaBuild", + ["jr"] = "JavaRun", + ["jnf"] = "NewJavaFile", + ["jnp"] = "NewJavaProject", + }, + terminal = { + right_padding = 0, + bottom_padding = 0, + left_padding = 0, + top_padding = 0, + border = true, + number = true, + relativenumber = true, + scroll = true, + } } function M.setup(opts) - M.config = vim.tbl_deep_extend("force", M.config, opts or {}) + M.config = vim.tbl_deep_extend("force", M.config, opts or {}) - -- Apply keybindings manually - for key, command in pairs(M.config.keybinds) do - if command == "CloseTerminal" then - M.close_key = key + -- Apply keybindings manually + for key, command in pairs(M.config.keybinds) do + if command == "CloseTerminal" then + M.close_key = key + end + if command == "JavaBuild" then + M.java_build = key + end + if command == "JavaRun" then + M.java_run = key + end + if command == "NewJavaFile" then + M.new_java_file = key + end + if command == "NewJavaProject" then + M.new_java_project = key + end end - if command == "JavaBuild" then - M.java_build = key - end - if command == "JavaRun" then - M.java_run = key - end - if command == "NewJavaFile" then - M.new_java_file = key - end - if command == "NewJavaProject" then - M.new_java_project = key - end - end - -- Register Keybinds - vim.keymap.set("n", M.java_build, ":JavaBuild", { silent = true }) - vim.keymap.set("n", M.java_run, ":JavaRun", { silent = true }) - vim.keymap.set("n", M.new_java_file, ":NewJavaFile", { silent = true }) - vim.keymap.set("n", M.new_java_project, ":NewJavaProject", { silent = true }) + -- Register Keybinds + vim.keymap.set("n", M.java_build, ":JavaBuild", { silent = true }) + vim.keymap.set("n", M.java_run, ":JavaRun", { silent = true }) + vim.keymap.set("n", M.new_java_file, ":NewJavaFile", { silent = true }) + vim.keymap.set("n", M.new_java_project, ":NewJavaProject", { silent = true }) - -- Register user commands - vim.api.nvim_create_user_command("NewJavaProject", M.create_project, {}) - vim.api.nvim_create_user_command("NewJavaFile", M.create_new_file, {}) - vim.api.nvim_create_user_command("JavaBuild", M.build, {}) - vim.api.nvim_create_user_command("JavaRun", M.run, {}) - vim.api.nvim_create_user_command("Migrate", M.migrate, {}) + -- Register user commands + vim.api.nvim_create_user_command("NewJavaProject", M.create_project, {}) + vim.api.nvim_create_user_command("NewJavaFile", M.create_new_file, {}) + vim.api.nvim_create_user_command("JavaBuild", M.build, {}) + vim.api.nvim_create_user_command("JavaRun", M.run, {}) + vim.api.nvim_create_user_command("Migrate", M.migrate, {}) end -- Open floating terminal function M.open_float_terminal(cmd) - local ui = vim.api.nvim_list_uis()[1] - local term_cfg = M.config.terminal + local ui = vim.api.nvim_list_uis()[1] + local term_cfg = M.config.terminal - -- Default window size (90% of the editor) - local default_width = math.floor(ui.width * 0.9) - local default_height = math.floor(ui.height * 0.9) + -- Default window size (90% of the editor) + local default_width = math.floor(ui.width * 0.9) + local default_height = math.floor(ui.height * 0.9) - -- Default centered position - local default_row = math.floor((ui.height - default_height) / 2) - local default_col = math.floor((ui.width - default_width) / 2) + -- Default centered position + local default_row = math.floor((ui.height - default_height) / 2) + local default_col = math.floor((ui.width - default_width) / 2) - -- Adjust size based on padding - local width = default_width - term_cfg.left_padding - term_cfg.right_padding - local height = default_height - term_cfg.top_padding - (term_cfg.bottom_padding + 1) + -- Adjust size based on padding + local width = default_width - term_cfg.left_padding - term_cfg.right_padding + local height = default_height - term_cfg.top_padding - (term_cfg.bottom_padding + 1) - -- Adjust position based on padding - local row = default_row + term_cfg.top_padding - local col = default_col + term_cfg.left_padding + -- Adjust position based on padding + local row = default_row + term_cfg.top_padding + local col = default_col + term_cfg.left_padding - -- Ensure window size doesn't go negative - width = math.max(1, width) - height = math.max(1, height) - -- Ensure position doesn't move off-screen - row = math.max(0, row) - col = math.max(0, col) + -- Ensure window size doesn't go negative + width = math.max(1, width) + height = math.max(1, height) + -- Ensure position doesn't move off-screen + row = math.max(0, row) + col = math.max(0, col) - -- Create buffer and window - local buf = vim.api.nvim_create_buf(false, true) - local win = vim.api.nvim_open_win(buf, true, { - relative = "editor", - width = width, - height = height, - row = row, - col = col, - style = "minimal", - border = term_cfg.border and "rounded" or "none", - }) + -- Create buffer and window + local buf = vim.api.nvim_create_buf(false, true) + local win = vim.api.nvim_open_win(buf, true, { + relative = "editor", + width = width, + height = height, + row = row, + col = col, + style = "minimal", + border = term_cfg.border and "rounded" or "none", + }) - -- Enable scrolling, relative line numbers, and prevent closing on click - vim.api.nvim_win_set_option(win, "winblend", vim.o.pumblend) - vim.api.nvim_win_set_option(win, "winhighlight", "Normal:Pmenu,FloatBorder:Pmenu") - if(M.config.terminal.number == true) then - vim.api.nvim_win_set_option(win, "number", true) - end - if(M.config.terminal.number == true and M.config.terminal.relativenumber == true) then - vim.api.nvim_win_set_option(win, "relativenumber", true) - end - if(M.config.terminal.scroll == true) then - vim.api.nvim_win_set_option(win, "scrolloff", 5) - end - vim.api.nvim_win_set_option(win, "cursorline", true) + -- Enable scrolling, relative line numbers, and prevent closing on click + vim.api.nvim_win_set_option(win, "winblend", vim.o.pumblend) + vim.api.nvim_win_set_option(win, "winhighlight", "Normal:Pmenu,FloatBorder:Pmenu") + if(M.config.terminal.number == true) then + vim.api.nvim_win_set_option(win, "number", true) + end + if(M.config.terminal.number == true and M.config.terminal.relativenumber == true) then + vim.api.nvim_win_set_option(win, "relativenumber", true) + end + if(M.config.terminal.scroll == true) then + vim.api.nvim_win_set_option(win, "scrolloff", 5) + end + vim.api.nvim_win_set_option(win, "cursorline", true) - vim.fn.termopen(cmd) + vim.fn.termopen(cmd) - vim.api.nvim_buf_set_keymap(buf, "n", M.close_key, "i:q", { noremap = true, silent = true }) - return buf, win + vim.api.nvim_buf_set_keymap(buf, "n", M.close_key, "i:q", { noremap = true, silent = true }) + return buf, win end -- Migrate old folder to new method function M.migrate() - vim.ui.input({ prompt = "Enter project name to migrate: "}, function(project_name) - if not project_name or project_name == "" then - print("Migration failed") - return - end - local project_root = vim.fn.expand(M.config.project_root) .. "/" .. project_name - local legacy_src_dir = project_root .. "/root/src" - local legacy_out_dir = project_root .. "/root/out" - local src_dir = project_root .. "/src" - local build_dir = project_root .. "/build" + vim.ui.input({ prompt = "Enter project name to migrate: "}, function(project_name) + if not project_name or project_name == "" then + print("Migration failed") + return + end + local project_root = vim.fn.expand(M.config.project_root) .. "/" .. project_name + local legacy_src_dir = project_root .. "/root/src" + local legacy_out_dir = project_root .. "/root/out" + local src_dir = project_root .. "/src" + local build_dir = project_root .. "/build" - vim.fn.mkdir(src_dir, "p") - vim.fn.mkdir(build_dir, "p") + vim.fn.mkdir(src_dir, "p") + vim.fn.mkdir(build_dir, "p") - local compile_command = "mv " .. legacy_src_dir .. "/* " .. src_dir .. - " && mv " .. legacy_out_dir .. "/* " .. build_dir .. - " && rm -rd " .. project_root .. "/" .. "root/" - local compile_status = vim.fn.system(compile_command) + local compile_command = "mv " .. legacy_src_dir .. "/* " .. src_dir .. + " && mv " .. legacy_out_dir .. "/* " .. build_dir .. + " && rm -rd " .. project_root .. "/" .. "root/" + local compile_status = vim.fn.system(compile_command) - if vim.v.shell_error ~= 0 then - print("Error during migration:\n" .. compile_status) - else - print("Migration successful!") - end - end) + if vim.v.shell_error ~= 0 then + print("Error during migration:\n" .. compile_status) + else + print("Migration successful!") + end + end) end -- Create a new Java project function M.create_project() - -- Use vim.ui.input for better handling of input - vim.ui.input({ prompt = "Enter project name: " }, function(project_name) - if not project_name or project_name == "" then - print("Project creation canceled.") - return - end + -- Use vim.ui.input for better handling of input + vim.ui.input({ prompt = "Enter project name: " }, function(project_name) + if not project_name or project_name == "" then + print("Project creation canceled.") + return + end - -- Paths for the project - local project_root = vim.fn.expand(M.config.project_root) .. "/" .. project_name - local src_dir = project_root .. "/src" - local build_dir = project_root .. "/build" + -- Paths for the project + local project_root = vim.fn.expand(M.config.project_root) .. "/" .. project_name + local src_dir = project_root .. "/src" + local build_dir = project_root .. "/build" - -- Create directories - vim.fn.mkdir(src_dir, "p") - vim.fn.mkdir(build_dir, "p") + -- Create directories + vim.fn.mkdir(src_dir, "p") + vim.fn.mkdir(build_dir, "p") - -- Write the Main.java file - local main_java_path = src_dir .. "/Main.java" - local main_java_content = [[ + -- Write the Main.java file + local main_java_path = src_dir .. "/Main.java" + local main_java_content = [[ public class Main { public static void main(String[] args) { - System.out.println("Hello, World!"); + System.out.println("Hello, World!"); } } ]] - -- Create the file and write content - local file = io.open(main_java_path, "w") - if file then - file:write(main_java_content) - file:close() - vim.cmd("edit " .. main_java_path) - print(" Project '" .. project_name .. "' created at " .. project_root) - else - print("Error creating Main.java") - end - end) + -- Create the file and write content + local file = io.open(main_java_path, "w") + if file then + file:write(main_java_content) + file:close() + vim.cmd("edit " .. main_java_path) + print(" Project '" .. project_name .. "' created at " .. project_root) + else + print("Error creating Main.java") + end + end) end -- Create a new Java file function M.create_new_file() - vim.ui.input({ prompt = "Enter class name: " }, function(class_name) - if not class_name or class_name == "" then - print("Class creation canceled.") - return - end + vim.ui.input({ prompt = "Enter class name: " }, function(class_name) + if not class_name or class_name == "" then + print("Class creation canceled.") + return + end - local current_dir = vim.fn.expand("%:p:h") - local root_dir = current_dir:match("(.*)/src") - if not root_dir then - print("Error: src directory not found.") - return - end + local current_dir = vim.fn.expand("%:p:h") + local root_dir = current_dir:match("(.*)/src") + if not root_dir then + print("Error: src directory not found.") + return + end - local java_file_path = root_dir .. "/src/" .. class_name .. ".java" - local java_content = string.format([[ + local java_file_path = root_dir .. "/src/" .. class_name .. ".java" + local java_content = string.format([[ public class %s { // New File } ]], class_name) - local file = io.open(java_file_path, "w") - if file then - file:write(java_content) - file:close() - vim.cmd("edit " .. java_file_path) - print( class_name .. ".java created successfully!") - else - print("Error creating " .. class_name .. ".java") - end - end) + local file = io.open(java_file_path, "w") + if file then + file:write(java_content) + file:close() + vim.cmd("edit " .. java_file_path) + print( class_name .. ".java created successfully!") + else + print("Error creating " .. class_name .. ".java") + end + end) end -- Compile Java files function M.build() - local current_dir = vim.fn.expand("%:p:h") - local project_root = current_dir:match("(.*)/src") - if not project_root then - print("Error: Must be inside the 'src' directory.") - return - end + local current_dir = vim.fn.expand("%:p:h") + local project_root = current_dir:match("(.*)/src") + if not project_root then + print("Error: Must be inside the 'src' directory.") + return + end - local src_dir = project_root .. "/src" - local out_dir = project_root .. "/build" + local src_dir = project_root .. "/src" + local out_dir = project_root .. "/build" - vim.fn.mkdir(out_dir, "p") - local compile_command = string.format("javac -d %s %s/*.java", out_dir, src_dir) - local compile_status = vim.fn.system(compile_command) + vim.fn.mkdir(out_dir, "p") + local compile_command = string.format("javac -d %s %s/*.java", out_dir, src_dir) + local compile_status = vim.fn.system(compile_command) - if vim.v.shell_error ~= 0 then - print("Error during compilation:\n" .. compile_status) - else - print("Compilation successful!") - end + if vim.v.shell_error ~= 0 then + print("Error during compilation:\n" .. compile_status) + else + print("Compilation successful!") + end end -- Run Java program in floating terminal function M.run() - local current_dir = vim.fn.expand("%:p:h") - local project_root = current_dir:match("(.*)/src") - if not project_root then - print("Error: Must be inside the 'src' directory.") - return - end + local current_dir = vim.fn.expand("%:p:h") + local project_root = current_dir:match("(.*)/src") + if not project_root then + print("Error: Must be inside the 'src' directory.") + return + end - local out_dir = project_root .. "/build" - M.open_float_terminal("java -cp " .. out_dir .. " Main") + local out_dir = project_root .. "/build" + M.open_float_terminal("java -cp " .. out_dir .. " Main") end return M