:vimgrep
looks like a really useful thing.
Here's how to use it:
:vim[grep][!] /{pattern}/[g][j] {file} ...
:help
says that you can essentially glob {file}
to name, say, *.c
for the current directory. I may have started Vim with a list of files that is complicated enough that I don't want to manually type it in for {file}
, and besides Vim already knows what those files are.
What I would like to do is vimgrep over any of:
:args
:files
:buffers
What variable(s) would I use in place of {file}
to name, respectively, any of those lists in a vimgrep
command?
Can't you catch the result in these commands into a register (:h :redir
), and insert it back into :vimgrep
call (with a :exe
).
Something like:
:exe "vimgrep/pattern/ " . lh#askvim#Exe(':args')
Notes:
:redir
; nothing really complex:args
that adds square brackets)join(argv(), ' ')
in :args
case.
function BuffersList()
let all = range(0, bufnr('$'))
let res = []
for b in all
if buflisted(b)
call add(res, bufname(b))
endif
endfor
return res
endfunction
:exe 'vimgrep/pattern/ '.join(BuffersList(),' ')
You can do this:
:bufdo vimgrep /pattern/ %
% substitutes the buffer name.
To [vim]grep the list of files in the argument list, you may use ##
(see :help cmdline-special
).
:vimgrep /re/ ##
I am unaware of a similar shorthand for the buffer list, but you may be able to do something like:
:argdelete ##
:bufdo argadd %
... and then use ##
. Or use :n
to open new files (which will be added to the arg list) instead of :e
.
Here is a slightly refined version of one of the answers. The following command searches for the pattern in all opened tabs and remembers results in quickfix list:
:cex [] | tabdo vimgrepa /pattern/ %
cex []
sets contents of quickfix list to empty list. You need to call it first because vimgrepa
accumulates search results from all the tabs. Also, you can replace tabdo
with argdo
, bufdo
and windo
.
To view search results execute:
:cope
This method, however, has limitation: it can only search in tabs which already have file names assigned to them (%
would not expand in a new tab).
EDIT:
You can also shortcut the command into function in your ~/.vimrc
like this:
function TS(text)
exe "cex [] | tabdo vimgrepa /" . a:text . "/ %"
endfunction
command -nargs=1 TS call TS(<q-args>)
cnoreabbrev ts TS
With last line you can call your function like this:
:ts from game import
where words after ts
is a search pattern. Without last line you have to type function name in upper case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With