ripgrep 14 is a new major version release of ripgrep that has some new
features, performance improvements and a lot of bug fixes.
In case you haven't heard of it before, ripgrep is a line-oriented search
tool that recursively searches the current directory for a regex pattern.
By default, ripgrep will respect gitignore rules and automatically skip
hidden files/directories and binary files.
The headlining feature in this release is hyperlink support. In this release,
they are an opt-in feature but may change to an opt-out feature in the future.
To enable them, try passing --hyperlink-format default
. If you use VS Code,
then try passing --hyperlink-format vscode
. Please report your experience
with hyperlinks, positive or negative.
Another headlining development in this release is that it contains a rewrite of
its regex engine. You generally shouldn't notice any changes, except for some
searches may get faster. You can read more about the regex engine rewrite on
my blog. Please report your performance improvements or
regressions that you notice.
Finally, ripgrep switched the library it uses for argument parsing. Users
should not notice a difference in most cases (error messages have changed
somewhat), but flag overrides should generally be more consistent. For example,
things like --no-ignore --ignore-vcs
work as one would expect (disables all
filtering related to ignore rules except for rules found in version control
systems such as git
).
BREAKING CHANGES:
rg -C1 -A2
used to be equivalent torg -A2
, but now it is equivalent to
rg -B1 -A2
. That is,-A
and-B
no longer completely override-C
.
Instead, they only partially override-C
.
Build process changes:
- ripgrep's shell completions and man page are now created by running ripgrep
with a new--generate
flag. For example,rg --generate man
will write a
man page inroff
format on stdout. The release archives have not changed. - The optional build dependency on
asciidoc
orasciidoctor
has been
dropped. Previously, it was used to produce ripgrep's man page. ripgrep now
owns this process itself by writingroff
directly.
Performance improvements:
- PERF #1746:
Make some cases with inner literals faster. - PERF #1760:
Make most searches with\b
look-arounds (among others) much faster. - PERF #2591:
Parallel directory traversal now uses work stealing for faster searches. - PERF #2642:
Parallel directory traversal has some contention reduced.
Feature enhancements:
- Added or improved file type filtering for Ada, DITA, Elixir, Fuchsia, Gentoo,
Gradle, GraphQL, Markdown, Prolog, Raku, TypeScript, USD, V - FEATURE #665:
Add a new--hyperlink-format
flag that turns file paths into hyperlinks. - FEATURE #1709:
Improve documentation of ripgrep's behavior when stdout is a tty. - FEATURE #1737:
Provide binaries for Apple silicon. - FEATURE #1790:
Add new--stop-on-nonmatch
flag. - FEATURE #1814:
Flags are now categorized in-h/--help
output and ripgrep's man page. - FEATURE #1838:
An error is shown when searching for NUL bytes with binary detection enabled. - FEATURE #2195:
Whenextra-verbose
mode is enabled in zsh, show extra file type info. - FEATURE #2298:
Add instructions for installing ripgrep usingcargo binstall
. - FEATURE #2409:
Added installation instructions forwinget
. - FEATURE #2425:
Shell completions (and man page) can be created viarg --generate
. - FEATURE #2524:
The--debug
flag now indicates whether stdin or./
is being searched. - FEATURE #2643:
Make-d
a short flag for--max-depth
. - FEATURE #2645:
The--version
output will now also contain PCRE2 availability information.
Bug fixes:
- BUG #884:
Don't error when-v/--invert-match
is used multiple times. - BUG #1275:
Fix bug with\b
assertion in the regex engine. - BUG #1376:
Using--no-ignore --ignore-vcs
now works as one would expect. - BUG #1622:
Add note about error messages to-z/--search-zip
documentation. - BUG #1648:
Fix bug where sometimes short flags with values, e.g.,-M 900
, would fail. - BUG #1701:
Fix bug where some flags could not be repeated. - BUG #1757:
Fix bug when searching a sub-directory didn't have ignores applied correctly. - BUG #1891:
Fix bug when using-w
with a regex that can match the empty string. - BUG #1911:
Disable mmap searching in all non-64-bit environments. - BUG #1966:
Fix bug where ripgrep can panic when printing to stderr. - BUG #2046:
Clarify that--pre
can accept any kind of path in the documentation. - BUG #2108:
Improve docs for-r/--replace
syntax. - BUG #2198:
Fix bug where--no-ignore-dot
would not ignore.rgignore
. - BUG #2201:
Improve docs for-r/--replace
flag. - BUG #2288:
-A
and-B
now only each partially override-C
. - BUG #2236:
Fix gitignore parsing bug where a trailing\/
resulted in an error. - BUG #2243:
Fix--sort
flag for values other thanpath
. - BUG #2246:
Add note in--debug
logs when binary files are ignored. - BUG #2337:
Improve docs to mention that--stats
is always implied by--json
. - BUG #2381:
Make-p/--pretty
override flags like--no-line-number
. - BUG #2392:
Improve global git config parsing of theexcludesFile
field. - BUG #2418:
Clarify sorting semantics of--sort=path
. - BUG #2458:
Make--trim
run before-M/--max-columns
takes effect. - BUG #2479:
Add documentation about.ignore
/.rgignore
files in parent directories. - BUG #2480:
Fix bug when using inline regex flags with-e/--regexp
. - BUG #2505:
Improve docs for--vimgrep
by mentioning footguns and some work-arounds. - BUG #2519:
Fix incorrect default value in documentation for--field-match-separator
. - BUG #2523:
Make executable searching take.com
into account on Windows. - BUG #2574:
Fix bug in-w/--word-regexp
that would result in incorrect match offsets. - BUG #2623:
Fix a number of bugs with the-w/--word-regexp
flag. - BUG #2636:
Strip release binaries for macOS.