From 685a711644db5d262932da3d65c619264aa5bf38 Mon Sep 17 00:00:00 2001 From: Andrew Haynes Date: Thu, 22 Oct 2026 04:29:52 -0400 Subject: [PATCH] REFACTOR: Annotations for autocompletion, reworked how projects are made and handled, wrote the c file replacing the copied python code. --- lua/vern/actions/c.lua | 97 +++++++++++++++++++++++--------- lua/vern/actions/python.lua | 103 ++++++++++++++++++---------------- lua/vern/attach/c.lua | 17 +++--- lua/vern/attach/python.lua | 7 ++- lua/vern/configs/c.lua | 89 +++++++++++++++++++---------- lua/vern/configs/init.lua | 10 ++-- lua/vern/configs/python.lua | 22 ++++---- lua/vern/init.lua | 19 ++----- lua/vern/templates/c.lua | 102 ++++++++++++++++++++++++++------- lua/vern/templates/init.lua | 10 ++-- lua/vern/templates/python.lua | 12 ++-- lua/vern/types.lua | 58 +++++++++++++++++++ lua/vern/utils.lua | 5 +- 13 files changed, 373 insertions(+), 178 deletions(-) create mode 100644 lua/vern/types.lua diff --git a/lua/vern/actions/c.lua b/lua/vern/actions/c.lua index 540af02..a14771d 100644 --- a/lua/vern/actions/c.lua +++ b/lua/vern/actions/c.lua @@ -3,7 +3,9 @@ local M = {} local utils = require("vern.utils") local templates = require("vern.templates") -local join, get = vim.fs.joinpath, vim.tbl_get +local join = vim.fs.joinpath + +---@param opts VernCConfig function M.create_project(opts) vim.ui.input({ prompt = "Enter project name: " }, function(pname) pname = pname and vim.trim(pname) @@ -11,46 +13,85 @@ function M.create_project(opts) return end - local configs = require("vern.configs") - local pconfigs = require("vern.configs.python") + local configs = require("vern.configs.c") - local cfg = vim.tbl_deep_extend("force", {}, configs, pconfigs, opts or {}) + ---@type VernCConfig + local cfg = vim.tbl_deep_extend("force", {}, configs, configs, opts or {}) local ctx = { project_name = pname } - local py = cfg.python - local root = join(vim.fn.expand(cfg.workspace_root), py.root, pname) - vim.fn.mkdir(join(root, utils.fmt(py.source_root, ctx)), "p") - - local tmpl = get(py, "templates", "project") or {} - local function dump(k, alt, id) - local path = join(root, utils.fmt(get(tmpl, k, "target") or alt, ctx)) - utils.dump(path, templates.fetch("python", id, pname)) - return path + local root = join(vim.fn.expand(cfg.workspace_root), cfg.c.root, pname) + vim.fn.mkdir(root, "p") + local bin + for tbl_name, tbl in pairs(cfg.c.templates.project) do + local raw_path = join(tbl.path, tbl.name) + local path = utils.resolve_path(raw_path, cfg.c.dirs, ctx) + if tbl_name == "primary" then + bin = join(root, path) + end + local abs_file_path = vim.fs.normalize(join(root, path)) + print("File Path: " .. abs_file_path) + local abs_dir_path = vim.fs.dirname(abs_file_path) + if abs_dir_path ~= root and not vim.startswith(root, abs_dir_path) then + vim.fn.mkdir(abs_dir_path, "p") + end + utils.dump(abs_file_path, templates.fetch(tbl.kind_path, tbl.kind, pname)) + end + for _, tbl in pairs(cfg.c.templates.extras) do + if tbl.enabled then + local raw_path = join(tbl.path, tbl.name) + local path = utils.resolve_path(raw_path, cfg.c.dirs, ctx) + local abs_file_path = vim.fs.normalize(join(root, path)) + local abs_dir_path = vim.fs.dirname(abs_file_path) + if abs_dir_path ~= root and not vim.startswith(root, abs_dir_path) then + vim.fn.mkdir(abs_dir_path, "p") + end + utils.dump(abs_file_path, templates.fetch(tbl.kind_path, tbl.kind, pname)) + end end - local bin = dump("bin", py.source_root .. "/main.py", "main") - dump("pkg", py.source_root .. "/__init__.py", "__init__") - dump("cfg", "pyproject.toml", "pyproject") - utils.init_git(root, "python") - - local venv_path = root .. "/venv" - vim.fn.system("python3 -m venv " .. venv_path) + utils.init_git(root, "c") vim.cmd.edit(vim.fn.fnameescape(bin)) end) end function M.create_file(opts) - vim.ui.input({ prompt = "Enter file name: " }, function(fname) - fname = fname and vim.trim(fname) - if not fname or fname == "" then + vim.ui.input({ prompt = "Enter type (c/h): " }, function(ft) + ft = ft and vim.trim(ft) + if not ft or ft == "" then return end - local root = get(opts, "python", "templates", "file", "mod").target or {} - local context = { project_name = utils.proj_name(), name = fname } - local path = join(utils.proj_root(), utils.fmt(root, context)) - utils.dump(path, templates.fetch("python", "module", fname)) - vim.cmd.edit(vim.fn.expand(path)) + local configs = require("vern.configs.c") + ---@type VernCConfig + local cfg = vim.tbl_deep_extend("force", {}, configs, opts or {}) + vim.ui.input({ prompt = "Enter file name: " }, function(fname) + local root = join(vim.fn.expand(cfg.workspace_root), cfg.c.root, utils.proj_name()) + local input_txt = fname + ft = ft and vim.trim(ft) + if not ft or ft == "" then + return + end + local mod + if ft == "c" then + mod = cfg.c.templates.file.source or {} + end + if ft == "h" then + mod = cfg.c.templates.file.header or {} + input_txt = fname:upper() + end + local raw_path = join(mod.path, mod.name) + local context = { project_name = utils.proj_name(), name = fname } + local path = utils.resolve_path(raw_path, cfg.c.dirs or {}, context) + local abs_file_path = vim.fs.normalize(join(root, path)) + if ft == "h" then + local abs_dir_path = vim.fs.dirname(abs_file_path) + if abs_dir_path ~= root and not vim.startswith(root, abs_dir_path) then + vim.fn.mkdir(abs_dir_path, "p") + end + end + utils.dump(abs_file_path, templates.fetch(mod.kind_path, mod.kind, input_txt)) + vim.cmd.edit(vim.fn.expand(abs_file_path)) + end) end) end diff --git a/lua/vern/actions/python.lua b/lua/vern/actions/python.lua index 9968773..2b611c6 100644 --- a/lua/vern/actions/python.lua +++ b/lua/vern/actions/python.lua @@ -1,26 +1,11 @@ local M = {} --- -- Simple test function that pulls directly from the table and prints --- function M.test_print() --- local configs = require("vern.configs") --- local pconfigs = require("vern.configs.python") --- --- local cfg = vim.tbl_deep_extend("force", {}, configs, pconfigs) --- -- Pulling straight from the python_config table --- local raw_path = cfg.python.templates.project.bin.path --- local dirs = cfg.python.dirs --- local context = { project_name = "my_cool_app" } --- --- local final_path = M.resolve_path(raw_path, dirs, context) --- --- print("Raw path:", raw_path) --- print("Resolved path:", final_path) --- end - local utils = require("vern.utils") local templates = require("vern.templates") -local join, get = vim.fs.joinpath, vim.tbl_get +local join = vim.fs.joinpath + +---@param opts VernPythonConfig function M.create_project(opts) vim.ui.input({ prompt = "Enter project name: " }, function(pname) pname = pname and vim.trim(pname) @@ -28,79 +13,103 @@ function M.create_project(opts) return end - local configs = require("vern.configs") - local pconfigs = require("vern.configs.python") - - local cfg = vim.tbl_deep_extend("force", {}, configs, pconfigs, opts or {}) + local configs = require("vern.configs.python") + ---@type VernPythonConfig + local cfg = vim.tbl_deep_extend("force", {}, configs, opts or {}) local ctx = { project_name = pname } - local py = cfg.python - local root = join(vim.fn.expand(cfg.workspace_root), py.root, pname) + local root = join(vim.fn.expand(cfg.workspace_root), cfg.python.root, pname) + vim.fn.mkdir(root, "p") local bin - for tbl_name, tbl in pairs(py.templates.project) do + for tbl_name, tbl in pairs(cfg.python.templates.project) do local raw_path = join(tbl.path, tbl.name) - local path = utils.resolve_path(raw_path, py.dirs, ctx) - if tbl_name == "bin" then + local path = utils.resolve_path(raw_path, cfg.python.dirs, ctx) + if tbl_name == "primary" then bin = join(root, path) end local abs_file_path = join(root, path) local abs_dir_path = vim.fs.dirname(abs_file_path) - vim.fn.mkdir(abs_dir_path, "p") + if abs_dir_path ~= root and not vim.startswith(root, abs_dir_path) then + vim.fn.mkdir(abs_dir_path, "p") + end utils.dump(abs_file_path, templates.fetch(tbl.kind_path, tbl.kind, pname)) end + for _, tbl in pairs(cfg.python.templates.extras) do + if tbl.enabled then + local raw_path = join(tbl.path, tbl.name) + local path = utils.resolve_path(raw_path, cfg.python.dirs, ctx) + local abs_file_path = join(root, path) + local abs_dir_path = vim.fs.dirname(abs_file_path) + if abs_dir_path ~= root and not vim.startswith(root, abs_dir_path) then + vim.fn.mkdir(abs_dir_path, "p") + end + utils.dump(abs_file_path, templates.fetch(tbl.kind_path, tbl.kind, pname)) + end + end utils.init_git(root, "python") local venv_path = root .. "/venv" vim.fn.system("python3 -m venv " .. venv_path) + vim.notify("Project: " .. pname .. " has been created!") vim.cmd.edit(vim.fn.fnameescape(bin)) end) end +---@param opts VernPythonConfig function M.create_file(opts) + opts = opts or {} vim.ui.input({ prompt = "Enter file name: " }, function(fname) fname = fname and vim.trim(fname) if not fname or fname == "" then return end - local py = get(opts, "python") - local cfg = get(py, "templates", "file", "mod") or {} + local configs = require("vern.configs.python") + ---@type VernPythonConfig + local cfg = vim.tbl_deep_extend("force", {}, configs, opts or {}) + local mod = cfg.python.templates.file.mod or {} - local raw_path = join(cfg.path, cfg.name) + local raw_path = join(mod.path, mod.name) local context = { project_name = utils.proj_name(), name = fname } - local path = utils.resolve_path(raw_path, py.dirs or {}, context) + local path = utils.resolve_path(raw_path, cfg.python.dirs or {}, context) - utils.dump(path, templates.fetch("python", "module", fname)) + utils.dump(path, templates.fetch(mod.kind_path, mod.kind, fname)) + vim.notify("File: " .. fname .. " has been created!") vim.cmd.edit(vim.fn.expand(path)) end) end ---- Goal is to add providers for uv and venv so its available to more users ----@param opts? table Takes a table for the runtime +---@param opts VernPythonConfig Takes a table for the runtime function M.run(opts) opts = opts or {} local root = utils.proj_root() or "." local pname = vim.fs.basename(root) + local bin = opts.python.templates.project.primary - local exe = opts.python.templates.project.bin.target or "src/{project_name}/main.py" - local full_path = join(vim.fn.expand(root), utils.fmt(exe, { project_name = pname })) + local exe = join(bin.path, bin.name) or "src/{project_name}/main.py" + local exe_path = utils.resolve_path(exe, opts.python.dirs, { project_name = pname }) + local full_path = join(vim.fn.expand(root), exe_path) utils.term({ "python3 " .. full_path }, opts.terminal or {}) end ----@param cmd_args? table Takes a table for the runtime -function M.pip_install(opts, cmd_args) - local args = cmd_args and cmd_args.args and vim.trim(cmd_args.args) or "" - if args ~= "" then - utils.term({ "pip install " .. args }, opts.terminal or {}) - return - end - vim.ui.input({ prompt = "Enter pip module: " }, function(pip_module) - if not pip_module or vim.trim(pip_module) == "" then +function M.pip_install() + vim.ui.input({ prompt = "Enter pip module: " }, function(mod) + mod = mod and vim.trim(mod) + if not mod or mod == "" then vim.notify("Pip Cancelled", vim.log.levels.WARN) return end - utils.term({ "pip install " .. vim.trim(pip_module) }, opts.terminal or {}) + vim.notify("Installing " .. mod, vim.log.levels.INFO) + vim.system({ "pip", "install", mod }, { text = true }, function(obj) + vim.schedule(function() + if obj.code ~= 0 then + vim.notify("Pip failed: " .. obj.stderr, vim.log.levels.WARN) + else + vim.notify("Pip installed " .. mod, vim.log.levels.INFO) + end + end) + end) end) end diff --git a/lua/vern/attach/c.lua b/lua/vern/attach/c.lua index 6fa739e..10a42d2 100644 --- a/lua/vern/attach/c.lua +++ b/lua/vern/attach/c.lua @@ -1,19 +1,22 @@ local actions = require("vern.actions.python") local config = require("vern.configs.python") +---@param bufnr integer Buffer to activate on : defaults to 0 +---@param user_opts? VernPythonConfig return function(bufnr, user_opts) + ---@type VernPythonConfig local opts = vim.tbl_deep_extend("force", {}, config, user_opts or {}) - vim.api.nvim_buf_create_user_command(bufnr, "Pythonrun", function() + vim.api.nvim_buf_create_user_command(bufnr, "CRun", function() if type(actions.run) == "function" then actions.run(opts) end - end, { desc = "Run python project" }) + end, { desc = "Run c project" }) - vim.api.nvim_buf_create_user_command(bufnr, "Pythonpip", function(cmd_args) - if actions.pip_install then - actions.pip_install(opts, cmd_args) - end - end, { nargs = "*", desc = "Install python packages" }) + -- vim.api.nvim_buf_create_user_command(bufnr, "Pythonpip", function(cmd_args) + -- if actions.pip_install then + -- actions.pip_install() + -- end + -- end, { nargs = "*", desc = "Install python packages" }) for key, def in pairs(opts.python.keybinds or {}) do if type(def.action) == "function" then diff --git a/lua/vern/attach/python.lua b/lua/vern/attach/python.lua index 6fa739e..40aee86 100644 --- a/lua/vern/attach/python.lua +++ b/lua/vern/attach/python.lua @@ -1,7 +1,10 @@ local actions = require("vern.actions.python") local config = require("vern.configs.python") +---@param bufnr integer Buffer to activate on : defaults to 0 +---@param user_opts? VernPythonConfig return function(bufnr, user_opts) + ---@type VernPythonConfig local opts = vim.tbl_deep_extend("force", {}, config, user_opts or {}) vim.api.nvim_buf_create_user_command(bufnr, "Pythonrun", function() if type(actions.run) == "function" then @@ -9,9 +12,9 @@ return function(bufnr, user_opts) end end, { desc = "Run python project" }) - vim.api.nvim_buf_create_user_command(bufnr, "Pythonpip", function(cmd_args) + vim.api.nvim_buf_create_user_command(bufnr, "Pythonpip", function() if actions.pip_install then - actions.pip_install(opts, cmd_args) + actions.pip_install() end end, { nargs = "*", desc = "Install python packages" }) diff --git a/lua/vern/configs/c.lua b/lua/vern/configs/c.lua index 4433aeb..7ed75bc 100644 --- a/lua/vern/configs/c.lua +++ b/lua/vern/configs/c.lua @@ -1,40 +1,67 @@ -return { - c = { - root = "C", - -- source_root = "src/{project_name}", - keybinds = { - ["pr"] = { - desc = "Executes c code", - action = require("vern.actions.c").run, +local M = {} + +---@type VernLanguageConfig +M.c = { + root = "C", + dirs = { + src = "src", + include = "include/{project_name}", + }, + keybinds = { + ["pr"] = { + desc = "Executes c code", + action = require("vern.actions.c").run, + }, + ["pf"] = { + desc = "Creates source/header files", + action = require("vern.actions.c").create_file, + }, + }, + templates = { + project = { + primary = { + path = "{dirs.src}", + name = "main.c", + kind = "main", + kind_path = "vern.templates.c", }, - ["px"] = { - desc = "Creates header files", - action = require("vern.actions.python").create_header, + manifest = { + path = ".", + name = "CMakeLists.txt", + kind = "CmakeLists", + kind_path = "vern.templates.c", + }, + style = { + path = ".", + name = ".clang-format", + kind = "format", + kind_path = "vern.templates.c", }, }, - templates = { - project = { - bin = { - target = "src/{project_name}/main.py", - }, - pkg = { - target = "src/{project_name}/__init__.py", - }, - cfg = { - target = "pyproject.toml", - }, + file = { + header = { + path = "{dirs.include}", + name = "{name}.h", + kind = "header", + kind_path = "vern.templates.c", }, - file = { - mod = { - target = "src/{project_name}/{name}.py", - }, + source = { + path = "{dirs.src}", + name = "{name}.c", + kind = "source", + kind_path = "vern.templates.c", }, - extras = { - gitignore = { - template = "vern.templates.extras.gitignore", --- needs to call the function in file - target = ".gitignore", - }, + }, + extras = { + linter = { + path = ".", + name = ".clang-tidy", + kind = "linter", + kind_path = "vern.templates.c", + enabled = false, }, }, }, } + +return M diff --git a/lua/vern/configs/init.lua b/lua/vern/configs/init.lua index d329020..f2e6f05 100644 --- a/lua/vern/configs/init.lua +++ b/lua/vern/configs/init.lua @@ -1,4 +1,6 @@ local actions = require("vern.actions") + +---@type VernCoreConfig return { workspace_root = "~/personal/Projects", keybinds = { @@ -13,7 +15,7 @@ return { }, terminal = { mode = { - type = "split", --- can be split or float + type = "split", win = { float = { padding = { @@ -24,12 +26,12 @@ return { }, border = { enabled = true, - type = vim.o.winborder, + type = vim.o.winborder, -- defaults to neovim winborder }, }, split = { - type = "horizontal", --- can be vertical or horizontal - anchor = "bottom", --- can be right or bottom + direction = "horizontal", + anchor = "bottom", size = "20", }, }, diff --git a/lua/vern/configs/python.lua b/lua/vern/configs/python.lua index 63dc7c5..507da0b 100644 --- a/lua/vern/configs/python.lua +++ b/lua/vern/configs/python.lua @@ -1,5 +1,6 @@ local M = {} +---@type VernLanguageConfig M.python = { root = "Python", dirs = { @@ -10,38 +11,35 @@ M.python = { desc = "Executes python code", action = require("vern.actions.python").run, }, - ["pb"] = { + ["pi"] = { desc = "Asks for what python package to install", action = require("vern.actions.python").pip_install, }, }, templates = { project = { - bin = { + primary = { path = "{dirs.src}", - -- path = "src/{project_name}", name = "main.py", kind = "main", kind_path = "vern.templates.python", }, - pkg = { - path = "{dirs.src}", - -- path = "src/{project_name}", - name = "__init__.py", - kind = "__init__", - kind_path = "vern.templates.python", - }, - cfg = { + manifest = { path = ".", name = "pyproject.toml", kind = "pyproject", kind_path = "vern.templates.python", }, + pkg_init = { + path = "{dirs.src}", + name = "__init__.py", + kind = "__init__", + kind_path = "vern.templates.python", + }, }, file = { mod = { path = "{dirs.src}", - -- path = "src/{project_name}", name = "{name}.py", kind = "module", kind_path = "vern.templates.python", diff --git a/lua/vern/init.lua b/lua/vern/init.lua index 6f02fa4..e1324b5 100644 --- a/lua/vern/init.lua +++ b/lua/vern/init.lua @@ -1,19 +1,16 @@ local M = {} -function M.test() - vim.ui.input({ prompt = "Test: ", default = "" }, function(input) - print(input) - end) -end - local configs = require("vern.configs") local actions = require("vern.actions") -M.opts = {} +---@type VernCoreConfig +M.opts = vim.deepcopy(configs) + +---@param user_opts? VernCoreConfig | table function M.setup(user_opts) + ---@type VernCoreConfig M.opts = vim.tbl_deep_extend("force", {}, configs, user_opts or {}) - --- Bind global keybinds for key, def in pairs(M.opts.keybinds or {}) do if type(def.action) == "function" then vim.keymap.set("n", key, function() @@ -25,7 +22,6 @@ function M.setup(user_opts) end end - --- Load project cmdline commands vim.api.nvim_create_user_command("VernCreateProject", function() if actions.create_project then actions.create_project(M.opts) @@ -38,10 +34,7 @@ function M.setup(user_opts) end end, { nargs = "*", desc = "Creates a new file for project" }) - --- Create group and attach based on ft - local group = - vim.api.nvim_create_augroup("VernAutocommands", { clear = true }) - + local group = vim.api.nvim_create_augroup("VernAutocommands", { clear = true }) vim.api.nvim_create_autocmd("FileType", { group = group, pattern = "*", diff --git a/lua/vern/templates/c.lua b/lua/vern/templates/c.lua index 59e301a..27eccb5 100644 --- a/lua/vern/templates/c.lua +++ b/lua/vern/templates/c.lua @@ -21,10 +21,30 @@ main() File: __init__.py Target: src/{project_name}/__init__.py ===================================================================== --]] - __init__ = vim.trim([=[ -# %s init - -__all__: list[str] = [] + format = vim.trim([=[ +--- +BasedOnStyle: Google +Standard: Latest +UseTab: Always +TabWidth: 8 +IndentWidth: 8 +BreakBeforeBraces: Allman +SpaceBeforeCpp11BracedList: true +SeparateDefinitionBlocks: Always +Cpp11BracedListStyle: false +BreakAfterReturnType: TopLevel +ReflowComments: Always +AllowShortFunctionsOnASingleLine: All +AllowShortIfStatementsOnASingleLine: AllIfsAndElse +AllowShortLoopsOnASingleLine: true +IndentAccessModifiers: false # Indent access specifiers by one level +AccessModifierOffset: -4 # Optional: adjust offset relative to the class indentation level +IndentGotoLabels: InnerIndent +DerivePointerAlignment: false +PointerAlignment: Left +IndentPPDirectives: AfterHash +SortIncludes: CaseSensitive +IncludeBlocks: Preserve ]=]) .. "\n", --[[ ===================================================================== @@ -32,21 +52,28 @@ __all__: list[str] = [] File: pyproject.toml Target: pyproject.toml ===================================================================== --]] - pyproject = vim.trim([=[ -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" + CmakeLists = vim.trim([=[ +cmake_minimum_required(VERSION 3.16) +project(__PROJECT_NAME__ LANGUAGES C) +set(CMAKE_C_STANDARD 23) +set(CMAKE_C_STANDARD_REQUIRED ON) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -[project] -name = "%s" -version = "0.1.0" -description = "Project %s" -readme = "README.md" -requires-python = ">=3.10" -dependencies = [] +add_library(__PROJECT_NAME__ STATIC + # Add your other types here as you implement them: + # src/example1.c + # src/example2.c +) -[project.scripts] -%s = "%s.main:main" +target_include_directories(__PROJECT_NAME__ + PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/include +) + +add_executable(__PROJECT_NAME___bin src/main.c) +set_target_properties(__PROJECT_NAME___bin PROPERTIES OUTPUT_NAME "__PROJECT_NAME__") + +target_link_libraries(__PROJECT_NAME___bin PRIVATE __PROJECT_NAME__) ]=]) .. "\n", --[[ ===================================================================== @@ -54,9 +81,42 @@ dependencies = [] File: {name}.py Target: src/{project_name}/{name}.py ===================================================================== --]] - module = vim.trim([=[ -""" -Module: %s -""" + header = vim.trim([=[ +#ifndef __PROJECT_NAME___H +#define __PROJECT_NAME___H + +// Code + +#endif /* __PROJECT_NAME___H */ +]=]) .. "\n", + + source = vim.trim([=[ +]=]) .. "\n", + + linter = vim.trim([=[ +Checks: > + -*, + clang-analyzer-*, + bugprone-*, + -bugprone-easily-swappable-parameters, + -bugprone-reserved-identifier, + performance-*, + security-* + + readability-redundant-declaration + readability-misleading-indentation + readability-implicit-bool-conversion + misc-misplaced-const, + misc-include-cleaner + + -bugprone-narrowing-conversions, + -readability-identifier-length +CheckOptions: + readability-identifier-naming.VariableCase: lower_case + readability-identifier-naming.FunctionCase: lower_case + readability-identifier-naming.StructCase: lower_case + readability-identifier-naming.EnumCase: CamelCase + readability-identifier-naming.EnumConstantCase: UPPER_CASE + readability-identifier-naming.MacroDefinitionCase: UPPER_CASE ]=]) .. "\n", } diff --git a/lua/vern/templates/init.lua b/lua/vern/templates/init.lua index 91f73de..74587eb 100644 --- a/lua/vern/templates/init.lua +++ b/lua/vern/templates/init.lua @@ -1,17 +1,17 @@ local M = {} ----@param path string Filetype of template +---@param kind_path string Filetype of template ---@param kind string Template in language table ---@param name string A string to replace temp values in template ----@return string +---@return string Content Formatted string function M.fetch(kind_path, kind, name) - kind_path, kind, name = kind_path or "", kind or "", name or "" - if kind_path == "" or kind == "" or name == "" then + kind, name = kind or "", name or "" + if (kind == "" or nil) or (name == "" or nil) then return "" end local ok, mod = pcall(require, kind_path) if ok and type(mod) == "table" then - return (string.gsub(mod[kind], "%%s", name)) + return (string.gsub(mod[kind], "__PROJECT_NAME__", name)) end return "" end diff --git a/lua/vern/templates/python.lua b/lua/vern/templates/python.lua index a4bdec0..2ef20df 100644 --- a/lua/vern/templates/python.lua +++ b/lua/vern/templates/python.lua @@ -6,7 +6,7 @@ return { ===================================================================== --]] main = vim.trim([=[ def main() -> None: - print("Hello from %s!") + print("Hello from __PROJECT_NAME__!") if __name__ == "__main__": @@ -19,7 +19,7 @@ if __name__ == "__main__": Target: src/{project_name}/__init__.py ===================================================================== --]] __init__ = vim.trim([=[ -# %s init +# __PROJECT_NAME__ init __all__: list[str] = [] ]=]) .. "\n", @@ -35,15 +35,15 @@ requires = ["hatchling"] build-backend = "hatchling.build" [project] -name = "%s" +name = "__PROJECT_NAME__" version = "0.1.0" -description = "Project %s" +description = "Project __PROJECT_NAME__" readme = "README.md" requires-python = ">=3.10" dependencies = [] [project.scripts] -%s = "%s.main:main" +__PROJECT_NAME__ = "__PROJECT_NAME__.main:main" ]=]) .. "\n", --[[ ===================================================================== @@ -53,7 +53,7 @@ dependencies = [] ===================================================================== --]] module = vim.trim([=[ """ -Module: %s +Module: __PROJECT_NAME__ """ ]=]) .. "\n", } diff --git a/lua/vern/types.lua b/lua/vern/types.lua new file mode 100644 index 0000000..d62d2ce --- /dev/null +++ b/lua/vern/types.lua @@ -0,0 +1,58 @@ +---@alias TerminalModeType "split" | "float" +---@alias SplitDirection "vertical" | "horizontal" +---@alias SplitAnchorType "right" | "bottom" + +---@class VernKeybindItem +---@field desc string +---@field action function + +---@class VernFloatWindowConfig +---@field padding { left: integer, right: integer, top: integer, bottom: integer } +---@field border { enabled: boolean, type: string } + +---@class VernSplitWindowConfig +---@field direction SplitDirection +---@field anchor SplitAnchorType +---@field size string + +---@class VernWindowConfig +---@field float VernFloatWindowConfig +---@field split VernSplitWindowConfig + +---@class VernModeConfig +---@field type TerminalModeType +---@field win VernWindowConfig + +---@class VernTerminalConfig +---@field mode VernModeConfig + +---@class VernCoreConfig +---@field workspace_root string +---@field keybinds table +---@field terminal VernTerminalConfig + +---@class VernFileLayout +---@field path string +---@field name string +---@field kind string +---@field kind_path string + +---@class VernExtrasLayout : VernFileLayout +---@field enabled boolean + +---@class VernLanguageTemplates +---@field project table +---@field file table +---@field extras table + +---@class VernLanguageConfig +---@field root string +---@field dirs table +---@field keybinds table +---@field templates VernLanguageTemplates + +---@class VernPythonConfig : VernCoreConfig +---@field python VernLanguageConfig + +---@class VernCConfig : VernCoreConfig +---@field c VernLanguageConfig diff --git a/lua/vern/utils.lua b/lua/vern/utils.lua index f9bcfbb..26cd688 100644 --- a/lua/vern/utils.lua +++ b/lua/vern/utils.lua @@ -69,6 +69,7 @@ function M.init_readme(path) end ---@param cmd table +---@param opts VernTerminalConfig ---@return integer, integer? function M.term(cmd, opts) opts = opts or {} @@ -110,13 +111,13 @@ function M.term(cmd, opts) }) end if opts.mode.type == "split" then - if opts.mode.win.split.type == "vertical" then + if opts.mode.win.split.direction == "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.direction == "horizontal" then if opts.mode.win.split.anchor == "bottom" then vim.cmd("set splitbelow") end