serie 0.7.0

A rich git commit graph in your terminal, like magic
Documentation
# User Command

The User command feature allows you to execute custom external commands.
There are three types of user commands: `inline`, `silent` and `suspend`.

- `inline` (default)
  - Displays the output (stdout) of the command in a dedicated view within the TUI.
  - This allows you to do things like view commit diffs using your favorite tools.
- `silent`
  - Executes the command in the background without opening a view.
  - This is useful for operations that don't require checking output, such as deleting branches or adding tags.
- `suspend`
  - Executes the command by suspending the application.
  - This is useful for interactive commands that require terminal control, such as `git commit --amend` (which opens an editor) or `git diff` with a pager.

To define a user command, you need to configure the following two settings:
- Keybinding definition. Specify the key to execute each user command.
  - Config: `keybind.user_command_{n}`
- Command definition. Specify the actual command you want to execute.
  - Config: `core.user_command.commands_{n}`

Example configuration in `config.toml`:

```toml
[keybind]
user_command_1 = ["d"]
user_command_2 = ["shift-d"]
user_command_3 = ["b"]
user_command_4 = ["a"]

[core.user_command]
# Inline command (default)
commands_1 = { "name" = "git diff", commands = ["git", "--no-pager", "diff", "--color=always", "{{first_parent_hash}}", "{{target_hash}}"] }
# Inline command with custom area size
commands_2 = { "name" = "xxx", commands = ["xxx", "{{first_parent_hash}}", "{{target_hash}}", "--width", "{{area_width}}", "--height", "{{area_height}}"] }
# Silent command with refresh
commands_3 = { "name" = "delete branch", type = "silent", commands = ["git", "branch", "-D", "{{branches}}"], refresh = true }
# Suspend command with refresh
commands_4 = { "name" = "amend commit", type = "suspend", commands = ["git", "commit", "--amend"], refresh = true }
```

## Refresh

For `silent` and `suspend` commands, you can set `refresh = true` to automatically reload the repository and refresh the display (e.g., commit list) after the command is executed.
This is useful when the command modifies the repository state.

Note that `refresh = true` cannot be used with `inline` commands.

## Variables

The following variables can be used in command definitions.
They will be replaced with their respective values command is executed.

### Variable list

- `{{target_hash}}`
  - The hash of the selected commit.
  - example: `b0ce4cb9c798576af9b4accc9f26ddce5e72063d`
- `{{first_parent_hash}}`
  - The hash of the first parent of the selected commit.
  - example: `c103d9744df8ebf100773a11345f011152ec5581`
- `{{parent_hashes}}`
  - The hashes of all parents of the selected commit, separated by a space.
  - example: `c103d9744df8ebf100773a11345f011152ec5581 a1b2c3d4e5f67890123456789abcdef0123456789`
- `{{refs}}`
  - The names of all refs (branches, tags, stashes) pointing to the selected commit, separated by a space.
  - example: `master v1.0.0`
- `{{branches}}`
  - The names of all branches pointing to the selected commit, separated by a space.
  - example: `master feature-branch`
- `{{remote_branches}}`
  - The names of all remote branches pointing to the selected commit, separated by a space.
  - example: `origin/master origin/feature-branch`
- `{{tags}}`
  - The names of all tags pointing to the selected commit, separated by a space.
  - example: `v1.0.0 v1.0.1`
- `{{area_width}}`
  - Width of the user command display area (number of cells).
  - example: `80`
- `{{area_height}}`
  - Height of the user command display area (number of cells).
  - example: `30`

### List variables and argument expansion

Variables that represent multiple values (marked with "separated by a space" below) are handled specially:

- Standalone Marker
  - If used as a single argument (e.g., `["git", "branch", "-D", "{{branches}}"]`), it is expanded into multiple separate arguments (e.g., `["git", "branch", "-D", "br1", "br2"]`).
- Combined Marker
  - If combined with other characters (e.g., `["echo", "refs: {{refs}}"]`), it is replaced as a single space-separated string (e.g., `["echo", "refs: ref1 ref2"]`).
- Empty List
  - If the list is empty and used as a standalone marker, the argument is completely removed (e.g., `["git", "branch", "-D", "{{branches}}"]` becomes `["git", "branch", "-D"]`).

Using standalone markers is recommended when passing multiple values to commands that expect separate arguments, and it correctly handles names containing spaces.