52 lines
1.1 KiB
Lua
52 lines
1.1 KiB
Lua
local wezterm = require("wezterm")
|
|
local act = wezterm.action
|
|
|
|
local M = {}
|
|
|
|
local fd = "~/.nix-profile/bin/fd"
|
|
|
|
M.toggle = function(window, pane)
|
|
local projects = {}
|
|
|
|
local success, stdout, stderr = wezterm.run_child_process({
|
|
fd,
|
|
"-HI",
|
|
"^.git$",
|
|
"--max-depth=4",
|
|
"--prune",
|
|
os.getenv("HOME") .. "/projects",
|
|
os.getenv("HOME") .. "/.config",
|
|
os.getenv("HOME") .. "/src",
|
|
})
|
|
|
|
if not success then
|
|
wezterm.log_error("Failed to run fd: " .. stderr)
|
|
return
|
|
end
|
|
|
|
for line in stdout:gmatch("([^\n]*)\n?") do
|
|
local project = line:gsub("/.git.*$", "")
|
|
local label = project
|
|
local id = project:gsub(".*/", "")
|
|
table.insert(projects, { label = tostring(label), id = tostring(id) })
|
|
end
|
|
|
|
window:perform_action(
|
|
act.InputSelector({
|
|
action = wezterm.action_callback(function(win, _, id, label)
|
|
if not id and not label then
|
|
wezterm.log_info("Cancelled")
|
|
else
|
|
wezterm.log_info("Selected " .. label)
|
|
win:perform_action(act.SwitchToWorkspace({ name = id, spawn = { cwd = label } }), pane)
|
|
end
|
|
end),
|
|
fuzzy = true,
|
|
title = "Select project",
|
|
choices = projects,
|
|
}),
|
|
pane
|
|
)
|
|
end
|
|
|
|
return M
|