All shells understand these commands:
$ cd .
$ cd ..
And zsh will also understand:
$ cd ...
$ cd ....
Provided you say:
$ alias -g ...='../..'
$ alias -g ....='../../..'
Now, how can I make it do proper tab-completion when I've started typing cd ..../<TAB>
? I recall it was implemented in oh-my-zsh but I've stopped using it now.
It would also be appreciated if it would work not only for cd
, say I want to execute cat ..../a/b/..../c/d | less
.
You have to use
compinit
and use_expand_alias
as completer. Here is an example:_complete _ignored
is the default setting forcompleter
, you could set it to only_expand_alias
but then completion would only work for aliases.If
compinit
is already configured in your~/.zshrc
, then you just need to add_expand_alias
into the list forcompleter
, for example:By default
_expand_alias
expands global and and regular aliases, if you do not want to expand regular aliases, set:Note: This of course works only, where global aliases would work. So they would not be expanded as part of an entire path like
a/b/..../c/d
I wasn't happy with the other answers so I spent a bit of time getting something more to my liking. The following will expand the dots when you hit ↵ (return) or ↹ (tab), not as you type the dots.
What I did to to deal with the same problem is to just let zsh fill in
../..
when I type...
and it makes sense to expand it in that way. It may suit you (or not :-P):I also have an alias for
...
, but it is not global.Notice I check if the command line starts with
p4
(the Perforce command line tool) and do not mess with it in that case, as Perforce arguments often involve literal...
. If you do not usep4
you can obviously remove that check.A good option is manydots-magic, which expands
...
into../..
, etc. but does it intelligently. See the link above for more details, but briefly:../..
cd a/b/..../y/z
.git log branch...
git diff ...
->git diff ../..
git diff ...b
->git diff ...b
(forgit diff ...branch
)