# ⌨️ 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.