vimripgrep

pipe ripgrep search results to vim and open files at exact search location


rg -l "searched phrase" | xargs vim

populates vim with searched terms, but I need to search for them once again, this time in vim.

How to pipe ripgrep search results to vim, so searched files will be opened at exact search location (line and column)?


Solution

  • According to Filling the quickfix window from stdin? you can do the following:

    rg --vimgrep 'pat' | vim -q /dev/stdin
    

    You need to supply --vimgrep to get ripgrep's output into the correct format for Vim. -q reads a file into the quickfix list.

    Alternatively

    Do your searching from inside Vim via :grep

    Add the following to your vimrc file:

    set grepprg=rg\ --vimgrep
    set grepformat^=%f:%l:%c:%m
    

    Now you can do :grep 'pattern' and it will populate the quickfix list. Redoing your search is as easy as :grep followed by some <up> presses to get back to your relevant :grep.

    Quickfix commands

    I would recommend you create mappings for :cnext and :cprevious. I personally use unimpaired.vim which provides ]q & [q mappings for :cnext and :cprevious.

    If you want the quickfix window to open automatically put the following in your vimrc:

    augroup autoquickfix
        autocmd!
        autocmd QuickFixCmdPost [^l]* cwindow
        autocmd QuickFixCmdPost    l* lwindow
    augroup END
    

    There is a Vimcasts episode about this topic: Search multiple files with :vimgrep.

    Project-wide Search and Replace

    If you are using :grep/:vimgrep as way to do a project-wide search and replace then I suggest you use :cdo/:cfdo (in Vim 7.4.980+).

    :grep 'foo'
    :cfdo %s/foo/bar/g|w
    

    For more help see:

    :h :grep
    :h 'grepprg'
    :h quickfix
    :h :cnext
    :h :copen
    :h :ccl
    :h :cc
    :h :colder
    :h :cdo
    :h :cfdo