This commit is contained in:
DarthMooMancer
2025-09-04 21:07:31 -04:00
4 changed files with 191 additions and 174 deletions
+3 -5
View File
@@ -1,6 +1,6 @@
<h1 align="center">Polydev</h1> <h1 align="center">Polydev</h1>
<p align="center"><em>A multi-language project managing plugin for file creation, building, and running code—all within neovim. Whether you're coding in Java, Python, Lua, Rust, or more, Polydev provides seamless integration to boost your productivity inside Neovim.</em></p> <p align="center"><em>A multi-language project managing plugin for file creation, building, and running code—all within neovim. Whether you're coding in C/C++ Java, Python, Lua, Rust, and more, Polydev provides seamless integration to boost your productivity inside Neovim.</em></p>
<p align="center"> <p align="center">
<img src="https://img.shields.io/badge/Lua-1e90ff?style=for-the-badge&logo=lua&logoColor=white" /> <img src="https://img.shields.io/badge/Lua-1e90ff?style=for-the-badge&logo=lua&logoColor=white" />
@@ -10,9 +10,8 @@
<img src="https://img.shields.io/badge/Docs-Available-blue?style=for-the-badge&logo=readthedocs&logoColor=white" /> <img src="https://img.shields.io/badge/Docs-Available-blue?style=for-the-badge&logo=readthedocs&logoColor=white" />
</p> </p>
<p align="center">
<img src="https://github.com/user-attachments/assets/c8e84056-5080-4ec3-ba15-30be61faaf68" alt="Polydev Preview" width="720"/> https://github.com/user-attachments/assets/39d406e7-19cc-4040-823f-0a5c30dec714
</p>
## Features ## Features
@@ -26,7 +25,6 @@
> 📚 [View the full documentation](https://darthmoomancer.github.io/Polydev/) for setup, configuration, and usage details. > 📚 [View the full documentation](https://darthmoomancer.github.io/Polydev/) for setup, configuration, and usage details.
## Supported Languages ## Supported Languages
Polydev currently supports the following languages: Polydev currently supports the following languages:
+152 -149
View File
@@ -8,187 +8,190 @@ local loaded_languages = {}
---@param opts? table ---@param opts? table
---@return boolean ---@return boolean
function M.load_language_module(lang, opts) function M.load_language_module(lang, opts)
if loaded_languages[lang] then return true end if loaded_languages[lang] then return true end
local ok, mod = pcall(require, "Polydev.languages") local ok, mod = pcall(require, "Polydev.languages")
if not ok or type(mod.languages) ~= "table" then return false end if not ok or type(mod.languages) ~= "table" then return false end
local lang_mod = mod.languages[lang] local lang_mod = mod.languages[lang]
if type(lang_mod) ~= "table" or type(lang_mod.setup) ~= "function" then return false end if type(lang_mod) ~= "table" or type(lang_mod.setup) ~= "function" then return false end
lang_mod:setup(opts and opts[lang] or {}) lang_mod:setup(opts and opts[lang] or {})
loaded_languages[lang] = lang_mod loaded_languages[lang] = lang_mod
return true return true
end end
M.languages = { M.languages = {
java = { java = {
setup = function (self, user_opts) setup = function (self, user_opts)
local opts = vim.tbl_deep_extend("force", {}, configs.get("java"), user_opts or {}) local opts = vim.tbl_deep_extend("force", {}, configs.get("java"), user_opts or {})
vim.api.nvim_create_user_command("JavaRun", function() self:run() end, {}) vim.api.nvim_create_user_command("JavaRun", function() self:run() end, {})
for key, _ in pairs(opts.keybinds) do for key, _ in pairs(opts.keybinds) do
vim.keymap.set("n", key, ":JavaRun<CR>", { silent = true }) vim.keymap.set("n", key, ":JavaRun<CR>", { silent = true })
end end
end, end,
run = function () run = function ()
local root = utils.get_project_root() local root = utils.get_project_root()
local cmd = string.format("javac -d %s %s", root .. "/build", root .. "/src/*.java") local cmd = string.format("javac -d %s %s", root .. "/build", root .. "/src/*.java")
local output = vim.fn.system(cmd) local output = vim.fn.system(cmd)
if not vim.v.shell_error == 0 then if not vim.v.shell_error == 0 then
local term_buf = utils.terminal({ cmd }) local term_buf = utils.terminal({ cmd })
vim.api.nvim_set_option_value("modifiable", true, { win = term_buf }) vim.api.nvim_set_option_value("modifiable", true, { win = term_buf })
vim.api.nvim_buf_set_lines(term_buf, 0, -1, false, vim.api.nvim_buf_set_lines(term_buf, 0, -1, false,
vim.list_extend({ "Error during compilation:" }, vim.split(output, "\n", { trimempty = true })) vim.list_extend({ "Error during compilation:" }, vim.split(output, "\n", { trimempty = true }))
) )
vim.api.nvim_set_option_value("modifiable", false, { win = term_buf }) vim.api.nvim_set_option_value("modifiable", false, { win = term_buf })
else else
utils.terminal({ "java -cp " .. root, "build" .. " Main" }) utils.terminal({ "java -cp " .. root, "build" .. " Main" })
end end
end end
}, },
c = { c = {
setup = function (self, user_opts) setup = function (self, user_opts)
local opts = vim.tbl_deep_extend("force", {}, configs.get("c"), user_opts or {}) local opts = vim.tbl_deep_extend("force", {}, configs.get("c"), user_opts or {})
vim.api.nvim_create_user_command("CRun", function () self:run() end, {}) vim.api.nvim_create_user_command("CRun", function () self:run() end, {})
for key, _ in pairs(opts.keybinds) do for key, _ in pairs(opts.keybinds) do
vim.keymap.set("n", key, ":CRun<CR>", { silent = true }) vim.keymap.set("n", key, ":CRun<CR>", { silent = true })
end end
end, end,
run = function () run = function ()
local root = utils.get_project_root() local root = utils.get_project_root()
local build_dir = root .. "/build" local build_dir = root .. "/build"
local cmd = "cd '" .. build_dir .. "' && cmake --build ." local cmd = "cd '" .. build_dir .. "' && cmake --build ."
local output = vim.fn.system(cmd) local output = vim.fn.system(cmd)
local success = vim.v.shell_error == 0 local success = vim.v.shell_error == 0
if not success then if not success then
local term_buf = utils.terminal({ cmd }) local term_buf = utils.terminal({ cmd })
vim.api.nvim_set_option_value("modifiable", true, { win = term_buf }) vim.api.nvim_set_option_value("modifiable", true, { win = term_buf })
vim.api.nvim_buf_set_lines(term_buf, 0, -1, false, vim.api.nvim_buf_set_lines(term_buf, 0, -1, false,
vim.list_extend({ "Error during compilation:" }, vim.split(output, "\n", { trimempty = true })) vim.list_extend({ "Error during compilation:" }, vim.split(output, "\n", { trimempty = true }))
) )
vim.api.nvim_set_option_value("modifiable", false, { win = term_buf }) vim.api.nvim_set_option_value("modifiable", false, { win = term_buf })
end end
if success then if success then
local run_cmd = "cd '" .. build_dir .. "' && ./" .. utils.get_project_name() local run_cmd = "cd '" .. build_dir .. "' && ./" .. utils.get_project_name()
utils.terminal({ run_cmd }) utils.terminal({ run_cmd })
end end
end end
}, },
cpp = { cpp = {
setup = function (self, user_opts) setup = function (self, user_opts)
local opts = vim.tbl_deep_extend("force", {}, configs.get("cpp"), user_opts or {}) local opts = vim.tbl_deep_extend("force", {}, configs.get("cpp"), user_opts or {})
vim.api.nvim_create_user_command("CppRun", function () self:run() end, {}) vim.api.nvim_create_user_command("CppRun", function () self:run() end, {})
for key, _ in pairs(opts.keybinds) do for key, _ in pairs(opts.keybinds) do
vim.keymap.set("n", key, ":CppRun<CR>", { silent = true }) vim.keymap.set("n", key, ":CppRun<CR>", { silent = true })
end end
end, end,
run = function () run = function ()
local root = utils.get_project_root() local root = utils.get_project_root()
local build_dir = root .. "/build" local build_dir = root .. "/build"
if utils.exists(build_dir) == nil then
vim.fn.mkdir(build_dir, "p")
vim.fn.system(string.format("cd %s/build && cmake -S .. -B . && cmake --build . && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .. && ln -sf compile_commands.json ../compile_commands.json", root))
end
local cmd = "cd '" .. build_dir .. "' && cmake --build ." local cmd = "cd '" .. build_dir .. "' && cmake --build ."
local output = vim.fn.system(cmd) local output = vim.fn.system(cmd)
local success = vim.v.shell_error == 0 local success = vim.v.shell_error == 0
if not success then if not success then
local term_buf = utils.terminal({ cmd }) local term_buf = utils.terminal({ cmd })
vim.api.nvim_set_option_value("modifiable", true, { buf = term_buf }) vim.api.nvim_set_option_value("modifiable", true, { buf = term_buf })
vim.api.nvim_buf_set_lines(term_buf, 0, -1, false, vim.api.nvim_buf_set_lines(term_buf, 0, -1, false,
vim.list_extend({ "Error during compilation:" }, vim.split(output, "\n", { trimempty = true })) vim.list_extend({ "Error during compilation:" }, vim.split(output, "\n", { trimempty = true }))
) )
vim.api.nvim_set_option_value("modifiable", false, { buf = term_buf }) vim.api.nvim_set_option_value("modifiable", false, { buf = term_buf })
end
end if success then
if success then local run_cmd = "cd '" .. build_dir .. "' && ./" .. utils.get_project_name()
local run_cmd = "cd '" .. build_dir .. "' && ./" .. utils.get_project_name() utils.terminal({ run_cmd })
utils.terminal({ run_cmd }) end
end end
end
}, },
html = { html = {
setup = function (user_opts) setup = function (user_opts)
vim.tbl_deep_extend("force", {}, configs.get("html"), user_opts or {}) vim.tbl_deep_extend("force", {}, configs.get("html"), user_opts or {})
end end
}, },
rust = { rust = {
setup = function (self, user_opts) setup = function (self, user_opts)
local opts = vim.tbl_deep_extend("force", {}, configs.get("rust"), user_opts or {}) local opts = vim.tbl_deep_extend("force", {}, configs.get("rust"), user_opts or {})
vim.api.nvim_create_user_command("RustRun", function () self:run() end, {}) vim.api.nvim_create_user_command("RustRun", function () self:run() end, {})
for key, _ in pairs(opts.keybinds) do for key, _ in pairs(opts.keybinds) do
vim.keymap.set("n", key, ":RustRun<CR>", { silent = true }) vim.keymap.set("n", key, ":RustRun<CR>", { silent = true })
end end
end, end,
run = function () run = function ()
local root = utils.get_project_root() local root = utils.get_project_root()
if not root then return print("Error: Project root not found.") end if not root then return print("Error: Project root not found.") end
local cmd = { "cargo build" } local cmd = { "cargo build" }
local output = vim.fn.system(table.concat(cmd)) local output = vim.fn.system(table.concat(cmd))
if not vim.v.shell_error == 0 then if not vim.v.shell_error == 0 then
local term_buf = utils.terminal(cmd) local term_buf = utils.terminal(cmd)
vim.api.nvim_set_option_value("modifiable", true, { win = term_buf }) vim.api.nvim_set_option_value("modifiable", true, { win = term_buf })
vim.api.nvim_buf_set_lines(term_buf, 0, -1, false, vim.api.nvim_buf_set_lines(term_buf, 0, -1, false,
vim.list_extend({ "Error during compilation:" }, vim.split(output, "\n", { trimempty = true })) vim.list_extend({ "Error during compilation:" }, vim.split(output, "\n", { trimempty = true }))
) )
vim.api.nvim_set_option_value("modifiable", false, { win = term_buf }) vim.api.nvim_set_option_value("modifiable", false, { win = term_buf })
else else
utils.terminal({ "cargo run" }) utils.terminal({ "cargo run" })
end end
end end
}, },
python = { python = {
setup = function(self, user_opts) setup = function(self, user_opts)
local opts = vim.tbl_deep_extend("force", {}, configs.get("python"), user_opts or {}) local opts = vim.tbl_deep_extend("force", {}, configs.get("python"), user_opts or {})
vim.api.nvim_create_user_command("PythonPip", function () self:install_dependency() end, {}) vim.api.nvim_create_user_command("PythonPip", function () self:install_dependency() end, {})
vim.api.nvim_create_user_command("PythonRun", function () self:run() end, {}) vim.api.nvim_create_user_command("PythonRun", function () self:run() end, {})
for key, command in pairs(opts.keybinds) do for key, command in pairs(opts.keybinds) do
if command == "PythonRun" then if command == "PythonRun" then
vim.keymap.set("n", key, ":PythonRun<CR>", { silent = true }) vim.keymap.set("n", key, ":PythonRun<CR>", { silent = true })
end end
if command == "PythonPip" then if command == "PythonPip" then
vim.keymap.set("n", key, ":PythonPip<CR>", { silent = true }) vim.keymap.set("n", key, ":PythonPip<CR>", { silent = true })
end end
end end
local root = utils.get_project_root() local root = utils.get_project_root()
if root then if root then
local venv_path = root .. "/venv/bin/activate" local venv_path = root .. "/venv/bin/activate"
if vim.fn.filereadable(venv_path) == 1 then if vim.fn.filereadable(venv_path) == 1 then
vim.env.VIRTUAL_ENV = venv_path vim.env.VIRTUAL_ENV = venv_path
vim.env.PATH = root .. "/venv/bin:" .. vim.env.PATH vim.env.PATH = root .. "/venv/bin:" .. vim.env.PATH
end end
end
end,
install_dependency = function ()
vim.ui.input({ prompt = "Enter pip module: " }, function(pip_module)
if not pip_module or pip_module == "" then return print("Pip canceled") end
utils.terminal({ "pip install " .. pip_module })
end)
end,
run = function ()
utils.terminal({ "python3 " .. utils.get_project_root(), "main.py" })
end end
end,
install_dependency = function ()
vim.ui.input({ prompt = "Enter pip module: " }, function(pip_module)
if not pip_module or pip_module == "" then return print("Pip canceled") end
utils.terminal({ "pip install " .. pip_module })
end)
end,
run = function ()
utils.terminal({ "python3 " .. utils.get_project_root(), "main.py" })
end
}, },
lua = { lua = {
setup = function (self, user_opts) setup = function (self, user_opts)
local opts = vim.tbl_deep_extend("force", {}, configs.get("lua"), user_opts or {}) local opts = vim.tbl_deep_extend("force", {}, configs.get("lua"), user_opts or {})
vim.api.nvim_create_user_command("LuaRun", function () self:run() end, {}) vim.api.nvim_create_user_command("LuaRun", function () self:run() end, {})
for key, _ in pairs(opts.keybinds) do for key, _ in pairs(opts.keybinds) do
vim.keymap.set("n", key, ":LuaRun<CR>", { silent = true }) vim.keymap.set("n", key, ":LuaRun<CR>", { silent = true })
end
end,
run = function ()
local init_lua_path = utils.get_project_root() .. "/lua/" .. utils.get_project_name() .. "/init.lua"
if vim.fn.filereadable(init_lua_path) == 1 then
utils.terminal({ "lua " .. init_lua_path })
end
end end
end,
run = function ()
local init_lua_path = utils.get_project_root() .. "/lua/" .. utils.get_project_name() .. "/init.lua"
if vim.fn.filereadable(init_lua_path) == 1 then
utils.terminal({ "lua " .. init_lua_path })
end
end
}, },
} }
+32 -20
View File
@@ -94,24 +94,30 @@ setup(
#include <stdio.h> #include <stdio.h>
int main() { int main() {
printf("%s", "Hello World"); printf("%s", "Hello World");
return 0; return 0;
} }
]]) ]])
utils.write_file({ full_project_root, "CMakeLists.txt" }, string.format([[ utils.write_file({ full_project_root, "CMakeLists.txt" }, string.format([[
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.16)
project(%s) project(%s)
include_directories(include)
set(SOURCES src/main.c)
add_executable(%s ${SOURCES})
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_C_STANDARD 23) set(CMAKE_C_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD_REQUIRED ON)
include_directories(include)
# find_package(SDL3 CONFIG REQUIRED) # An example of how to import libraries from vcpkg set(SOURCES
# target_link_libraries(Game PRIVATE SDL3::SDL3) src/main.c
]], project_name, project_name)) )
local gitignore = { "build/" }
add_executable(%s ${SOURCES})
# find_package(Curses REQUIRED)
# include_directories(${CURSES_INCLUDE_DIR})
# target_link_libraries(%s ${CURSES_LIBRARIES})
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
]], project_name, project_name, project_name))
local gitignore = { "build/", ".cache/" }
utils.init_git(full_project_root, gitignore) utils.init_git(full_project_root, gitignore)
vim.fn.system(string.format("cd %s/build && cmake -S .. -B . && cmake --build . && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..", full_project_root)) vim.fn.system(string.format("cd %s/build && cmake -S .. -B . && cmake --build . && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..", full_project_root))
vim.cmd("edit " .. full_project_root .. "/src/main.c") vim.cmd("edit " .. full_project_root .. "/src/main.c")
@@ -132,20 +138,26 @@ int main() {
} }
]]) ]])
utils.write_file({ full_project_root, "CMakeLists.txt" }, string.format([[ utils.write_file({ full_project_root, "CMakeLists.txt" }, string.format([[
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.16)
project(%s) project(%s)
include_directories(include)
set(SOURCES src/main.cpp)
add_executable(%s ${SOURCES})
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_C_STANDARD 23) set(CMAKE_C_STANDARD 23)
set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD_REQUIRED ON)
include_directories(include)
# find_package(SDL3 CONFIG REQUIRED) # An example of how to import libraries from vcpkg set(SOURCES
# target_link_libraries(Game PRIVATE SDL3::SDL3) src/main.cpp
]], project_name, project_name)) )
local gitignore = { "build/" } add_executable(%s ${SOURCES})
# find_package(Curses REQUIRED)
# include_directories(${CURSES_INCLUDE_DIR})
# target_link_libraries(%s ${CURSES_LIBRARIES})
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
]], project_name, project_name, project_name))
local gitignore = { "build/", ".cache/" }
utils.init_git(full_project_root, gitignore) utils.init_git(full_project_root, gitignore)
vim.fn.system(string.format("cd %s/build && cmake -S .. -B . && cmake --build . && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..", full_project_root)) vim.fn.system(string.format("cd %s/build && cmake -S .. -B . && cmake --build . && cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..", full_project_root))
vim.cmd("edit " .. full_project_root .. "/src/main.cpp") vim.cmd("edit " .. full_project_root .. "/src/main.cpp")
+4
View File
@@ -5,6 +5,10 @@ function M.setup(opts)
M.opts = vim.tbl_deep_extend("force", {}, require("Polydev.configs").get("terminal"), opts or {}) M.opts = vim.tbl_deep_extend("force", {}, require("Polydev.configs").get("terminal"), opts or {})
end end
function M.exists(path)
return (io.open(path,"r") ~= nil)
end
---@return string ---@return string
function M.get_project_root() function M.get_project_root()
local plugin_dir = vim.fn.fnamemodify(debug.getinfo(1, "S").source:sub(2), ":h:h:h") local plugin_dir = vim.fn.fnamemodify(debug.getinfo(1, "S").source:sub(2), ":h:h:h")