# Change key bindings in Skink (bindings.json)

> Customize Skink's shortcuts in bindings.json, Micro's format: key names, chained actions, command shortcuts, examples, and keys that need the kitty protocol.

Source: https://skink.cc/customize/keybindings/

Run `:bindings` to open `bindings.json`, add `"Key": "Action"` pairs, save, and run `:reload`. The format is Micro's, so a Micro `bindings.json` works as it is.

1. Press Ctrl+E and run `bindings`. The file opens in a tab (created empty when missing).

2. Add your bindings:

   ```json
   {
     "Ctrl-j": "Save",
     "Alt-g": "command-edit:goto "
   }
   ```

3. Save with Ctrl+S, then run `reload`. Unknown key names are reported in the status line.

Your bindings are added on top of the defaults. Remove a line and `:reload`, and that key goes back to its default.

All defaults are listed in [Keyboard shortcuts](https://skink.cc/reference/shortcuts/).

## Key names in bindings.json

Key names follow Micro. The one surprise: with Alt, a capital letter means Shift too. `"Alt-G"` is Alt+Shift+G, and `"Alt-g"` is Alt+G. This notation is only for the file; the docs and the in-app help write keys as you press them.

| Kind | Examples |
|---|---|
| Letters and symbols | `Ctrl-q`, `Alt-/`, `Ctrl-]`, `Alt-.` |
| Shift with Alt | `Alt-G` (capital letter) |
| Ctrl and Shift | `CtrlShift-d`, `CtrlShiftUp` |
| Movement | `Up`, `Down`, `Left`, `Right`, `Home`, `End`, `PageUp`, `PageDown` |
| With modifiers | `ShiftUp`, `CtrlHome`, `Alt-CtrlDown`, `CtrlPageDown` |
| Other | `Enter`, `Tab`, `Backtab`, `Backspace`, `Delete`, `Insert`, `Esc`, `Space` |
| Function keys | `F1` to `F20`, `ShiftF12` |

The dash after a modifier is optional: `CtrlHome` and `Ctrl-Home` are the same.

## Action values

| Value | Meaning |
|---|---|
| `"Save"` | One action |
| `"Copy\|CopyLine"` | Try each in order; the first that works runs |
| `"Escape,Deselect"` | Run all of them, in order |
| `"command-edit:TEXT"` | Open the command line with `TEXT` already typed |

Every action is listed in the [manual](https://skink.cc/reference/manual/) and in the command palette (F1).

Commands are in [Commands](https://skink.cc/reference/commands/).

## Examples

```jsonc
{
  // VS Code habits
  "Ctrl-p": "QuickOpen",            // instead of FindPrevious
  "Ctrl-w": "Quit",                 // close the tab (default: next pane)
  "Ctrl-g": "command-edit:goto ",   // go to line (default: AI prompt box)

  // Terminal tabs on other keys
  "F7": "ToggleTerminal",
  "ShiftF7": "NewTerminal",

  // Font size, in Kitty or EveryAI
  "Alt-=": "FontBigger",
  "Alt--": "FontSmaller",

  // Shortcuts to commands
  "Alt-b": "command-edit:blame",
  "Alt-y": "command-edit:run cargo test"
}
```

`command-edit:` only fills in the command line; press Enter to run it.

Rebinding a key replaces its default. In the example, Alt+= no longer grows the pane, so pick keys you do not need.

## Terminal tabs and your bindings

Inside a terminal tab, keys go to the program. The exceptions are Alt+1…9, Ctrl+PageUp / PageDown, and F-keys bound to Skink's app actions (`ToggleTerminal`, `NewTerminal`, `CloseTerminal`, `ToggleTree`, `ToggleSidebar`, `PreviousTab`, `NextTab`).

So if you want a key that also works from a terminal tab, use an F-key. See [Terminal tabs](https://skink.cc/tools/terminal-tabs/).

## Keys your terminal may not send

Classic terminal key encoding cannot tell some chords apart. Skink turns on the **kitty keyboard protocol** when it detects a terminal that supports it (Ghostty, Kitty, WezTerm, foot, Alacritty, Rio, iTerm2), and then every chord arrives as pressed.

Elsewhere, including most `tmux` and `mosh` sessions, these arrive differently:

| You press | Arrives as | Workaround |
|---|---|---|
| Ctrl+Shift+D | Ctrl+D | Bind `Duplicate\|DuplicateLine` to another key |
| Ctrl+Shift+F | Ctrl+F | Use Alt+S for project search |
| Ctrl+] | Ctrl+5 | Add `"Ctrl-5": "JumpToMatchingBrace"` |
| Ctrl+\\ | Ctrl+4 | Already bound to the same split |
| Ctrl+/ | Ctrl+7 | Already bound to toggle comment |

Without the protocol, a quick Esc followed by a letter can also look like Alt+letter.

If the protocol causes trouble in an unusual setup, set `SKINK_NO_KITTY_KEYS=1` to turn it off.

On a Mac, Option types special characters instead of acting as Alt. Skink handles most of this for you; see [macOS Option key](https://skink.cc/customize/macos-option-key/).

## When a key does not reach Skink: type its command

You do not have to rebind a key that your terminal, tmux, the OS or your keyboard layout swallows. Press Ctrl+E and type the key's command instead, for example `comment`, `dotfiles` or `nexthunk`.

Any action also runs by its own name, in any spelling: `ToggleComment`, `toggle-comment` and `togglecomment` are the same.

The short names are listed in [Every key has a typed command](https://skink.cc/editing/typed-commands/).

## Finding what a key does

- [Keyboard shortcuts](https://skink.cc/reference/shortcuts/) lists every default binding with its typed command.
- `:help` opens the manual, which ends with the full key table and the command for each key.
- F1 opens the command palette with every action, its key and its command.
