dotfiles/.config/fish/conf.d/smartcd.fish

51 lines
1.6 KiB
Fish

status is-interactive; or exit
# Ensure original cd is saved once
functions -q __cd_orig; or functions --copy cd __cd_orig
function cd --wraps=cd --description "Change directory. No args goes to git root or $HOME. If already there, return to previous location."
# Skip history in subshells.
if status --is-command-substitution
builtin cd $argv
return $status
end
git rev-parse --is-inside-work-tree &>/dev/null
set -l is_git $status
if test (count $argv) -ne 0
__cd_orig $argv
else
if test $is_git -eq 0
set root (git rev-parse --show-toplevel)
else
set root ~
end
if not test (pwd) = $root
__cd_orig $root
else if set -q dirprev
if string match -q "$root*" "$dirprev[-1]"
__cd_orig -
else
set -l prompt "$dirprev[-1], is outside $root, are you sure? (y/n): "
while read --nchars 1 -l response --prompt-str="$prompt" or return 1
# clear prompt
printf "\033[1A\033[2K"
# printf "\033[1A\033[2K"
switch $response
case y Y
__cd_orig -
break
case n N
break
end
end
end
end
end
end
function smartcd_update --description "Update smartcd.fish with the latest from the upstream."
curl https://git.sr.ht/~ficd/smartcd.fish/blob/main/smartcd.fish \
-o $fish_config/conf.d/smartcd.fish
exec fish
end