mirror of
https://github.com/fish-shell/fish-shell.git
synced 2024-11-23 17:51:31 +08:00
51468b7646
It's currently too easy for someone to bork their shell by doing something like `function test; return 0; end`. That's obviously a silly, contrived, example but the point is that novice users who learn about functions are prone to do something like that without realizing it will bork the shell. Even expert users who know about the `test` builtin might forget that, say, `pwd` is a builtin. This change adds a `--shadow-builtin` flag that must be specified to indicate you know what you're doing. Fixes #3000
43 lines
935 B
Fish
43 lines
935 B
Fish
#
|
|
# Wrap the builtin cd command to maintain directory history.
|
|
#
|
|
function cd --shadow-builtin --description "Change directory"
|
|
set -l MAX_DIR_HIST 25
|
|
|
|
if test (count $argv) -gt 1
|
|
printf "%s\n" (_ "Too many args for cd command")
|
|
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[$MAX_DIR_HIST]
|
|
and set -e dirprev[1]
|
|
set -g dirprev $dirprev $previous
|
|
set -e dirnext
|
|
set -g __fish_cd_direction prev
|
|
end
|
|
|
|
return $cd_status
|
|
end
|