diff --git a/README.md b/README.md index 5aa2b86..74f06ce 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,7 @@ return { project_dir_pattern = { ".git", ".gitignore", "Cargo.toml", "package.json", "go.mod" }, choice_format = "both", -- optional, you can switch to "name" or "path" projects_picker = "vim-ui", -- optional, you can switch to `telescope` + auto_register_project = true, -- optional, toggle on/off the auto add project behaviour -- do whatever you like by hooks hooks = { { diff --git a/lua/cd-project/adapter/init.lua b/lua/cd-project/adapter/init.lua index c43afdd..10a3e06 100644 --- a/lua/cd-project/adapter/init.lua +++ b/lua/cd-project/adapter/init.lua @@ -20,8 +20,15 @@ local function telescope_search_and_add() end end +local function delete_project() + require("cd-project.adapter.telescope").project_picker(function (project) + require("cd-project.api").delete_project( project) + end) +end + return { cd_project = cd_project, manual_cd_project = manual_cd_project, telescope_search_and_add = telescope_search_and_add, + delete_project = delete_project, } diff --git a/lua/cd-project/adapter/telescope.lua b/lua/cd-project/adapter/telescope.lua index 8ffd4bf..3e100d4 100644 --- a/lua/cd-project/adapter/telescope.lua +++ b/lua/cd-project/adapter/telescope.lua @@ -13,6 +13,47 @@ local action_state = require("telescope.actions.state") local repo = require("cd-project.project-repo") local api = require("cd-project.api") +---@param callback fun(project: CdProject.Project): nil +---@param opts? table +local function project_picker(callback, opts) + opts = opts or {} + -- TODO: a format function + local projects = repo.get_projects() + local maxLength = 0 + for _, project in ipairs(projects) do + if #project.name > maxLength then + maxLength = #project.name + end + end + + pickers + .new(opts, { + attach_mappings = function(prompt_bufnr) + actions.select_default:replace(function() + actions.close(prompt_bufnr) + ---@type CdProject.Project + local selected_project = action_state.get_selected_entry().value + callback(selected_project) + end) + return true + end, + prompt_title = "[CdProject]", + finder = finders.new_table({ + results = projects, + ---@param project CdProject.Project + entry_maker = function(project) + return { + value = project, + display = utils.format_entry(project, maxLength), + ordinal = project.path, + } + end, + }), + sorter = conf.generic_sorter(opts), + }) + :find() +end + ---@param opts? table local cd_project = function(opts) opts = opts or {} @@ -106,4 +147,5 @@ end return { cd_project = cd_project, search_and_add = search_and_add, + project_picker = project_picker, } diff --git a/lua/cd-project/api.lua b/lua/cd-project/api.lua index 896ce16..598b94f 100644 --- a/lua/cd-project/api.lua +++ b/lua/cd-project/api.lua @@ -80,12 +80,27 @@ local function add_project(project) local projects = repo.get_projects() if vim.tbl_contains(get_project_paths(), project.path) then - return vim.notify("Project already exists: " .. project.path) + return vim.notify( + "Project already exists: " .. project.path, + vim.log.levels.INFO, + { title = "cd-project.nvim" } + ) end table.insert(projects, project) repo.write_projects(projects) - vim.notify("Project added: \n" .. project.path) + vim.notify("Project added: \n" .. project.path, vim.log.levels.INFO, { title = "cd-project.nvim" }) +end + +---@param project CdProject.Project +local function delete_project(project) + local projects = repo.get_projects() + + local new_projects = vim.tbl_filter(function(p) + return p.name ~= project.name + end, projects) + repo.write_projects(new_projects) + vim.notify("Project deleted: \n" .. project.name, vim.log.levels.INFO, { title = "cd-project.nvim" }) end local function add_current_project() @@ -119,6 +134,7 @@ return { get_project_names = get_project_names, add_current_project = add_current_project, add_project = add_project, + delete_project = delete_project, back = back, find_project_dir = find_project_dir, } diff --git a/lua/cd-project/auto.lua b/lua/cd-project/auto.lua new file mode 100644 index 0000000..6d5e8e6 --- /dev/null +++ b/lua/cd-project/auto.lua @@ -0,0 +1,17 @@ +local api = require("cd-project.api") +local function setup() + local auto_group_name = "CdProjectPlugin" + + vim.api.nvim_create_augroup(auto_group_name, { clear = true }) + vim.api.nvim_create_autocmd({ "VimEnter" }, { + group = auto_group_name, + callback = function(_) + api.add_current_project() + vim.print("method called") + end, + }) +end + +return { + auto_register_project_setup = setup, +} diff --git a/lua/cd-project/config.lua b/lua/cd-project/config.lua index 91a668a..89c53c5 100644 --- a/lua/cd-project/config.lua +++ b/lua/cd-project/config.lua @@ -17,6 +17,7 @@ local default_config = { project_dir_pattern = { ".git", ".gitignore", "Cargo.toml", "package.json", "go.mod" }, choice_format = "both", -- optional, you can switch to "name" or "path" projects_picker = "vim-ui", -- optional, you can switch to `telescope` + auto_register_project = true, -- optional, toggle on/off the auto add project behaviour -- do whatever you like by hooks hooks = { { @@ -48,6 +49,9 @@ vim.g.cd_project_config = default_config M.setup = function(user_config) local previous_config = vim.g.cd_project_config or default_config vim.g.cd_project_config = vim.tbl_deep_extend("force", previous_config, user_config or {}) or default_config + if vim.g.cd_project_config.auto_register_project then + require("cd-project.auto").auto_register_project_setup() + end end return M diff --git a/plugin/cd-project.lua b/plugin/cd-project.lua index 0fcdec9..db6c7af 100644 --- a/plugin/cd-project.lua +++ b/plugin/cd-project.lua @@ -17,5 +17,6 @@ vim.g.cd_project_current_project = api.find_project_dir() vim.api.nvim_create_user_command("CdProject", adapter.cd_project, {}) vim.api.nvim_create_user_command("CdProjectAdd", api.add_current_project, {}) vim.api.nvim_create_user_command("CdProjectManualAdd", adapter.manual_cd_project, {}) -vim.api.nvim_create_user_command("CdSearchAndAdd", adapter.telescope_search_and_add, {}) +vim.api.nvim_create_user_command("CdProjectSearchAndAdd", adapter.telescope_search_and_add, {}) +vim.api.nvim_create_user_command("CdProjectDelete", adapter.delete_project, {}) vim.api.nvim_create_user_command("CdProjectBack", api.back, {})