Broot content search

3 minute read Published: 2020-07-26

An example of an efficient search workflow based on broot, a general purpose file manager.

Here's how broot looks when launched on my big code directory with br -s ~/dev (300k files, 22GB):

br-s

I want to look for examples of "Option<Option" (an option of an option in Rust).

The command for such filtering is c/Option<Option (c/ then the searched string)

Broot lists the matching files in real time, in a tree view helping you get a clear overview, and with a relevant extract in green.

matches

In practice you rarely bother typing the whole searched string, you type just as much as is needed to discriminate what you're looking for.

If I want to know more about a given file, I hit ctrl (and I could close it with ctrl) :

matches

Broot now shows me the matching lines in the chosen file.

It's now clear this match is just the blog post I'm typing... not very interesting.

So I hit the tab key to navigate to other matched files. The preview is automatically updated:

matches

The tree lets me see those options of options occur in BurntSushi's regex crate and it's quite obvious (when you've done some Rust) that iterations are the reason of such type.

Another ctrl lets me focus the preview panel and then I navigate among matched lines using and :

matches

Hitting ctrl again dives in the file on the selected line so that I can see the context.

unfiltered

(it confirms the Iterator hypothesis)

I can go back to the list of matched lines with ctrl.

And if I want to open the file in the editor, I type :e (or a space and a e):

matches

and I hit enter to go to my favorite text editor on the relevant line:

nvim

When I quit vim, I'm back to broot.

How fast was it ?

Quite fast. In fact with my SSD there's practically no delay in such a workflow. In my tests on big directories full of git repositories, broot is much faster than grep, ripgrep, ag, etc.

(but broot doesn't really have the same features, it doesn't let you run a regular expression or even a case insensitive search on the file contents of a directory, it just does the easy search of literals)

(and that was on my machine and in no way a serious benchmark, so let's just remember it's "fast enough")

Other searches

broot's query syntax allows filtering on file names with a fuzzy pattern or a regular expression, and to compose the conditions.

You may for example exclude toml files while searching for files containing "memmap" with

c/memmap/&!/toml$/

(see more here)