The Fastest Way to Search A Keyword across the Project in Neovim
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
- Ack install: https://beyondgrep.com/install/
- https://stackoverflow.com/questions/38398787/how-do-i-search-in-all-files-of-my-project-using-vim
By front end, I mean that some Nvim plugin which will invoke this command for you. ↩︎