74 lines
1.7 KiB
Nix
74 lines
1.7 KiB
Nix
{ ... }: {
|
|
text = ''
|
|
# CD (back to) directory.
|
|
# Goes to the exact-match dir first. If no exact match found, it finds first directory that contains the input (case-insensitive).
|
|
# Usage: cdd <DIR>
|
|
function cdd() {
|
|
local target="''${1}"
|
|
|
|
if [[ "''${target}" = "" ]]; then
|
|
help cdd
|
|
return 2
|
|
fi
|
|
|
|
local array=($(_cdd_directories))
|
|
local result
|
|
|
|
# Check for exact match ELSE look for containing.
|
|
if _contains ''${target} ''${array[@]}; then
|
|
local current="''${PWD%/*}"
|
|
result="''${current%\/$target\/*}/''${target}"
|
|
else
|
|
# Make search case-insensitive.
|
|
shopt -s nocasematch
|
|
|
|
# Find dir name that contains input.
|
|
local found=1
|
|
for (( idx=''${#array[@]}-1 ; idx>=0 ; idx-- )); do
|
|
dir="''${array[idx]}"
|
|
[[ "''${dir}" =~ "''${target}" ]] && found=0
|
|
[[ ''${found} = 0 ]] && result="/''${dir}''${result}"
|
|
done
|
|
|
|
# Clean-up???
|
|
shopt -u nocasematch
|
|
fi
|
|
|
|
# Go there!
|
|
if [[ "''${result}" != "" ]]; then
|
|
echo "''${result}"
|
|
cd "''${result}"
|
|
else
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# CLI cd. Opens CLI file manager.
|
|
function ccd() {
|
|
local tmp="$(mktemp -t "yazi-cwd.XXXXXX")"
|
|
yazi "$@" --cwd-file="$tmp"
|
|
if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
|
|
cd -- "$cwd"
|
|
fi
|
|
rm -f -- "$tmp"
|
|
}
|
|
|
|
# Get list of all parent dirs.
|
|
function _cdd_directories() {
|
|
local array
|
|
IFS='/' read -r -a array <<< "''${PWD}"
|
|
array=("''${array[@]:1}")
|
|
unset array[-1]
|
|
printf "%s\n" "''${array[@]}"
|
|
}
|
|
|
|
function _comp_cdd() {
|
|
local IFS=$'\n'
|
|
local dirs=($(_cdd_directories))
|
|
_autocomplete_first ''${dirs[@]}
|
|
}
|
|
|
|
complete -o nosort -o filenames -F _comp_cdd cdd
|
|
'';
|
|
}
|