Opening the configuration file

The configuration file location follows the XDG convention and its location depends on your OS.

The easiest way to read and edit broot's configuration file is to go the help screen (using ?) then to type :os (shorcut for :open_stay).

This file is called conf.toml and is in TOML.

Currently, you can configure

Default flags

Broot accepts a few flags at launch (the complete list is available with broot --help.

For example, if you want to see hidden files (the ones whose name starts with a dot) and the status of files related to git, you launch broot with

br -gh

If you almost always want those flags, you may define them as default in the conf.toml file, with the default_flags setting:

default_flags = "gh"

Those flags can still be overriden at launch with the negating ones. For example if you don't want to see hidden files at a specific launch, do

br -H

Verbs, Shortcuts, and keys

Verb Definition Attributes

You can define a new verb in the TOML configuration file with a [[verbs]] section similar to this one:

invocation = "edit"
key = "F2"
shortcut = "e"
execution = "/usr/bin/nvim {file}"

The possible attributes are:

name mandatory role
invocation no how the verb is called by the user, with placeholders for arguments
execution yes how the verb is executed
key no a keyboard key triggerring execution
shorcut no an alternate way to call the verb (without the arguments part)
leave_broot no whether to quit broot on execution (default: true)
from_shell no whether the verb must be executed from the parent shell (needs br, default: false). As this is executed after broot closed, this isn't compatiple with leave_broot = false


The from_shell attribute exists because some actions can't possibly be useful from a subshell. For example cd is a shell builtin which must be executed in the parent shell.

broot looks for the first token following a space or : and tries to find the verb you want.

Knowing this algorithm, you may understand the point in the following definition:

invocation = "p"
execution = ":parent"

This verb is an alias to the internal builtin already available if you type :parent.

Its interest is that if you do :p, then enter, it is executed even while there are other verbs whose invocation pattern starts with a p.

Use shortcuts for verbs you frequently use.

Keyboard key

The main keys you can use are

It's possible to define a verb just to add a trigger key to an internal verb.

For example you could add those mappings:

invocation = "root"
key = "F9"
execution = ":focus_root"

invocation = "home"
key = "ctrl-H"
execution = ":focus_user_home"

key = "alt-j"
execution = ":line_down"

invocation = "top"
key = "F6"
execution = ":select_first"

invocation = "bottom"
key = "F7"
execution = ":select_last"

invocation = "open"
key = "crtl-O"
execution = ":open_stay"

invocation = "edit"
key = "F2"
shortcut = "e"
execution = "$EDITOR {file}"
from_shell = true


Beware that consoles intercept some possible keys. Many keyboard shortcuts aren't available, depending on your configuration.

Verbs not leaving broot

If you set leave_broot = false, broot won't quit when executing your command, but it will update the tree.

This is useful for commands modifying the tree (like creating or moving files).

There's currently a limitation: terminal based programs don't properly run if broot isn't closed before. It means you can't for example set leave_broot = false in verbs launching vi or emacs.

Verb Arguments

The execution of a verb can take one or several arguments.

For example it may be defined as `/usr/bin/vi {file}̀ .

Some arguments are predefined in broot and depends on the current selection:

name expanded to
{file} the complete path of the current selection
{parent} the complete path of the current selection's parent
{directory} the closest directory, either {file} or {parent}


when you're in the help screen, {file} is the configuration file, while {directory} is the configuration directory.

But you may also define some arguments in the invocation pattern. For example:

invocation = "mkdir {subpath}"
execution = "/bin/mkdir -p {directory}/{subpath}"

(this one has now been made standard so you don't have to write it in the configuration file)

In this case the subpath is read from what you type:

md sub

As you see, there's a space in this path, but it works. broot tries to determine when to wrap path in quotes and when to escape so that such a command correctly works.

It also normalizes the paths it finds which eases the use of relative paths:


Here's another example, where the invocation pattern defines two arguments by destructuring:

invocation = "blop {name}\\.{type}"
execution = "/bin/mkdir {parent}/{type} && /usr/bin/nvim {parent}/{type}/{name}.{type}"
from_shell = true

And here's how it would look like:


Notice the \\. ? That's because the invocation pattern is interpreted as a regular expression (with just a shortcut for the easy case, enabling {name}). The whole regular expression syntax may be useful for more complex rules. Let's say we don't want the type to contain dots, then we do this:

invocation = "blop {name}\\.(?P<type>[^.]+)"
execution = "/bin/mkdir {parent}/{type} && /usr/bin/nvim {parent}/{type}/{name}.{type}"
from_shell = true

You can override the default behavior of broot by giving your verb the same shortcut or invocation than a default one.

Built In Verbs

Here's the list of actions you can add an alternate shortcut or keyboard key for:

invocation default key default shortcut behavior / details
:back Esc - back to previous app state (see Usage page)
:cd altenter - leave broot and cd to the selected directory (needs the br shell function)
:chmod {args} - - execute a chmod
:cp {newpath} - - copy the file or directory to the provided name
:help F1 - open the help page. Help page can also be open with ?
:focus enter - set the selected directory the root of the displayed tree
:focus_user_home - - focus the user's home (~ on linux)
:focus_root - - focus the root directory (/ on linux)
:line_down - scroll one line down or select the next line
:line_up - scroll one line up or select the previous line
:mkdir {subpath} - md create a directory
:mv {newpath} - - move the file or directory to the provided path
:open_stay enter - open the selected file in the default OS opener
:open_leave altenter - open the selected file in the default OS opener and leave broot
:page_down - scroll one page down
:page_up - scroll one page up
:parent - - focus the parent directory
:print_path - pp print path and leave broot
:print_relative_path - pp print relative path and leave broot
:print_tree - pt print tree and leave broot
:quit ctrlq q quit broot
:refresh F5 - refresh the displayed tree and clears the directory sizes cache
:rm - - remove the selected file or directory. To stay safe, don't define a keyboard key for this action
:select_first - - select the first line
:select_last - - select the last line
:toggle_dates - - toggle display of last modified dates
:toggle_files - - toggle showing files (or just folders)
:toggle_git_ignore - - toggle git hignore handling (auto, no or yes)
:toggle_git_file_info - - toggle display of git file information
:toggle_git_status - - toggle showing only the file which would show up on git status
:toggle_hidden - - toggle display of hidden files (the ones whose name starts with a dot on linux)
:toggle_perm - - toggle display of permissions (not available on Windows)
:toggle_sizes - - toggle the size mode
:toggle_trim_root - - toggle trimming of top level files in tree display

Note that


Skin configuration

You can change all colors by adding a [skin] section in your conf.toml file.

For example:

default = "gray(22) gray(1)"
tree = "rgb(89, 73, 101) none"
file = "gray(21) none"
directory = "rgb(255, 152, 0) none bold"
exe = "rgb(17, 164, 181) none"
link = "Magenta none"
pruning = "rgb(89, 73, 101) none Italic"
sparse = "ansi(214) None"
perm__ = "gray(5) None"
perm_r = "ansi(92) None"
perm_w = "ansi(192) None"
perm_x = "ansi(69) None"
selected_line = "none gray(3)"
char_match = "yellow none"
file_error = "Red none"
flag_label = "gray(16) none"
flag_value = "rgb(255, 152, 0) none bold"
input = "White none"
status_error = "Red gray(2)"
status_job = "ansi(220) gray(5)"
status_normal = "gray(20) gray(3)"
status_italic = "rgb(255, 152, 0) gray(3)"
status_bold = "rgb(255, 152, 0) gray(3) bold"
status_code = "ansi(229) gray(5)"
status_ellipsis = "gray(19) gray(1)"
scrollbar_track = "rgb(80, 50, 0) none"
scrollbar_thumb = "rgb(255, 187, 0) none"
help_paragraph = "gray(20) none"
help_bold = "rgb(255, 187, 0) none bold"
help_italic = "Magenta rgb(30, 30, 40) italic"
help_code = "gray(21) gray(3)"
help_headers = "rgb(255, 187, 0) none"

which would look like this:

custom colors tree

Each skin entry value is made of

A color can be

Beware that many terminals aren't compatible with RGB 24 bits colors (or aren't usually configured for).

Currently supported attributes are:

Note that some of them may be ignored by your terminal. Windows supports about none of them, for example.

Other Skin Examples