From 4f27590b409cdd9022fe7ee4634985902993a43e Mon Sep 17 00:00:00 2001 From: Yi-Ting Shih Date: Sat, 12 Apr 2025 08:47:46 +0800 Subject: [PATCH] Feat: patch cd for nix develop support --- functions/cd.fish | 67 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 functions/cd.fish diff --git a/functions/cd.fish b/functions/cd.fish new file mode 100644 index 0000000..935ee76 --- /dev/null +++ b/functions/cd.fish @@ -0,0 +1,67 @@ +# +# Wrap the builtin cd command to maintain directory history. +# +function cd --description "Change directory" + set -l MAX_DIR_HIST 25 + + if set -q argv[2]; and begin + set -q argv[3] + or not test "$argv[1]" = -- + end + printf "%s\n" (_ "Too many args for cd command") >&2 + return 1 + end + +# Skip history in subshells. + if status --is-command-substitution + builtin cd $argv + return $status + end + +# Avoid set completions. + set -l previous $PWD + + if test "$argv" = - + if test "$__fish_cd_direction" = next + nextd + else + prevd + end + return $status + end + + builtin cd $argv + set -l cd_status $status + + if test $cd_status -eq 0 -a "$PWD" != "$previous" + set -q dirprev + or set -l dirprev + set -q dirprev[$MAX_DIR_HIST] + and set -e dirprev[1] + + # If dirprev, dirnext, __fish_cd_direction + # are set as universal variables, honor their scope. + + set -U -q dirprev + and set -U -a dirprev $previous + or set -g -a dirprev $previous + + set -U -q dirnext + and set -U -e dirnext + or set -e dirnext + + set -U -q __fish_cd_direction + and set -U __fish_cd_direction prev + or set -g __fish_cd_direction prev + end + + if git rev-parse --is-inside-work-tree >/dev/null 2>&1 + if test -f 'flake.nix' + echo 'Entering Nix develop shell...' + nix develop + return + end + end + + return $cd_status +end