How do you set up the Z shell such that typing cd - gives you a list of previously visited paths, and cd -1, -2, -3, etc. will then take you to the directories?
c- minus is designed for this kind of requirement.
It support regex match, using md5 hash to void duplication in pushd
.
Easily to dump and load.
This gif shows some basic operations.
you can check it out on https://github.com/whitebob/cminus
If you have setopt AUTO_PUSHD
in your .zshrc
then cd
will automatically do a pushd
of each directory you change to. Taking the example from ZyX:
$ setopt AUTO_PUSHD
$ mkdir -p 1/2/3/4
$ cd 1
$ cd 2
$ cd 3
$ cd 4
You can see a list of the directories using dirs
:
$ dirs -v
0 ~/1/2/3/4
1 ~/1/2/3
2 ~/1/2
3 ~/1
4 ~
To be able to tab complete the list you can use the +
and -
arguments with cd
(<TAB>
meaning you hit the tab key):
$ cd +<TAB>
1 -- ~/1/2/3
2 -- ~/1/2
3 -- ~/1
4 -- ~
Or the reverse:
$ cd -<TAB>
0 -- ~
1 -- ~/1
2 -- ~/1/2
3 -- ~/1/2/3
Then just select the number to go to that directory:
$ cd +2
$ pwd
~/1/2
I always forget the magic sequence to do the following so I updated the answer to explain this part.
The +
and -
will only take you to the directory, you can't tab complete the path in the stack (i.e. cd -2/<TAB>
gives you nothing). To make this work, you can use a tilde (~
).
Make some directories in 3
to make this example better.
$ mkdir 3/foo 3/bar 3/baz
Then find the directory in the stack.
$ cd ~+<TAB>
1 -- ~/1/2/3/4
2 -- ~/1/2/3
3 -- ~/1
4 -- ~
Then use tab completion on an entry.
$ cd ~+2/<TAB>
4/ bar/ baz/ foo/
If you use pushd
instead of cd
, then you can list directories with dirs
and cd to old directory with popd
. You can also set autopush
option to get cd
behave much like pushd -q
. Here is an example:
setopt pushdsilent # Omit printing directory stack
setopt autopush # Make cd push directories onto stack
setopt pushdminus # Invert meanings of +N and -N arguments to pushd
mkdir -p 1/2/3/4
cd 1
cd 2
cd 3
cd 4
popd # Go to previous directory (3) and remove it from directory stack
pushd - # Go to previous directory (4)
pushd -2 # Go 2 directories back the directory stack (2)
Note that pushd
does not remove anything from the directory stack, it only rotates it. See man zshbuiltins
for more details.