gitwig 2.6.7

a rust based tui, an alternative to sourcetree and gitui
Documentation
# ⌨️ Keybindings

| Key                  | Mode            | Action                            |
| -------------------- | --------------- | --------------------------------- |
| `↑` / `k`            | Normal          | Move selection up                 |
| `↓` / `j`            | Normal          | Move selection down               |
| `a`                  | Normal          | Add a new repository (via directory scanner) |
| `A`                  | Normal          | Bulk add folders in a directory   |
| `i`                  | Normal          | Import remote repository          |
| `e`                  | Normal          | Edit the selected repository's path. Its labels, star, pin, per-repository settings, last visit and commit-message history move to the new path; a path another entry already tracks (as written, via `~`, or through a symlink) is refused with "Repository already added" |
| `D`                  | Normal          | Delete the selected item (asks)   |
| `l`                  | Normal          | Edit labels of the selected item  |
| `R`                  | Normal          | Refresh status of selected item   |
| `F`                  | Normal          | Bulk fetch all tracked repositories concurrently |
| `E`                  | Normal          | Show why the selected repository's last fetch failed |
| `f`                  | Normal          | Enter repository search mode      |
| `Tab` / `Shift+Tab`  | Normal          | Cycle summary-bar filter (repos → dirty → ahead → stale) forward / backward |
| `L`                  | Normal          | Open label picker: filter the list to one label (sticky until deselected; persists across restarts) |
| `1` … `9`            | Normal          | Quick label: apply the label in slot N as the sticky filter, matching the numbered chips under the summary bar. Slots are assigned in the order labels are first viewed (FIFO) and never reorder; press the active slot again to clear it |
| `Esc`                | LabelPicker     | Close label picker without changing the filter |
| `↑` / `↓`            | LabelPicker     | Navigate label list |
| `Enter`              | LabelPicker     | Apply selected label (re-selecting the active label, or "All repositories", clears it) |
| `→`                  | LabelPicker     | Open Label Settings for the highlighted label (on the "All repositories" row it only shows a "Select a label to edit its settings" status hint) |
| `Home` / `End` / `PgUp` / `PgDn` | Fuzzy pickers | Jump to top / bottom or page through the match list. Works in all fuzzy picker overlays: label picker, Jump-to-Repo, add/bulk-add repo scanners, and branch/file/commit/tag searches |
| `ctrl+f`             | Normal          | Open global code search popup overlay |
| `p`                  | Normal          | Toggle pin status of selected item (pinned repositories stay at the top of the list in every sort order, above a thin rule) |
| `*`                  | Normal          | Toggle Favorite / Star status of selected item |
| `Space`              | Normal          | Toggle selection of item for batch operations (fetch, delete, external shell) |
| `y`                  | Normal          | Yank absolute path of selected item to clipboard |
| `/`                  | Normal          | Open fuzzy Jump-to-Repo picker overlay |
| `o`                  | Normal          | Cycle list sorting mode (Custom → Alphabetical → Recent → Changes). While a label filter whose Label Settings set **Sort By** is active, cycles that label's sort instead of the global |
| `O`                  | Normal          | Toggle list sorting direction (ascending vs. reversed). While a label filter whose Label Settings set **Sort Reverse** is active, flips that label's direction instead of the global |
| `g`                  | Normal          | Launch the preferred Git client in the highlighted repository (configurable in settings, default is gitui); does nothing on a group header |
| `t`                  | Normal          | Open the embedded terminal panel in the selected repository's directory |
| `T`                  | Normal          | Suspend the TUI and spawn a full-screen shell in each multi-selected repository's directory (clearing the selection), else in the highlighted repository's; does nothing on a group header |
| `ctrl+t`             | Global / Anywhere | Toggle the embedded terminal panel (show + focus / hide; also unfocuses it) |
| `ctrl+p`             | Normal / Detail | Open the command palette: fuzzy-find every action available in the current view (with its current key) and run it by name |
| `↑` / `↓` / `PgUp` / `PgDn` / `Home` / `End` | Command Palette | Move through the matching actions |
| `Enter`              | Command Palette | Run the highlighted action (exactly as its key would, including custom bindings) |
| `Esc` / `ctrl+p`     | Command Palette | Close the palette without running anything |
| `Shift+PgUp` / `Shift+PgDn` | Terminal panel (focused) | Scroll the terminal's output history; any keystroke snaps back to live view |
| `s`                  | Normal          | Open options/settings page        |
| `d`                  | Normal          | Open debug logs panel             |
| `V`                  | Normal          | Show about popup / creator profile |
| `v`                  | Normal          | Cycle between standard cards, compact 1-row view, and tile grid view. While a label filter whose Label Settings set **View Mode** is active, cycles that label's layout instead of the global |
| `h`                  | Normal          | Show signs & symbols legend popup |
| `U`            | Normal          | Open App Usage Stats Dashboard    |
| `u`                  | Normal          | Check for application updates manually |
| `.`                  | Normal / Detail | Toggle status bar between collapsed and expanded view |
| `Enter` / `→`        | Normal / Commits list | Open Detail view for selected item (in Tile view `→` moves the selection right instead) / Inspect selected commit |
| `?`                  | Normal / Help   | Toggle the shortcut overlay       |
| `ctrl+q`             | Global / Anywhere | Quit application from anywhere    |
| `Esc`                | Normal          | Clear active search filter or cancel all repository selections |
| `Enter`              | Editing / Input Modals | Save / submit typed text and persist |
| `Esc`                | Editing / Input Modals | Cancel modal input without saving (letters like `q`/`Q` are typed as regular input) |
| `ctrl+v` / Terminal Paste | Editing / Input Modals | Paste text from system clipboard (strips newlines for single-line inputs) |
| `Esc`                | RepoSearchInput | Clear repository search and return to Normal mode |
| `Esc`                | GlobalSearch    | Return to Normal mode             |
| `Tab`                | GlobalSearch    | Toggle focus between search query input and results |
| `↑` / `↓`            | GlobalSearch    | Navigate search results           |
| `Enter` (Query focus)| GlobalSearch    | Trigger/execute search scan       |
| `Enter` (Results focus) | GlobalSearch | Select matched result, jump to repository, and open Detail view |
| `Char`               | GlobalSearch    | Type query (when input is focused)|
| `Backspace`          | GlobalSearch    | Erase query character (when input is focused) |
| `Enter`              | Settings (Edit) | Save settings edit                |
| `Esc`                | Settings (Edit) | Cancel settings edit              |
| `Esc` / `q`          | Settings        | Return to the category sidebar (from the fields panel), or to Home if the sidebar is already focused |
| `Q`                  | Settings        | Exit Settings and return to Home  |
| `↑` / `↓` / `k` / `j` | Settings        | Navigate setting fields / categories |
| `Enter` / `Space`    | Settings        | Toggle / Edit selected setting    |
| `Tab` / `Shift+Tab`  | Settings        | Switch focus between category list (sidebar) and settings list |
| `←` / `h`            | Settings        | Focus category list (sidebar)     |
| `→` / `l` / `w` / `W` | Settings       | Focus settings list               |
| `1` - `5`            | Settings        | Jump directly to category: General (1), Sorting (2), Scan (3), Theme (4), Keybindings (5) |
| `Esc` / `q`          | DebugLogs       | Exit Debug Logs (or clear filter if active) and return to Home |
| `c` / `C` / `x`      | DebugLogs       | Clear all debug logs and reset scroll |
| `/`                  | DebugLogs       | Enter fuzzy search query mode    |
| `Enter`              | DebugLogs (Search) | Finish typing query and lock focus to log list scrolling |
| `Esc`                | DebugLogs (Search) | Clear query character/text or exit search mode |
| `Backspace`          | DebugLogs (Search) | Erase query character            |
| `Char`               | DebugLogs (Search) | Type query character             |
| `↑` / `↓` / `k` / `j` | DebugLogs       | Scroll debug logs list            |
| `PgUp` / `PgDn`      | DebugLogs       | Scroll debug logs list by page size |
| `Home` / `End`       | DebugLogs       | Jump to top / bottom of debug logs |
| `Backspace`          | Editing         | Erase the character before the caret |
| `←` / `→`            | Editing / Input Modals | Move the caret within the field. Fuzzy pickers keep the arrows for moving their selection. |
| `Home` / `End`       | Editing / Input Modals | Move the caret to the start / end of the field |
| `Delete`             | Editing / Input Modals | Erase the character under the caret |
| `Tab` / `↑` / `↓`    | Tag Creation    | Switch focus between Tag Name and Tag Message input fields |
| `y` / `Y`            | Confirm Dialog  | Confirm action (delete item/branch/tag/stash/remote/submodule, update a Modified submodule, push branch/tag/all tags, tag overwrite, abort/continue merge, checkout of a branch, tag, commit or issue/PR branch, track launch directory). `Enter` also confirms non-destructive dialogs (checkouts, pushes, merges); on destructive ones it cancels |
| `f` / `F`            | Confirm Dialog  | Force push tag (`--force`) in Tag Push confirmation dialog |
| `t` / `T`            | Confirm Dialog  | Push branch with tags (`--tags`) in Branch Push confirmation dialog |
| `n` / `N` / `Esc`    | Confirm Dialog  | Cancel action                     |
| `?` / `Esc` / `q` / `Q` | Help         | Close the help overlay            |
| `Esc` / `q` / `Q`    | Detail          | Return to the list (from the Advanced tab group, the first press steps back to the Primary tabs; an open full diff or commit search is closed first) |
| `Tab` / `Shift+Tab`  | Detail          | Cycle active detail view tabs within the active group (Primary vs. Advanced) |
| `w` / `W`            | Detail          | Cycle panel focus forward (w) / backward (W) |
| `+` / `-`            | Detail          | Grow (`+`) or shrink (`-`) the focused panel by moving its layout split (same splits the mouse can drag) |
| `1` - `7`            | Detail          | Jump directly to Primary tab: Workspace (1), Files (2), Graph (3), Branches (4), Tags (5), Remotes (6), Stashes (7) |
| `1` - `5`            | Detail          | Jump directly to Advanced tab: Worktrees (1), Submodules (2), Reflog (3), Issues (4), PRs (5) (when Advanced group is active) |
| `Z`                  | Detail          | Toggle between Primary and Advanced tab groups |
| `O`                  | Detail          | Toggle full-screen repository Overview overlay |
| `↑` / `k` / `K`      | Detail          | Move selection or scroll list/diff/tree up |
| `↓` / `j` / `J`      | Detail          | Move selection or scroll list/diff/tree down |
| `PgUp` / `PgDn`      | Detail / Normal / Settings | Scroll list/diff/tree/settings by configured `page_size` |
| `Home` / `End`       | Detail / Normal / Settings | Jump to top / bottom of list/diff/tree/settings |
| `Enter`              | Detail          | Stage/Unstage file (Workspace tab), checkout branch (Branches tab), checkout tag (Tags tab), open worktree in new context (Worktrees tab), checkout commit (Reflog tab; also `Space`; asks confirmation), checkout the issue's or PR's branch (Issues / PRs tabs; asks confirmation), or Inspect commit |
| `f` / `F`            | Detail          | Fetch remote repository (Branches / Tags / Remotes tabs) |
| `p`                  | Detail          | Pull selected local branch from remote (Branches tab), Push selected tag (Tags tab; asks confirmation), or Prune stale worktree metadata (Worktrees tab) |
| `Shift+P`            | Detail          | Push selected local branch to remote (Branches tab) or Push all tags (Tags tab; asks confirmation) |
| `←` / `→`            | Detail          | Focus Local/Remote branch list (Branches tab only; on the Tags tab switch local/remote focus with `w` / `W` or the mouse) |
| `>` / `→` / `Enter`  | Detail          | Expand / toggle selected folder (Files tab) |
| `<` / `,`            | Detail          | Collapse selected folder (Files tab) |
| `←`                  | Detail          | Collapse all folders (Files tab)  |
| `/`                  | Detail          | Fuzzy find files (Files tab) / commits (Workspace commits list / Logs view) / branches (Branches tab) / tags (Tags tab) |
| `e` / `o`            | Detail          | Open selected file in configured terminal editor (Files tab)      |
| `Shift+H`            | Detail          | View selected file's commit/revision history (Files tab) |
| `c`                  | Detail          | Open commit prompt (Workspace tab or Inspect view), or Create branch from HEAD (Branches tab) |
| `C`                  | Detail          | Open commit prompt with Amend (Workspace tab or Inspect view)    |
| `a`                  | Detail          | Toggle "Assigned to me" / "All Open" issues (Issues tab), Stage All (`a`/`A`, Workspace tab Unstaged focus) / Unstage All (`a`/`A`, Workspace tab Staged focus), Apply stash (Stashes tab), Add worktree (Worktrees tab; an existing branch, tag or commit, or a new branch name to create), Add remote (`a`/`A`, Remotes tab), or Add submodule (Submodules tab) |
| `n`                  | Detail          | Add line comment to selected PR (PRs tab; asks for file path, line and comment in turn), or Toggle line numbers in content viewer (`n`/`N`, Files tab) |
| `b` / `B`            | Detail          | Toggle git blame panel (Files tab), or Create branch at selected commit (Workspace commits list) |
| `t` / `T`            | Detail          | Create tag at selected commit (Workspace commits list)           |
| `y` / `Y`            | Detail          | Yank selected commit hash (Workspace commits list)               |
| `v` / `V`            | Detail          | Revert selected commit (Workspace commits list; asks confirmation) |
| `p` / `P`            | Detail          | Cherry-pick selected commit (Workspace commits list; asks confirmation) |
| `x`                  | Detail          | Discard selected file changes (Workspace tab, Inspect view, or Files tab via `x`/`X`; asks confirmation), or discard the selected hunk/line (`x` / `Delete`, Workspace diff / Inspect StagingDetails focus; applies immediately) |
| `X`                  | Detail          | Discard all changes in repository (Workspace tab or Inspect view; asks confirmation) |
| `i` / `I`            | Detail          | Interactive rebase from selected commit (Workspace tab commits list), or interactive rebase of the current branch onto the selected branch (Branches tab; asks confirmation) |
| `G`                  | Detail          | Load more commits (Workspace commits list / Logs view)            |
| `l`                  | Detail          | Open Logs view (Workspace tab commits list focus), Toggle line-by-line staging mode (`l`/`L`, Workspace diff / Inspect StagingDetails focus), or Toggle lock status (Worktrees tab; asks reason/unlocks) |
| `D`                  | Detail          | Delete selected branch (Branches tab; asks confirmation), tag (Tags tab; asks confirmation), stash (Stashes tab; asks confirmation), remote (Remotes tab; asks confirmation), submodule (Submodules tab; asks confirmation), or remove worktree and its folder (Worktrees tab; `1` only if it is clean, `2` force-remove discarding uncommitted changes) |
| `s` / `S`            | Detail          | Stage selected hunk/line (Workspace tab StagingDetails focus), open Stashing UI overlay (Workspace tab files list focus), Prompt to save stash (Stashing UI / Stashes tab), or Open Repository Settings popup (Overview overlay) |
| `u` / `U`            | Detail          | Unstage selected hunk/line (Workspace tab StagingDetails focus), Toggle "Stash untracked files" option (Stashing UI), or Initialize / update the selected submodule (`u`) or every submodule (`U`) (Submodules tab; asks confirmation when one shows Modified) |
| `i`                  | Detail          | Toggle "Keep index" option (Stashing UI)                         |
| `Ctrl+U`             | Input (Stash)   | Toggle "Stash untracked files" option (Stash Create popup)       |
| `Ctrl+I`             | Input (Stash)   | Toggle "Keep index" option (Stash Create popup)                 |
| `m`                  | Detail          | Merge selected branch into current branch (Branches tab; asks confirmation) |
| `M`                  | Detail          | Checkout selected local branch and merge the current branch into it (Branches tab, Local panel; asks confirmation). With the Remote panel focused, `M` falls through to a plain merge of the selected branch, same as `m` |
| `r`                  | Detail          | Rebase current branch onto selected branch (Branches tab; asks confirmation) |
| `o`                  | Detail          | Checkout selected commit (Workspace commits list; asks confirmation), Open selected issue/PR in web browser (Forge tabs), or Accept OURS version of conflict (Workspace tab or Inspect view, Conflicts / ConflictDiff). `O` is reserved for the Overview overlay |
| `t`                  | Detail          | Accept THEIRS version of conflict (Workspace tab or Inspect view, Conflicts / ConflictDiff) |
| `r`                  | Detail          | Mark conflict as resolved (Workspace tab or Inspect view, Conflicts / ConflictDiff) |
| `A`                  | Detail          | Abort the merge (Workspace tab or Inspect view, Conflicts / ConflictDiff; asks confirmation) |
| `C`                  | Detail          | Continue the merge (Workspace tab or Inspect view, Conflicts / ConflictDiff; asks confirmation) |
| `M`                  | Detail          | Open external mergetool (Workspace tab or Inspect view, Conflicts file list / ConflictDiff pane) |
| `f`                  | Detail          | Open search column picker and go to logs (Workspace tab) |
| `R`                  | Detail          | Resync the active tab state       |
| `?`                  | Detail          | Toggle detail help overlay        |
| `Esc` / `q` / `Q` / `?` | DetailHelp   | Close detail help overlay         |
| `⌃S` (Ctrl+S)        | CommitInput (Edit) | Submit / execute Git commit directly from edit mode |
| `⌃A` (Ctrl+A)        | CommitInput (Edit) | Toggle amend last commit option |
| `⌃D` (Ctrl+D)        | CommitInput (Edit) | Maximize / restore the popup window size |
| `⌃C` (Ctrl+C)        | CommitInput (Edit) | Finish editing commit message (switches to confirm state) |
| `⌃H` (Ctrl+H)        | CommitInput (Edit) | Open commit history picker |
| `⌃U` (Ctrl+U)        | CommitInput (Edit) | Clear entire commit message buffer |
| `⌃K` (Ctrl+K)        | CommitInput (Edit) | Kill (delete) text from cursor to end of line |
| `⌃W` (Ctrl+W)        | CommitInput (Edit) | Delete the word before the cursor |
| `⌃B` / `⌃F` (Ctrl+B / Ctrl+F) | CommitInput (Edit) | Move cursor left / right |
| `⌃P` / `⌃N` (Ctrl+P / Ctrl+N) | CommitInput (Edit) | Move cursor one line up / down |
| `↵` (Enter)          | CommitInput (Edit) | Insert a newline                  |
| `Backspace`          | CommitInput (Edit) | Erase one character from commit message |
| `Esc`                | CommitInput     | Cancel commit and return to Detail view (in confirm state `q` also closes) |
| `↵` (Enter)          | CommitInput (Confirm) | Submit / execute Git commit      |
| `e` / `E`            | CommitInput (Confirm) | Edit / resume typing commit message |
| `a` / `Space`        | CommitInput (Confirm) | Toggle amend last commit option   |
| `d` / `D` / `m` / `M` | CommitInput (Confirm) | Maximize / restore the popup window size |
| `x` / `X` / `u` / `U` | CommitInput (Confirm) | Clear entire commit message buffer |
| `Left-Click` (Mouse) | Normal          | Select the clicked item           |
| `Double-Click` (Mouse)| Normal         | Open Detail view for clicked item |
| `Left-Click` (Mouse) | Detail          | Shift focus to the clicked panel or change active tab |
| `Left-Click + Drag` (Mouse) | Detail    | Drag panel boundary splitters to dynamically resize layout splits |
| `Scroll Wheel` (Mouse)| Normal / Detail | Scroll selected list, graph view, branches, tree items, or unified diffs |

Press `?` at any time in normal mode to see the full keybinding reference as a centered popup. The help overlay only handles the dismissal keys — your selection and scroll position are preserved underneath.

The selected card's border color mirrors the current operation mode:
- **Default (Muted)** — browsing the list (unselected).
- **Cyan** — browsing the list (selected).
- **Yellow** — typing into the input field during add/edit; the selected card's border turns yellow so you can see exactly which item will be replaced.
- **Red** — awaiting delete confirmation; the doomed card's border turns red.

The selected item is marked with a left-edge `▌` accent, a colored border, and bold text. In `ADDING` and `EDITING` modes the real terminal cursor sits at the end of your input so you can see exactly where the next character will land.

### Repository Settings Popup controls:
When viewing the Repository Settings popup (entered via `s` on the repository Overview page):
- `↑` / `↓` / `j` / `k` — Navigate settings rows.
- `Enter` / `Space` — Toggle/Edit the selected setting:
  * For editable fields (Page Size, Max Commits, Auto Fetch interval, Editor Command, User Note, Git LFS Track): starts/enters editing mode (type and press `Enter` to confirm, `Esc` to cancel).
  * For action fields (Git LFS Pull, LFS Storage Size): triggers the pull background job or refreshes the storage size.
- `←` / `→` / `h` / `l` — Cycle options (Theme, Resync on Tab Change).
- `Esc` / `q` — Close repository settings popup and return to repository Detail view.

### Label Settings Popup controls:
When viewing the Label Settings popup (entered via `→` on a highlighted label in the label picker). Settings chosen here apply to every repository carrying that label, resolved between the per-repo override and the global default (repo → label → global):
- `↑` / `↓` / `j` / `k` — Navigate settings rows.
- `Enter` / `Space` — Toggle/Edit the selected setting:
  * For editable fields (Page Size, Max Commits, Auto Fetch interval, Editor Command): starts/enters editing mode (type and press `Enter` to confirm, `Esc` to cancel).
  * For option fields (Theme, Resync on Tab Change, Sort By, Sort Reverse, View Mode): steps to the next option.
- `←` / `→` / `h` / `l` — Cycle options (Theme, Resync on Tab Change, Sort By, Sort Reverse, View Mode). Sort By walks default → Custom → Alphabetical → Recent Visit → Latest Changes → default; Sort Reverse walks default → yes → no → default; View Mode walks default → Normal → Compact → Tile → default. All three apply only while that label's filter is active; the sort rows re-sort the list at once if it is, and the View Mode row redraws it in the new layout.
- `Esc` — Return to the label picker.


## Customizing Keybindings

All bindings are stored in `keybindings.toml` next to your `config.toml` (e.g. `~/.gitwig/keybindings.toml` or `~/.config/gitwig/keybindings.toml`). Edit them in-app via Settings (`s`) → Keybindings, or in the file directly — each action holds a `keys` list, for example:

```toml
[navigation.grow_panel]
keys = ["+"]
description = "Grow the focused panel"
```

Entries in this file **override the built-in defaults**. Actions missing from the file are backfilled with their defaults on startup, but existing entries are generally not rewritten — so if a default changes in a newer Gitwig version (for example, panel grow was briefly bound to both `+` and `=` in development builds before settling on `+` alone), a previously written entry keeps the old keys until you edit it or delete the entry to re-adopt the default. The exception is a default that a newer version *extended*: an entry still holding exactly the old default was never customised, so it is moved onto the new one (so far only `detail.move_up` / `detail.move_down`, which gained `K` / `J`). An entry you changed is always left alone.

Not every key is configurable yet. The following views still match their keys in code and ignore `keybindings.toml` (only their generic navigation keys — `↑`/`↓`/`PgUp`/`PgDn`/`Home`/`End`/`Enter`/`Esc` — follow the `[navigation]` section):

- On the Branches tab, fetch (`f`/`F`) and add remote (`a`/`A`) are hard-coded (there is no `[branches]` entry for them).
- On the Files tab, the tree's `Enter`/`→` folder toggle, `←` collapse-all, and `x`/`X` discard are hard-coded; `>`, `<`/`,`, and the rest of the `[files]` section are configurable.
- The full-screen Logs view (`l`/`L` from the commits list) and the per-file History view (`H` from the Files tab) hard-code every key they handle.