Skip to content

Commit

Permalink
Auto add project && delete project command
Browse files Browse the repository at this point in the history
  • Loading branch information
LintaoAmons committed May 15, 2024
1 parent d907edd commit b115ede
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 3 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
{
Expand Down
7 changes: 7 additions & 0 deletions lua/cd-project/adapter/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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,
}
42 changes: 42 additions & 0 deletions lua/cd-project/adapter/telescope.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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 {}
Expand Down Expand Up @@ -106,4 +147,5 @@ end
return {
cd_project = cd_project,
search_and_add = search_and_add,
project_picker = project_picker,
}
20 changes: 18 additions & 2 deletions lua/cd-project/api.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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,
}
17 changes: 17 additions & 0 deletions lua/cd-project/auto.lua
Original file line number Diff line number Diff line change
@@ -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,
}
4 changes: 4 additions & 0 deletions lua/cd-project/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
{
Expand Down Expand Up @@ -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
3 changes: 2 additions & 1 deletion plugin/cd-project.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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, {})

0 comments on commit b115ede

Please sign in to comment.