projectable 1.3.2

projectable is a highly configurable TUI file manager, built for projects. You can handle all your project's file-based needs from a comfortable and smooth interface!
Documentation
# Configuring projectable

Almost every behavior of projectable can be custommized through a simple `toml`
file.

To get started, run `prj --make-config` to create a new config file. Then, run
`prj --config` to get the location of your config file. Go to that directory,
and edit the TOML file.

Additionally, you can create _project local_ configurations. Just create a
`.projectable.toml` file anywhere, and it'll be merged with your global
configuration. This allows you to have specific commands depending on your
build system, programming language, and more!

## Commands

To create a new command, bound to a key, use the `commands` key of the
configuration. This will be a key-value pair.

Here's an example:

```toml
[commands]
"ctrl-e" = "echo Hello, World!"
```

You can use [the command syntax](../README.md#command-syntax) for more dynamic
commands!

### Special Commands

In projectable, you may also define commands that change on a per-file basis.
By default, this is bound to `v`, but can be [changed](#keys).

For example, here's a possible configuration for a `Cargo.toml` file:

```toml
[special_commands]
"Cargo.toml" = ["cargo add {...}", "cargo remove {...}", "cargo build"]
```

When you press `v` while selecting a `Cargo.toml` file, projectable will prompt
you to run one of these commands!

The key part of the configuration accepts globs, so you could generalize this
to run with `Cargo.*` if you'd like this prompt to appear in lock file as well.

## Keys

Many of the default keybinds can be changed in projectable.

For example, if you'd like to change the default up/down selection keys and
still keep the defaults, you could do so with:

```toml
up = ["k", "up"]
down = ["j", "down"]
```

Changing the new file key could look like this:

```toml
[filetree]
new_file = "alt-n"
```

alt and ctrl are the only currently supported modifiers.

For the rest of the possible keybinds, see
[the entire configuration](#all-configuration-options).

## Colors

Like everything else, projectable's colorscheme can be completely user-defined!
"Colors" is a bit of a misnomer; projectable also allows you to control the
text style too, giving you the options of bold or italic text.

Here's an example of a possible color change:

```toml
selected = { color = "rgb(0, 0, 0)", bg = "#FFFFFF", mods = ["italic"] }

[filetree]
border_color = { color = "yellow" }
```

RGB and hex are both supported, along with a list of modifiers. Currently, only
italic and bold are available.

To see all possible color options, see
[the entire configuration reference](#all-configuration-options).

## External Preview Command

The projectable previewer uses two default pagers:

1. `cat` for Unix
2. `type` for Windows

This can be changed! For example, if you want to use
[bat](https://github.com/sharkdp/bat):

```toml
[preview]
preview_cmd = "bat --force-colorization --line-range 0:1000 {}"
```

The `--line-range` is not strictly necessary, but it helps to avoid slowdowns
on massive files.

### Git Pager

You can also modify the `git diff` pager. If you want to use
[delta](https://github.com/dandavison/delta), you can put this into your config:

```toml
[preview]
git_pager = "delta"
```

Your git preview command will become `git diff | delta`!

## All Configuration Options

These are the default configuration options for projectable. You can override
them as you wish! You can check out
[my configuration](../src/config_defaults/_my_config.toml), too.

Generally, the file is split up based on pane. For example, the pane that shows
all of your files corresponds to the `[filetree]` section of the file.

```toml
# General settings
project_roots = [".git"]
# Items of the form: `GLOB = [COMMAND]`
special_commands = {}
# Items of the form `KEY = COMMAND`
commands = {}
esc_to_close = true
# Defaults to ["$SHELL",  "-c"]
# exec_cmd = ["zsh", "-ci"]

# Keys
up = ["k", "up"]
down = ["j", "down"]
quit = "q"
help = "?"
all_up = "g"
all_down = "G"
open = "enter"
# Kill processes started by projectable
kill_processes = "ctrl-c"
# Defaults to $EDITOR
# editor_cmd = "nvim"

# General styles
selected = { color = "black", bg = "magenta" }
popup_border_style = { color = "white" }
help_key_style = { color = "lightcyan", mods = ["bold"] }

[preview]
# For unix, uses `type` for windows
preview_cmd = "cat {}"
# Optional git pager
# git_pager = "delta"
down_key = "ctrl-d"
up_key = "ctrl-u"
scroll_amount = 10

border_color = { color = "cyan" }
scroll_bar_color = { color = "magenta" }
# Unreached part of the scroll bar
unreached_bar_color = { color = "blue" }

[filetree]
# Whether to show git diffs
use_git = true
# Ignore certain globs
ignore = []
use_gitignore = true
refresh_time = 1000
# Display directories before files
dirs_first = false
show_hidden_by_default = false
# Whether to show special commads in a fuzzy style. Alternative is a list-like
# view
special_commands_fuzzy = true

# Keys
special_command = "v"
down_three = "ctrl-n"
up_three = "ctrl-p"
exec_cmd = "e"
delete = "d"
search = "/"
# Full refresh of tree
clear = '\'
new_file = "n"
new_dir = "N"
rename = "r"
move_path = "R"
git_filter = "T"
diff_mode = "t"
open_all = "o"
close_all = "O"
mark_selected = "m"
open_under = "l"
close_under = "h"
show_dotfiles = "."
focus = "f"

# Colors
dir_style = { color = "blue", mods = ["italic"] }
filtered_out_message = { color = "yellow" }
border_color = { color = "magenta" }
# Color of git added files
git_added_style = { color = "green" }
git_new_style = { color = "red" }
git_modified_style = { color = "cyan" }
# Color of marked files
marks_style = { color = "yellow" }

[log]
border_color = { color = "blue" }

info = { color = "white" }
error = { color = "red" }
warn = { color = "yellow" }

# Only shown when run with the --debug option
debug = { color = "green" }
trace = { color = "magenta" }

[marks]
# Whether to show marks as relative paths or not
relative = true
open = "M"
delete = "d"

# Color of marks in marks window, NOT in filetree
mark_style = { color = "white" }
```