86 lines
2.7 KiB
Lua
86 lines
2.7 KiB
Lua
---@param msg string
|
|
local function log_error(msg)
|
|
vim.notify(msg, vim.log.levels.ERROR, { title = "cd-project.nvim" })
|
|
end
|
|
|
|
---@param msg string
|
|
local function log_info(msg)
|
|
vim.notify(msg, vim.log.levels.INFO, { title = "cd-project.nvim" })
|
|
end
|
|
|
|
---@param path string
|
|
local function get_tail_of_path(path)
|
|
-- Remove leading directories, keep the last part
|
|
local tail = path:match("([^/]+)$")
|
|
local parent = path:match("^.*%/([^/]+)/?$") -- Get the parent directory
|
|
-- if foo/ return foo
|
|
if parent and not tail then
|
|
return parent
|
|
-- if foo/bar, return bar
|
|
else
|
|
return tail -- Return only the tail if there is no parent
|
|
end
|
|
end
|
|
|
|
---@param path string
|
|
local function remove_trailing_slash(path)
|
|
-- Remove trailing slash if it exists
|
|
return (path:gsub("(.)/*$", "%1"))
|
|
end
|
|
|
|
---@param project CdProject.Project
|
|
---@param max_len integer
|
|
local function format_entry(project, max_len)
|
|
local format = vim.g.cd_project_config.choice_format
|
|
if format == "name" then
|
|
return project.name
|
|
end
|
|
if format == "path" then
|
|
return project.path
|
|
end
|
|
return string.format("%-" .. max_len .. "s", project.name) .. " | " .. project.path
|
|
end
|
|
|
|
-- vague2k: We *could* check for the "find" command but then we would need to format
|
|
-- the telescope picker, which can lead to uneeded complexity.
|
|
--
|
|
-- I feel like not checking for "find" is a worthy trade off
|
|
--
|
|
-- TODO: Test on windows. I'm 98% sure fd handles path string formatting
|
|
local check_for_find_cmd = function()
|
|
-- if unix like system
|
|
if package.config:sub(1, 1) == "/" then
|
|
-- list of directories that should be excluded, that fill 1 of these 2 criteria
|
|
-- 1. Is reasonably unlikely that a user will not have a project worth adding in the directory
|
|
-- 2. Causes unreasonable hang times in executing command
|
|
-- a prime example would be the hidden "/Library" dir on macOS systems.
|
|
local find_command = (function()
|
|
if 1 == vim.fn.executable("fd") then
|
|
return "fd --type d --hidden -E Library -E .local -E .cache . ~"
|
|
elseif 1 == vim.fn.executable("fdfind") then
|
|
return "fdfind --type d --hidden -E Library -E .local -E .cache . ~"
|
|
end
|
|
end)()
|
|
return find_command
|
|
end
|
|
|
|
-- any system that isn't unix like
|
|
local find_command = (function()
|
|
if 1 == vim.fn.executable("fd") then
|
|
return { "fd", "--type", "d", "--color", "never" }
|
|
elseif 1 == vim.fn.executable("fdfind") then
|
|
return { "fdfind", "--type", "d", "--color", "never" }
|
|
end
|
|
end)()
|
|
return find_command
|
|
end
|
|
|
|
return {
|
|
log_error = log_error,
|
|
log_info = log_info,
|
|
get_tail_of_path = get_tail_of_path,
|
|
remove_trailing_slash = remove_trailing_slash,
|
|
format_entry = format_entry,
|
|
check_for_find_cmd = check_for_find_cmd,
|
|
}
|