Why do they use the double asterisk?
I've read Vim's help on vimgrep
, I've looked around on stack overflow and vimcasts and whilst I have found lots of people saying that this is how you search recursively in current directory, I haven't found an explanation as to why.
Lets use an example to make it easier to explain. If I wanted to find all occurrences of foo in my current directory and down, I could use
:vim[grep][!] /{pattern}/[g][j] {file}
so that becomes
:vimgrep /foo/ **/*
So looking at the {file}
part of this grep:
*
) is a wildcard.My specific question is why it comes in the format of
**/*
and not
*/*
I've tried searching using / in a few different cases and that seems to search any file in any directory exactly 1 deep from my current directory, which I assume is why double asterisk is used.
ie Why is it a double asterisk? Does this indicate "I want you to search recursively" through some clever mechanisms I don't fully understand or is this just simply a keyword that serves to say 'search recursively'? Am I completely off and this is not an inbuilt part of vim but a part of the shell? (these parts are not my actual question but rather serve to give understanding as to what I am confused about, my actual question is above).
If there are any ways I can improve my question, please let me know, it's my first time asking.
The double asterisk is a vim build-in keyword, which simply says 'search recursively'. It is used, because the creator of vim choosed to use it for this case.
There are two different cases, where **
is used: file searching and the rest.
Vim help explains this very well.
For the 'rest' see :help wildcard
and :help starstar-wildcard
:
From :help wildcard
:
** matches anything, including nothing, recurses into directories
and :help starstar-wildcard
specifies:
Expanding "**" is possible on Unix, Win32, Mac OS/X and a few other systems. This allows searching a directory tree. This goes up to 100 directories deep.
For file searching see :help **
or :help starstar
.
To quote the relevant parts (emphasis mine):
The file searching is currently used for the 'path', 'cdpath' and 'tags' options, for finddir() and findfile(). Other commands use wildcards which is slightly different.
[...]
Downward search uses the wildcards '*', '**' and possibly others
supported by your operating system. '*' and '**' are handled inside Vim,
so they work on all operating systems.
[...]
'**' is more sophisticated:
- It ONLY matches directories.
- It matches up to 30 directories deep by default, so you can use it to search an entire directory tree
- The maximum number of levels matched can be given by appending a number to '**'.