Get in the flow with RipGrep. The more you use this plugin, the better you become at using RipGrep from the CLI. Not simply a wrapper which could be replaced by a few lines of config. It's a very simple to use tool aspiring to the Unix philosophy.
3 second intro:
Showing more of the features:
mangelozzi/nvim-rgflow.lua
and install the plugin.~/.config/nvim/after/plugin/rgflow.lua
require('rgflow').setup(
{
-- Set the default rip grep flags and options for when running a search via
-- RgFlow. Once changed via the UI, the previous search flags are used for
-- each subsequent search (until Neovim restarts).
cmd_flags = "--smart-case --fixed-strings --ignore --max-columns 200",
-- Mappings to trigger RgFlow functions
default_trigger_mappings = true,
-- These mappings are only active when the RgFlow UI (panel) is open
default_ui_mappings = true,
-- QuickFix window only mapping
default_quickfix_mappings = true,
}
)
<leader>rg
to open the RgFlow UI<ENTER>
<BS>
(Backspace) or -
will go up a dirdd
to delete a QuickFix entry, or select a visual range and press d
TAB
to mark a line and <S-TAB>
to unmark a line, a line can be marked more than oncec
/C
to :Cfilter
/:Cfilter
then type a pattern to filter the quickfix results.
If you like this plugin please give it a :star:!Bonus note: Pressing <TAB>
when the UI panel is open provides autocomplete for the line you are on (rip grep flags/cwords/filepaths)
dd
, or 3dj
and friends<TAB>
to mark a result (can be marked more than once),
and <S-TAB>
to unmark a result.:noh
the search terms are still highlighted:<up>
qf
.foo
in ~/codebase
, and you get a list of result in your quickfix list, now you wish to search for the phrase bar
, but only search in the files that already had foo
in them. By setting the path to qf
, the path will be replaced with a list of filenames generated from the current quickfix list.Use your favourite plugin manager, e.g. with Packer:
use("mangelozzi/nvim-rgflow.lua")
And then :PackerSync
etc. to install it.
cmd_flags
cmd_flags
cmd_flags = "--smart-case --fixed-strings --no-fixed-strings --no-ignore --ignore --max-columns 500"
--no-ignore
vs --ignore
), is because then one can quickly deletes options as required--ignore
will make the --no-ignore
flag take effect mappings = {
trigger = {
-- Normal mode maps
n = {
["<leader>rG"] = "open_blank", -- Open UI - search pattern = blank
["<leader>rp"] = "open_paste", -- Open UI - search pattern = First line of unnamed register as the search pattern
["<leader>rg"] = "open_cword", -- Open UI - search pattern = <cword>
["<leader>rw"] = "open_cword_path", -- Open UI - search pattern = <cword> and path = current file's directory
["<leader>rs"] = "search", -- Run a search with the current parameters
["<leader>ra"] = "open_again", -- Open UI - search pattern = Previous search pattern
["<leader>rx"] = "abort", -- Close UI / abort searching / abortadding results
["<leader>rc"] = "print_cmd", -- Print a version of last run rip grep that can be pasted into a shell
["<leader>r?"] = "print_status", -- Print info about the current state of rgflow (mostly useful for deving on rgflow)
},
-- Visual/select mode maps
x = {
["<leader>rg"] = "open_visual", -- Open UI - search pattern = current visual selection
},
},
-- Mappings that are local only to the RgFlow UI
ui = {
-- Normal mode maps
n = {
["<CR>"] = "start", -- With the ui open, start a search with the current parameters
["<ESC>"] = "close", -- With the ui open, discard and close the UI window
["?"] = "show_rg_help", -- Show the rg help in a floating window, which can be closed with q or <ESC> or the usual <C-W><C-C>
["<BS>"] = "parent_path", -- Change the path to parent directory
["-"] = "parent_path", -- Change the path to parent directory
["<C-^>"] = "edit_alt_file", -- Switch to the alternate file
["<C-6>"] = "edit_alt_file", -- Switch to the alternate file
["<C-^>"] = "nop", -- No operation
["<C-6>"] = "nop", -- No operation
},
-- Insert mode maps
i = {
["<CR>"] = "start", -- With the ui open, start a search with the current parameters (from insert mode)
["<TAB>"] = "auto_complete", -- Start autocomplete if PUM not visible, if visible use own hotkeys to select an option
["<C-N>"] = "auto_complete", -- Start autocomplete if PUM not visible, if visible use own hotkeys to select an option
["<C-P>"] = "auto_complete", -- Start autocomplete if PUM not visible, if visible use own hotkeys to select an option
},
},
-- Mapping that are local only to the QuickFix window
quickfix = {
-- Normal
n = {
["d"] = "qf_delete", -- QuickFix normal mode delete operator
["dd"] = "qf_delete_line", -- QuickFix delete a line from quickfix
["<TAB>"] = "qf_mark", -- QuickFix mark a line in the quickfix
["<S-TAB>"] = "qf_unmark", -- QuickFix unmark a line in the quickfix window
["<BS>"] = "nop", -- No operation
["<C-^>"] = "nop", -- No operation - Probably don't want to switch to a buffer in the little quickfix window
["<C-6>"] = "nop", -- No operation
},
-- Visual/select mode maps
x = {
["d"] = "qf_delete_visual", -- QuickFix visual mode delete operator
["<TAB>"] = "qf_mark_visual", -- QuickFix visual mode mark operator
["<S-TAB>"] = "qf_unmark_visual", -- QuickFix visual mode unmark operator
}
},
}
For the full list of configurable settings refer to Default settings
This is my personnel configuration:
require("rgflow").setup(
{
default_trigger_mappings = true,
default_ui_mappings = true,
default_quickfix_mappings = true,
quickfix = {
open_qf_cmd_or_func = "botright copen", -- Open the quickfix window across the full bottom edge
},
-- WARNING !!! Glob for '-g *{*}' will not use .gitignore file: https://github.com/BurntSushi/ripgrep/issues/2252
cmd_flags = ("--smart-case -g *.{*,py} -g !*.{min.js,pyc} --fixed-strings --no-fixed-strings --no-ignore -M 500"
-- Exclude globs
.. " -g !**/.angular/"
.. " -g !**/node_modules/"
.. " -g !**/static/*/jsapp/"
.. " -g !**/static/*/wcapp/"
)
}
)
setup
and search
, however open
can take optional args.Command | Description |
---|---|
require('rgflow').setup(config) |
Setup the plugin with the provided config settings |
require('rgflow').open |
Opens the UI with default arguments.Pattern = blankFlags = previous flags (or cmd_flags after startup)Path = PWD |
require('rgflow').open(pattern, flags, path, options) |
Open UI with specified argse.g. require('rgflow').open('foo', '--smart-case --ignore', '~/code/my_project') Refer to section Open Options below for more detail. |
require('rgflow').open_blank |
Open UI with blank search pattern (insert mode). |
require('rgflow').open_cword |
Open UI with current word as the search pattern. |
require('rgflow').open_cword_path |
Open UI with current word as the search pattern, and path as the current file's directory. |
require('rgflow').open_again |
Open UI with previous search pattern. |
require('rgflow').open_paste |
Open UI with first line of unnamed register as pattern. |
require('rgflow').open_visual |
Open UI with current visual selection as pattern. |
require('rgflow').start |
Start searching with current UI parameters. |
require('rgflow').close |
Close the current UI window. |
require('rgflow').search(pattern, flag, path) |
Execute search immediately with specified args. |
require('rgflow').abort |
Abort current operation (searching or adding results). |
require('rgflow').show_rg_help |
Show rg --help content in a popup window. |
require('rgflow').nop |
No operation, useful for disabling hotkeys. |
require('rgflow').get_cmd |
Get last run rip grep command. |
require('rgflow').print_cmd |
Print last run rip grep command. |
require('rgflow').qf_apply_hl |
After removing lines from the QF list by some means outside of RgFlow (e.g. :Cfilter or :Cfilter! command), one can sync the highlighting positions again. |
require('rgflow').qf_delete |
QuickFix normal mode delete operator. |
require('rgflow').qf_delete_line |
Delete a line from QuickFix. |
require('rgflow').qf_delete_visual |
QuickFix visual mode delete operator. |
require('rgflow').qf_mark |
QuickFix mark a line in the QuickFix window. |
require('rgflow').qf_mark_visual |
QuickFix visual mode mark operator. |
require('rgflow').qf_unmark |
QuickFix unmark a line in the QuickFix window. |
require('rgflow').qf_unmark_visual |
QuickFix visual mode unmark operator. |
require('rgflow').auto_complete |
Auto complete based on input box context. |
require('rgflow').print_status |
Print info about the current state of rgflow. |
require('rgflow').open(pattern, flags, path, options)
options
parameter is a lua table with the following keys (for now only one key):callback
vim.keymap.set("n", "<leader>RG", function()
require('rgflow').open(nil, nil, nil, {
callback = function() print('Callback ran... have a nice day!') end
})
end, {noremap = true})
custom_start
vim.keymap.set("n", "<leader>RG", function()
-- Here we open UI with the default pattern/flags/path by passing in nil, nil, nil
require('rgflow').open(nil, nil, nil, {
custom_start = function(pattern, flags, path)
print('Pattern:'..pattern..' Flags:'..flags..' Path:'..path)
end
})
end, {noremap = true})
:Cfilter
very well. :Cfilter
is built into Vim/Neovim for filtering your QuickFix lists.vim.cmd('packadd cfilter')
:Cfilter foo
will limit your QuickFix results to only those that contain the phrase foo
:Cfilter! foo
does the inverse, only those that don't contain foo
are kept.c
/C
.vim.keymap.set("n", "c", ":Cfilter ", {noremap = true, buffer = true, nowait = true, desc ="(c)filter"})
vim.keymap.set("n", "C", ":Cfilter! ", {noremap = true, buffer = true, desc ="(C)filter!"})
Cfilter
and this plugin's delete function, you can quickly massage your QuickFix list, making it ready to unleash a :cdo
and :cfdo
... unlocking all sorts of super powers.foo
for bar
on each QuickFix match then save the modified file::cdo s/foo/bar/ | update
qf
to limit a search to files form the current qf list, as explained in the Features section,PR's are welcome!
Copyright (c) Michael Angelozzi. Distributed under the same terms as Neovim
itself. See :help license
.