aboutsummaryrefslogtreecommitdiffhomepage
path: root/share
diff options
context:
space:
mode:
authorGravatar Kurtis Rader <krader@skepticism.us>2016-03-21 16:51:39 -0700
committerGravatar Kurtis Rader <krader@skepticism.us>2016-03-23 13:36:00 -0700
commit9d2b53450ac038bcef7c62191770e9b85b6017f9 (patch)
tree83f6c1c2a883c6825ab6139ec74384a09dbbc93b /share
parentde1258e09b3cd4605995297d400ff134fd68b226 (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.fish69
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
-