diff options
author | Kurtis Rader <krader@skepticism.us> | 2016-03-21 16:51:39 -0700 |
---|---|---|
committer | Kurtis Rader <krader@skepticism.us> | 2016-03-23 13:36:00 -0700 |
commit | 9d2b53450ac038bcef7c62191770e9b85b6017f9 (patch) | |
tree | 83f6c1c2a883c6825ab6139ec74384a09dbbc93b /share | |
parent | de1258e09b3cd4605995297d400ff134fd68b226 (diff) |
limit size of cd history to 25 directories
The existing implementation grows the $dirprev array without bounds. Besides
causing what would appear to be a memory leak it also makes the nextd and
prevd commands more expensive than they need to be. It also makes it harder to
create a useful "menu" cd command.
In addition to implementing a reasonable limit on the size of the $dirprev
array I've reformatted the code using fish_indent.
Update the documentation to include mentions of the $dirprev and $dirnext
variables as well as the limit on how much directory history is kept.
Fixes 2836
Diffstat (limited to 'share')
-rw-r--r-- | share/functions/cd.fish | 69 |
1 files changed, 37 insertions, 32 deletions
diff --git a/share/functions/cd.fish b/share/functions/cd.fish index 8faa469d..a1b6b2ac 100644 --- a/share/functions/cd.fish +++ b/share/functions/cd.fish @@ -1,36 +1,41 @@ # -# The following functions add support for a directory history +# Wrap the builtin cd command to maintain directory history. # - function cd --description "Change directory" - - # 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[1] = - ^/dev/null - if test "$__fish_cd_direction" = next ^/dev/null - nextd - else - prevd - end - return $status - end - - builtin cd $argv[1] - set -l cd_status $status - - if test $cd_status = 0 -a "$PWD" != "$previous" - set -g dirprev $dirprev $previous - set -e dirnext - set -g __fish_cd_direction prev - end - - return $cd_status + 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 - |