mirror of
https://github.com/fish-shell/fish-shell
synced 2025-01-12 21:18:53 +00:00
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
This commit is contained in:
parent
de1258e09b
commit
9d2b53450a
5 changed files with 36 additions and 27 deletions
|
@ -14,7 +14,7 @@ If `DIRECTORY` is a relative path, the paths found in the `CDPATH` environment v
|
||||||
|
|
||||||
Note that the shell will attempt to change directory without requiring `cd` if the name of a directory is provided (starting with `.`, `/` or `~`, or ending with `/`).
|
Note that the shell will attempt to change directory without requiring `cd` if the name of a directory is provided (starting with `.`, `/` or `~`, or ending with `/`).
|
||||||
|
|
||||||
Fish also ships a wrapper function around `cd` that understands `cd -` as changing to the previous directory. See <a href="commands.html#prevd">`prevd`</a>.
|
Fish also ships a wrapper function around the builtin `cd` that understands `cd -` as changing to the previous directory. See also <a href="commands.html#prevd">`prevd`</a>. This wrapper function maintains a history of the 25 most recently visited directories in the `$dirprev` and `$dirnext` global variables.
|
||||||
|
|
||||||
\subsection cd-example Examples
|
\subsection cd-example Examples
|
||||||
|
|
||||||
|
|
|
@ -10,3 +10,5 @@ dirh
|
||||||
`dirh` prints the current directory history. The current position in the history is highlighted using the color defined in the `fish_color_history_current` environment variable.
|
`dirh` prints the current directory history. The current position in the history is highlighted using the color defined in the `fish_color_history_current` environment variable.
|
||||||
|
|
||||||
`dirh` does not accept any parameters.
|
`dirh` does not accept any parameters.
|
||||||
|
|
||||||
|
Note that the `cd` command limits directory history to the 25 most recently visited directories. The history is stored in the `$dirprev` and `$dirnext` variables.
|
||||||
|
|
|
@ -11,6 +11,7 @@ nextd [ -l | --list ] [POS]
|
||||||
|
|
||||||
If the `-l` or `--list` flag is specified, the current directory history is also displayed.
|
If the `-l` or `--list` flag is specified, the current directory history is also displayed.
|
||||||
|
|
||||||
|
Note that the `cd` command limits directory history to the 25 most recently visited directories. The history is stored in the `$dirprev` and `$dirnext` variables which this command manipulates.
|
||||||
|
|
||||||
\subsection nextd-example Example
|
\subsection nextd-example Example
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ prevd [ -l | --list ] [POS]
|
||||||
|
|
||||||
If the `-l` or `--list` flag is specified, the current history is also displayed.
|
If the `-l` or `--list` flag is specified, the current history is also displayed.
|
||||||
|
|
||||||
|
Note that the `cd` command limits directory history to the 25 most recently visited directories. The history is stored in the `$dirprev` and `$dirnext` variables which this command manipulates.
|
||||||
|
|
||||||
\subsection prevd-example Example
|
\subsection prevd-example Example
|
||||||
|
|
||||||
|
|
|
@ -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"
|
function cd --description "Change directory"
|
||||||
|
set -l MAX_DIR_HIST 25
|
||||||
|
|
||||||
# Skip history in subshells
|
if test (count $argv) -gt 1
|
||||||
if status --is-command-substitution
|
printf "%s\n" (_ "Too many args for cd command")
|
||||||
builtin cd $argv
|
return 1
|
||||||
return $status
|
end
|
||||||
end
|
|
||||||
|
|
||||||
# Avoid set completions
|
# Skip history in subshells.
|
||||||
set -l previous $PWD
|
if status --is-command-substitution
|
||||||
|
builtin cd $argv
|
||||||
|
return $status
|
||||||
|
end
|
||||||
|
|
||||||
if test $argv[1] = - ^/dev/null
|
# Avoid set completions
|
||||||
if test "$__fish_cd_direction" = next ^/dev/null
|
set -l previous $PWD
|
||||||
nextd
|
|
||||||
else
|
|
||||||
prevd
|
|
||||||
end
|
|
||||||
return $status
|
|
||||||
end
|
|
||||||
|
|
||||||
builtin cd $argv[1]
|
if test "$argv" = "-"
|
||||||
set -l cd_status $status
|
if test "$__fish_cd_direction" = "next"
|
||||||
|
nextd
|
||||||
|
else
|
||||||
|
prevd
|
||||||
|
end
|
||||||
|
return $status
|
||||||
|
end
|
||||||
|
|
||||||
if test $cd_status = 0 -a "$PWD" != "$previous"
|
builtin cd $argv
|
||||||
set -g dirprev $dirprev $previous
|
set -l cd_status $status
|
||||||
set -e dirnext
|
|
||||||
set -g __fish_cd_direction prev
|
|
||||||
end
|
|
||||||
|
|
||||||
return $cd_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
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue