I tried quite a lot Project Management plugins.
In the end,
I found all I need is an easier way to cd to another project directory.
This plugin did nothing but provide a simpler way to add, persist and switch to directories.
- Work out of box with default config
-- using lazy.nvim
return {
"LintaoAmons/cd-project.nvim",
tag = "v0.11.0", -- Optional, You can use pin to a tag for stability
}- Or, you want to customise the behaviour
---@type CdProject.Config
local opts = {
-- this json file is acting like a database to update and read the projects in real time.
-- So because it's just a json file, you can edit directly to add more paths you want manually
projects_config_filepath = vim.fs.normalize(vim.fn.stdpath("config") .. "/cd-project.nvim.json"),
-- this controls the behaviour of `CdProjectAdd` command about how to get the project directory
project_dir_pattern = { ".git", ".gitignore", "Cargo.toml", "package.json", "go.mod" },
choice_format = "both", -- optional, you can switch to "name" or "path"
projects_picker = "telescope", -- optional, you can switch to `vim-ui` or `snacks`
auto_register_project = false, -- optional, toggle on/off the auto add project behaviour
remember_project_position = true, -- optional, toggle on/off remembering last position in projects
-- do whatever you like by hooks
hooks = {
{
callback = function(dir)
vim.notify("switched to dir: " .. dir)
end,
},
{
callback = function(dir)
vim.notify("switched to dir: " .. dir)
end, -- required, action when trigger the hook
name = "cd hint", -- optional
order = 1, -- optional, the exection order if there're multiple hooks to be trigger at one point
pattern = "cd-project.nvim", -- optional, trigger hook if contains pattern
trigger_point = "DISABLE", -- optional, enum of trigger_points, default to `AFTER_CD`
match_rule = function(dir) -- optional, a function return bool. if have this fields, then pattern will be ignored
return true
end,
},
}
}
return {
"LintaoAmons/cd-project.nvim",
tag = "v0.10.0", -- Optional, You can also use tag to pin the plugin version for stability
init = function() -- use init if you want enable auto_register_project, otherwise config is good
require("cd-project").setup(opts)
end,
}| Command | Description |
|---|---|
CdProject [name] |
change working directory; with a name (tab-completed), jump directly without the picker |
CdProjectAdd [name] |
add current project's directory to the database(json file), optionally with a name |
CdProjectBack |
quickly switch between current project and previous project |
CdProjectManualAdd |
Manually add a path and optionally give it a name |
CdProjectSearchAndAdd |
fuzzy find directories in $HOME using the configured picker and optionally give it a name |
CdProjectDelete |
pick a project to delete from the database |
CdProjectPrune[!] |
remove projects whose directory no longer exists (! skips the confirmation) |
CdProjectScan [dir] |
add every git repo found under dir (default: cwd) to the database |
Since CdProject takes a name, you can map keys to your most used projects:
vim.keymap.set("n", "<leader>pn", "<cmd>CdProject my-notes<cr>")Set projects_picker to choose how projects are listed:
| Picker | Requires | Notes |
|---|---|---|
telescope |
telescope.nvim | default |
snacks |
snacks.nvim with picker enabled |
supports the same keymaps as telescope |
vim-ui |
nothing (uses vim.ui.select) |
select-only, no extra keymaps |
Available in both the
telescopeandsnackspickers.
| Map | Action |
|---|---|
<cr> |
cd into project |
<c-t> |
tcd into project (open in new tab) |
<c-e> |
lcd into project (open in window) |
<c-d> |
Delete project |
<c-r> |
Rename project |
Don't hesitate to ask me anything about the codebase if you want to contribute.
By telegram or 微信: CateFat

