113 lines
3.1 KiB
Bash
Executable file
113 lines
3.1 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
|
|
# Define constants
|
|
FZF_THEME="$HOME/.local/bin/scripts/fzf_theme"
|
|
LS_OPTS="-la --color=always"
|
|
|
|
# List of directories to include in the search
|
|
INCLUDED_DIRS=(
|
|
"$HOME/.dotfiles"
|
|
"$HOME/Documents"
|
|
"$HOME/.local/bin"
|
|
"$HOME/Google Drive/My Drive"
|
|
)
|
|
|
|
# Function to handle cleanup on keyboard interrupt or stop
|
|
cleanup() {
|
|
echo "Interrupt detected. Cleaning up..."
|
|
|
|
if pgrep -x tmux >/dev/null && [[ -n "$TMUX" ]]; then
|
|
local original_session
|
|
original_session=$(tmux list-sessions -F "#{session_name}" | tail -n 1)
|
|
tmux switch-client -t "$original_session"
|
|
elif command -v wezterm >/dev/null && wezterm --version | grep -q "wezterm"; then
|
|
local tab_id
|
|
tab_id=$(wezterm cli list | tail -n 1 | awk '{print $2}')
|
|
wezterm cli activate-tab --tab-id "$tab_id"
|
|
fi
|
|
|
|
exit 0
|
|
}
|
|
|
|
# Trap the SIGINT (Ctrl+C) and SIGTSTP (Ctrl+Z) signals to handle cleanup
|
|
trap cleanup SIGINT SIGTSTP
|
|
|
|
# Function to find and deduplicate directories
|
|
find_directories() {
|
|
local finder="$1"
|
|
local include_params=("${@:2}")
|
|
|
|
# Use a single call to find directories, optimizing the process
|
|
"$finder" -H --min-depth 1 --max-depth 3 --type d . "${include_params[@]}" | sort -u
|
|
}
|
|
|
|
# Function to search and select directories using a fuzzy finder
|
|
search_dirs() {
|
|
local finder="$1"
|
|
local fuzzy_finder="$2"
|
|
local include_params=("${INCLUDED_DIRS[@]}")
|
|
|
|
local all_dirs
|
|
all_dirs=$(find_directories "$finder" "${include_params[@]}")
|
|
|
|
local selected
|
|
selected=$(
|
|
echo "$all_dirs" | "$fuzzy_finder" "$($FZF_THEME)" --cycle \
|
|
--preview "if command -v eza >/dev/null; then eza $LS_OPTS --group-directories-first {}; else ls $LS_OPTS {}; fi"
|
|
)
|
|
|
|
if [ -n "$selected" ]; then
|
|
echo "$selected"
|
|
else
|
|
echo "No directory selected. Exiting." >&2
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Function to handle terminal multiplexer or tab management
|
|
handle_terminal() {
|
|
local selected="$1"
|
|
local selected_name
|
|
|
|
selected_name=$(basename "$selected" | tr '.' '_')
|
|
local full_path="${selected/#\~/$HOME}"
|
|
|
|
if pgrep -x tmux >/dev/null && [[ -n "$TMUX" ]]; then
|
|
if ! tmux has-session -t="$selected_name" 2>/dev/null; then
|
|
tmux new-session -ds "$selected_name" -c "$selected"
|
|
fi
|
|
tmux switch-client -t "$selected_name"
|
|
elif command -v wezterm >/dev/null && wezterm --version | grep -q "wezterm"; then
|
|
local workspace_exists
|
|
workspace_exists=$(wezterm cli list-workspaces | grep -w "$selected_name")
|
|
|
|
if [[ -z $workspace_exists ]]; then
|
|
wezterm cli create-workspace --name "$selected_name" --cwd "$full_path" # Create a new workspace
|
|
fi
|
|
wezterm cli switch-to-workspace --name "$selected_name"
|
|
else
|
|
echo "Warning: No terminal multiplexer detected (tmux or WezTerm)." >&2
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Main function to coordinate the script
|
|
main() {
|
|
local selected
|
|
|
|
if command -v sk >/dev/null && sk --version >/dev/null 2>&1; then
|
|
selected=$(search_dirs "fd" "sk")
|
|
elif command -v fzf >/dev/null && fzf --version >/dev/null 2>&1; then
|
|
selected=$(search_dirs "fd" "fzf")
|
|
else
|
|
echo "Warning: No fuzzy finder program detected (fzf or sk). Install one or use command line arguments." >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -n "$selected" ]]; then
|
|
handle_terminal "$selected"
|
|
fi
|
|
}
|
|
|
|
# Execute the main function
|
|
main
|