Skip to main content
  1. Posts/

The Fastest Way to Search A Keyword across the Project in Neovim

··518 words·3 mins·
Table of Contents

When we want to find out where a method is used across the whole project, how do we do that in Nvim? Various tools are available, for example, ack, ag or rg.

These are the 3 most popular tools to use. In the following post, I will introduce how to install and use these packages in Neovim (Nvim).

Installing the searching tools
#

Install ack
#

Suppose that we want to install it to $HOME/tools/bin, you can use the following install command:

# directory ~/tools/bin must exist
curl https://beyondgrep.com/ack-2.24-single-file > ~tools/bin/ack

# make it executable
chmod u+x ~/tools/bin/ack

Add ack to PATH variable in .bash_profile:

export PATH=$HOME/tools/bin:$PATH

Then source .bash_profile to make the change take effect:

source ~/.bash_profile`.

Install ag – the silver searcher
#

I have found an exceptional tool for this task. It is called The Silver Searcher, AKA, ag.

Please follow the official guide on how to install this tool.

Install rg – ripgrep
#

Ripgrep is also a great tool for searching patterns. It seems that rg is faster than both ack and ag. So it is also worth a trial.

Follow the offical guide on installing this tools.

Use these search tools inside Nvim
#

You can use these tools directly on the command line. If you want to use it with Vim, you also need to use a front end1 for it.

Install ack.vim
#

To use ack inside Nvim, we also need to install ack.vim:

# using vim-plug to install this package
Plug 'mileszs/ack.vim'

By default, ack.vim use ack to search for patterns. If you have installed both ag and rg. You can tell ack.vim to use them instead, with a preference for rg.

" Prefer rg > ag > ack
" https://hackercodex.com/guide/vim-search-find-in-project/
if executable('rg')
    let g:ackprg = 'rg -S --no-heading --vimgrep'
elseif executable('ag')
    let g:ackprg = 'ag --vimgrep'
endif

In Nvim normal mode, use :Ack {PATTERN} [{PATH}] to search {PATTERN} recursively under directory {PATH}. If you omit the {PATH} parameter, the default path is the current path.

Ack.vim will open the first file that matches. If you do not want this behaviour, you can use :Ack! instead. Or, use the following setting in your Nvim config:

cnoreabbrev Ack Ack!
nnoremap <Leader>a :Ack!<Space>

It adds a custom shortcut for the :Ack! command. For more information, see the ack.vim documentation.

If you are a minimalist
#

There is high chance that you may have installed fzf and fzf.vim. Then You do not need to install ack.vim. fzf.vim has built-in support for ag and rg.

Both fzf and fzf.vim is easy to install. After installation, you can use :Ag PATTERN or rg PATTERN to search for keyword PATTERN under your current root directory. The search speed is quite fast. Enjoy~

Another great tool
#

Recently, I have switched from fzf to Leaderf, which is also a great fuzzy find tool. To use ripgrep with leaderf, you can use the following command:

:Leaderf rg PATTERN

Update history:

  • 2020-02-21: Add section on Leaderf.

References
#


  1. By front end, I mean that some Nvim plugin which will invoke this command for you. ↩︎

Related

Search and Replace in Multiple Files in Vim/Neovim
··643 words·4 mins
Nifty Nvim Techniques Which Make My Life Easier -- Series 3
··1124 words·6 mins
Migrating from Packer.nvim to Lazy.nvim
··651 words·4 mins