Skip to content

Commit df25281

Browse files
authored
Merge pull request #29 from mgastonportillo/main
add: `tcd` support
2 parents 21da0f5 + 0651443 commit df25281

14 files changed

Lines changed: 541 additions & 404 deletions

File tree

.stylua.toml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
column_width = 120
2+
line_endings = "Unix"
3+
indent_type = "Spaces"
4+
indent_width = 2
5+
quote_style = "AutoPreferDouble"

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ return {
7777
| Command | Description |
7878
| -------------------- | --------------------------------------------------------------------------- |
7979
| `CdProject` | change working directory |
80+
| `CdProjectTab` | change working directory in tab |
8081
| `CdProjectAdd` | add current project's directory to the database(json file) |
8182
| `CdProjectBack` | quickly switch between current project and previous project |
8283
| `CdProjectManualAdd` | Manually add a path and optionally give it a name |

lua/cd-project/adapter/init.lua

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,44 @@
11
-- TODO: refator to picker
22

3+
local function cd_project_in_tab()
4+
local projects_picker = vim.g.cd_project_config.projects_picker
5+
if projects_picker == "telescope" then
6+
return require("cd-project.adapter.telescope").cd_project_in_tab()
7+
end
8+
9+
require("cd-project.adapter.vim-ui").cd_project_in_tab()
10+
end
11+
312
local function cd_project()
4-
local projects_picker = vim.g.cd_project_config.projects_picker
5-
if projects_picker == "telescope" then
6-
return require("cd-project.adapter.telescope").cd_project()
7-
end
13+
local projects_picker = vim.g.cd_project_config.projects_picker
14+
if projects_picker == "telescope" then
15+
return require("cd-project.adapter.telescope").cd_project()
16+
end
817

9-
require("cd-project.adapter.vim-ui").cd_project()
18+
require("cd-project.adapter.vim-ui").cd_project()
1019
end
1120

1221
local function manual_cd_project()
13-
require("cd-project.adapter.vim-ui").manual_cd_project()
22+
require("cd-project.adapter.vim-ui").manual_cd_project()
1423
end
1524

1625
local function telescope_search_and_add()
17-
local projects_picker = vim.g.cd_project_config.projects_picker
18-
if projects_picker == "telescope" then
19-
return require("cd-project.adapter.telescope").search_and_add()
20-
end
26+
local projects_picker = vim.g.cd_project_config.projects_picker
27+
if projects_picker == "telescope" then
28+
return require("cd-project.adapter.telescope").search_and_add()
29+
end
2130
end
2231

2332
local function delete_project()
24-
require("cd-project.adapter.telescope").project_picker(function (project)
25-
require("cd-project.api").delete_project( project)
33+
require("cd-project.adapter.telescope").project_picker(function(project)
34+
require("cd-project.api").delete_project(project)
2635
end)
2736
end
2837

2938
return {
30-
cd_project = cd_project,
31-
manual_cd_project = manual_cd_project,
32-
telescope_search_and_add = telescope_search_and_add,
39+
cd_project = cd_project,
40+
cd_project_in_tab = cd_project_in_tab,
41+
manual_cd_project = manual_cd_project,
42+
telescope_search_and_add = telescope_search_and_add,
3343
delete_project = delete_project,
3444
}
Lines changed: 155 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
local utils = require("cd-project.utils")
22
local success, _ = pcall(require, "telescope.pickers")
33
if not success then
4-
utils.log_error("telescope not installed")
5-
return
4+
utils.log_error("telescope not installed")
5+
return
66
end
77
local pickers = require("telescope.pickers")
88
local finders = require("telescope.finders")
@@ -16,136 +16,174 @@ local api = require("cd-project.api")
1616
---@param callback fun(project: CdProject.Project): nil
1717
---@param opts? table
1818
local function project_picker(callback, opts)
19-
opts = opts or {}
20-
-- TODO: a format function
21-
local projects = repo.get_projects()
22-
local maxLength = 0
23-
for _, project in ipairs(projects) do
24-
if #project.name > maxLength then
25-
maxLength = #project.name
26-
end
27-
end
19+
opts = opts or {}
20+
-- TODO: a format function
21+
local projects = repo.get_projects()
22+
local maxLength = 0
23+
for _, project in ipairs(projects) do
24+
if #project.name > maxLength then
25+
maxLength = #project.name
26+
end
27+
end
2828

29-
pickers
30-
.new(opts, {
31-
attach_mappings = function(prompt_bufnr)
32-
actions.select_default:replace(function()
33-
actions.close(prompt_bufnr)
34-
---@type CdProject.Project
35-
local selected_project = action_state.get_selected_entry().value
36-
callback(selected_project)
37-
end)
38-
return true
39-
end,
40-
prompt_title = "[CdProject]",
41-
finder = finders.new_table({
42-
results = projects,
43-
---@param project CdProject.Project
44-
entry_maker = function(project)
45-
return {
46-
value = project,
47-
display = utils.format_entry(project, maxLength),
48-
ordinal = project.path,
49-
}
50-
end,
51-
}),
52-
sorter = conf.generic_sorter(opts),
53-
})
54-
:find()
29+
pickers
30+
.new(opts, {
31+
attach_mappings = function(prompt_bufnr)
32+
actions.select_default:replace(function()
33+
actions.close(prompt_bufnr)
34+
---@type CdProject.Project
35+
local selected_project = action_state.get_selected_entry().value
36+
callback(selected_project)
37+
end)
38+
return true
39+
end,
40+
prompt_title = "[CdProject]",
41+
finder = finders.new_table({
42+
results = projects,
43+
---@param project CdProject.Project
44+
entry_maker = function(project)
45+
return {
46+
value = project,
47+
display = utils.format_entry(project, maxLength),
48+
ordinal = project.path,
49+
}
50+
end,
51+
}),
52+
sorter = conf.generic_sorter(opts),
53+
})
54+
:find()
5555
end
5656

5757
---@param opts? table
5858
local cd_project = function(opts)
59-
opts = opts or {}
60-
local projects = repo.get_projects()
61-
local maxLength = 0
62-
for _, project in ipairs(projects) do
63-
if #project.name > maxLength then
64-
maxLength = #project.name
65-
end
66-
end
59+
opts = opts or {}
60+
local projects = repo.get_projects()
61+
local maxLength = 0
62+
for _, project in ipairs(projects) do
63+
if #project.name > maxLength then
64+
maxLength = #project.name
65+
end
66+
end
6767

68-
pickers
69-
.new(opts, {
70-
attach_mappings = function(prompt_bufnr)
71-
actions.select_default:replace(function()
72-
actions.close(prompt_bufnr)
73-
---@type CdProject.Project
74-
local selected_project = action_state.get_selected_entry().value
75-
api.cd_project(selected_project.path)
76-
end)
77-
return true
78-
end,
79-
prompt_title = "cd to project",
80-
finder = finders.new_table({
81-
results = projects,
82-
---@param project CdProject.Project
83-
entry_maker = function(project)
84-
return {
85-
value = project,
86-
display = utils.format_entry(project, maxLength),
87-
ordinal = project.path,
88-
}
89-
end,
90-
}),
91-
sorter = conf.generic_sorter(opts),
92-
})
93-
:find()
68+
pickers
69+
.new(opts, {
70+
attach_mappings = function(prompt_bufnr)
71+
actions.select_default:replace(function()
72+
actions.close(prompt_bufnr)
73+
---@type CdProject.Project
74+
local selected_project = action_state.get_selected_entry().value
75+
api.cd_project(selected_project.path)
76+
end)
77+
return true
78+
end,
79+
prompt_title = "cd to project",
80+
finder = finders.new_table({
81+
results = projects,
82+
---@param project CdProject.Project
83+
entry_maker = function(project)
84+
return {
85+
value = project,
86+
display = utils.format_entry(project, maxLength),
87+
ordinal = project.path,
88+
}
89+
end,
90+
}),
91+
sorter = conf.generic_sorter(opts),
92+
})
93+
:find()
94+
end
95+
96+
---@param opts? table
97+
local cd_project_in_tab = function(opts)
98+
opts = opts or {}
99+
local projects = repo.get_projects()
100+
local maxLength = 0
101+
for _, project in ipairs(projects) do
102+
if #project.name > maxLength then
103+
maxLength = #project.name
104+
end
105+
end
106+
107+
pickers
108+
.new(opts, {
109+
attach_mappings = function(prompt_bufnr)
110+
actions.select_default:replace(function()
111+
actions.close(prompt_bufnr)
112+
---@type CdProject.Project
113+
local selected_project = action_state.get_selected_entry().value
114+
api.cd_project_in_tab(selected_project.path)
115+
end)
116+
return true
117+
end,
118+
prompt_title = "tcd to project",
119+
finder = finders.new_table({
120+
results = projects,
121+
---@param project CdProject.Project
122+
entry_maker = function(project)
123+
return {
124+
value = project,
125+
display = utils.format_entry(project, maxLength),
126+
ordinal = project.path,
127+
}
128+
end,
129+
}),
130+
sorter = conf.generic_sorter(opts),
131+
})
132+
:find()
94133
end
95134

96135
local search_and_add = function(opts)
97-
opts = opts or {}
136+
opts = opts or {}
98137

99-
local find_command = utils.check_for_find_cmd()
100-
if not find_command then
101-
utils.log_error("You need to install fd or find.")
102-
return
103-
end
138+
local find_command = utils.check_for_find_cmd()
139+
if not find_command then
140+
utils.log_error("You need to install fd or find.")
141+
return
142+
end
104143

105-
vim.fn.jobstart(find_command, {
106-
stdout_buffered = true,
107-
on_stdout = function(_, data)
108-
pickers
109-
.new(opts, {
110-
attach_mappings = function(prompt_bufnr)
111-
actions.select_default:replace(function()
112-
actions.close(prompt_bufnr)
113-
local selected_dir = action_state.get_selected_entry().value
144+
vim.fn.jobstart(find_command, {
145+
stdout_buffered = true,
146+
on_stdout = function(_, data)
147+
pickers
148+
.new(opts, {
149+
attach_mappings = function(prompt_bufnr)
150+
actions.select_default:replace(function()
151+
actions.close(prompt_bufnr)
152+
local selected_dir = action_state.get_selected_entry().value
114153

115-
vim.ui.input({ prompt = "Add a project name: " }, function(name)
116-
if not name or name == "" then
117-
vim.notify(
118-
'No name given, using "' .. utils.get_tail_of_path(selected_dir) .. '" instead'
119-
)
120-
local project = api.build_project_obj(selected_dir)
121-
if not project then
122-
return
123-
end
124-
return api.add_project(project)
125-
end
154+
vim.ui.input({ prompt = "Add a project name: " }, function(name)
155+
if not name or name == "" then
156+
vim.notify('No name given, using "' .. utils.get_tail_of_path(selected_dir) .. '" instead')
157+
local project = api.build_project_obj(selected_dir)
158+
if not project then
159+
return
160+
end
161+
return api.add_project(project)
162+
end
126163

127-
local project = api.build_project_obj(selected_dir, name)
128-
if not project then
129-
return
130-
end
131-
return api.add_project(project)
132-
end)
133-
end)
134-
return true
135-
end,
136-
prompt_title = "Select dir to add",
137-
finder = finders.new_table({
138-
results = data,
139-
}),
140-
sorter = conf.file_sorter(opts),
141-
})
142-
:find()
143-
end,
144-
})
164+
local project = api.build_project_obj(selected_dir, name)
165+
if not project then
166+
return
167+
end
168+
return api.add_project(project)
169+
end)
170+
end)
171+
return true
172+
end,
173+
prompt_title = "Select dir to add",
174+
finder = finders.new_table({
175+
results = data,
176+
}),
177+
sorter = conf.file_sorter(opts),
178+
})
179+
:find()
180+
end,
181+
})
145182
end
146183

147184
return {
148-
cd_project = cd_project,
149-
search_and_add = search_and_add,
185+
cd_project = cd_project,
186+
cd_project_in_tab = cd_project_in_tab,
187+
search_and_add = search_and_add,
150188
project_picker = project_picker,
151189
}

0 commit comments

Comments
 (0)