dotfiles/home/zsh/files/fzgo.zsh

110 lines
3.1 KiB
Bash
Raw Normal View History

2025-01-28 01:20:00 +01:00
local function cd_to() {
setopt localoptions pipefail no_aliases 2> /dev/null
local dir=$1
if [[ -z "$dir" ]]; then
zle redisplay
return 0
fi
zle push-line # Clear buffer. Auto-restored on next prompt.
cd $dir
zle accept-line
local ret=$?
unset dir # ensure this doesn't end up appearing in prompt expansion
zle reset-prompt
}
local function get_entries() {
file_type=$1
if [ ! -d "$XDG_CONFIG_HOME/fzgo/entries" ]; then
return
fi
for entry in "$XDG_CONFIG_HOME/fzgo/entries/$file_type"/*; do
if [ -L "$entry" ]; then
2025-01-28 01:41:03 +01:00
entry=$(realpath "$entry")
2025-01-28 01:41:54 +01:00
fi
2025-01-28 01:41:03 +01:00
if [ -d "$entry" ]; then
fd . "$entry" -t "$file_type"
2025-01-28 01:20:00 +01:00
else
cat "$entry"
fi
done
}
function fzgo_update_cache() {
2025-01-28 01:37:58 +01:00
# Check if the directory exists and it contains entries
if [ ! -d "$XDG_CONFIG_HOME/fzgo/entries" ]; then
return
fi
for file_type_dir in "$XDG_CONFIG_HOME/fzgo/entries"/*(N); do
2025-01-28 01:20:00 +01:00
mkdir -p "$XDG_CACHE_HOME/fzgo/entries"
for entry in "$file_type_dir"/*; do
file_type=$(basename "$file_type_dir")
mkdir -p "$XDG_CACHE_HOME/fzgo/entries/$file_type"
if [ -L "$entry" ]; then
2025-01-28 01:41:03 +01:00
entry=$(realpath "$entry")
2025-01-28 01:41:54 +01:00
fi
2025-01-28 01:41:03 +01:00
if [ -d "$entry" ]; then
out_file="$(echo "$entry" | sed 's\/\|\g')"
out_file="$XDG_CACHE_HOME/fzgo/entries/$file_type/$out_file"
mkdir -p "$(dirname \"$out_file\")"
fd . "$entry" -t "$file_type" > "$out_file"
2025-01-28 01:20:00 +01:00
fi
done
done
}
local function find_global() {
file_type=$1
FZGO_RECENTS=$XDG_CACHE_HOME/fzgo/recent_paths_$file_type
mkdir -p $(dirname $FZGO_RECENTS)
touch $FZGO_RECENTS
FZGO_RECENT_ENTRIES=$(cat $FZGO_RECENTS)
FZGO_ENTRIES=$(get_entries $file_type)
file="$(echo $FZGO_RECENT_ENTRIES'\n'$FZGO_ENTRIES | awk '!x[$0]++' | fzgo)"
echo "$file" | cat - $FZGO_RECENTS | awk '!x[$0]++' > /tmp/fzgo_paths_recents_$file_type && mv /tmp/fzgo_paths_recents_$file_type $FZGO_RECENTS
echo "$file"
}
local function find_local() {
fd . -t $1 | fzgo
}
local function open_path() {
file_type=$1
search_fn=$2
selection="$($search_fn $file_type)"
if [ "$selection" = "" ]; then
zle reset-prompt
return
fi
if [ "$LBUFFER" = "" ]; then
if [ "$file_type" = "d" ]; then
cd_to "$selection"
else
selection=$(realpath "$selection")
parent=$(dirname "$selection")
cd_to "$parent"
$EDITOR "$selection"
fi
else
emulate -L zsh
zle -I
LBUFFER="${LBUFFER}\"$selection\""
zle reset-prompt
fi
}
function fzgo_global_d() { open_path d find_global }
function fzgo_global_f() { open_path f find_global }
function fzgo_local_f() { open_path f find_local }
function fzgo_register_key() {
zle -N $2
bindkey "^$1" $2
bindkey -M emacs "^$1" $2
bindkey -M vicmd "^$1" $2
bindkey -M viins "^$1" $2
}