I couldn't figure out a way to search for this and see if it is already explained on the Internet.

I have the following at the command line and I want to hit <TAB> at the end to start file completion:

   mycmd process file=data/old/1/

When I was using Bash, that TAB would show me the files in the folder 1/ but with Zsh that doesn't happen unless I enter a space after the = sign. Can I reconfigure Zsh to do that?

1 Answer 1

setopt magic_equal_subst

This works both with old-style and new-style completion, i.e. with or without compinit.

Completion of file names after = is an obscure and undocumented side effect of the magic_equal_subst option. The documented effect of this option is to enable filename expansion after =.

Most of the time, if you notice the effect of this option at all, it's a desirable effect, e.g.

somecommand --option=~/file

passes a path under your home directory to somecommand, not a path in a directory called ~. However, this also has the usually undesirable effect that an argument == triggers filename expansion:

somecommand foo==bar

passes foo=/bin/bar if the command bar is found in $PATH at /bin/bar. If you want to pass == literally to the command, at least one of the equal signs needs to be quoted, e.g.

somecommand foo=\=bar
somecommand foo\==bar

In the new-style completion system, this is handled inside _default. If you want to get filename completion after = without enabling magic_equal_subst, you need to override or wrap around _default to obtain the same effect. For example:

autoload +X -U _default
functions[_default]="setopt local_options magic_equal_subst; $functions[_default]"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.