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. ↩︎