Every command in Druk’s global keymap can be rebound to a chord of your choosing via theDocumentation Index
Fetch the complete documentation index at: https://mintlify.com/letstri/druk/llms.txt
Use this file to discover all available pages before exploring further.
keybindings setting in your config file. Custom bindings take precedence over all built-in defaults, and any conflict or invalid value is reported with a startup warning rather than silently failing — a bad config can never cost you a key.
How to remap
Add akeybindings map to your ~/.config/druk/config.json. Each entry maps a command id to a chord string. Setting a value to an empty string or "none" removes the binding entirely, leaving the command with no key.
~/.config/druk/config.json
Chord format
A valid chord must include at least one modifier:Ctrl, Opt/Alt, or a standalone function key (F1–F12). A bare letter or arrow key without a modifier is rejected because it would intercept normal typing.
| Example chord | Notes |
|---|---|
Ctrl+S | Ctrl plus a letter |
Ctrl+Opt+K | Ctrl plus the second modifier plus a letter |
F2 | Function key alone — no Ctrl required |
Ctrl+Opt+← | Arrow keys are valid key names |
Ctrl+Shift+K | Shift is parsed as an alias for Opt/Alt |
← → ↑ ↓), spelled-out names (Left, ArrowLeft), and common abbreviations (PgUp, PgDn, Bksp, Del, Ins, Esc, Enter, Ret, Spc).
On macOS the second modifier is called Opt (Option, ⌥). On Linux and Windows it is Alt. Druk accepts both spellings — and also
Option, Meta, Cmd, Command, Super, and Shift — and treats them all as the same modifier flag. The chord Ctrl+Opt+G and Ctrl+Alt+G are identical.Outside the kitty keyboard protocol,
Ctrl+Shift+<letter> arrives at the terminal byte-identical to Ctrl+<letter>. Druk accepts the chord but it will behave identically to the unshifted version in most terminals. Use Ctrl+Opt+<letter> instead for a second modifier that is reliably distinguishable.Conflict resolution
Druk settles chord conflicts deterministically:- Custom binding beats default — if you bind
Ctrl+Gto a different command, the original command loses that chord. - Between two custom bindings, the command that appears earlier in the bindable table (listed below) keeps the chord; the other is left unbound. Both cases emit a startup warning in the status bar.
Invalid values
A chord is rejected — and the command keeps its default — when:- It has no modifier and is not a function key (e.g.
"k"by itself) - It uses a reserved byte that belongs to another key:
Ctrl+I— same byte as TabCtrl+[— same byte as EscapeCtrl+M— same byte as EnterCtrl+J— same byte as newlineCtrl+H— same byte as BackspaceCtrl+C— copies selection / quitsCtrl+Space— triggers autocomplete
invalid at startup and are reported in the status bar.
All bindable commands
| Command id | Default chord(s) | Description |
|---|---|---|
palette | F1, Ctrl+Opt+P | Command palette |
peek | Ctrl+K | Peek at every key |
open | Ctrl+P, Ctrl+O | Open file… |
save | Ctrl+S | Save file |
goto | Ctrl+G | Go to line… |
find.file | Ctrl+F | Find in current file |
find.project | Ctrl+R | Find in project |
find.replace | (none) | Replace in current file |
file.new | Ctrl+N | New file |
file.newDir | Ctrl+Opt+N | New folder |
tabs.close | Ctrl+W | Close tab |
tabs.reopen | Ctrl+Opt+T | Reopen closed tab |
tabs.switch | Ctrl+T | Switch to open tab |
tabs.prev | Ctrl+Opt+← | Previous tab |
tabs.next | Ctrl+Opt+→ | Next tab |
tabs.closeOthers | (none) | Close other tabs |
tabs.closeAll | (none) | Close all tabs |
view.sidebar | Ctrl+B | Show / hide sidebar |
view.git | Ctrl+Opt+G | Source control panel |
view.markdown | Ctrl+Opt+M | Markdown: rendered / source |
view.focus | (none) | Focus tree / editor |
git.diffFile | (none) | Diff current file |
git.commit | (none) | Commit… |
git.push | (none) | Push |
git.compare | (none) | Compare branches |
problems.list | (none) | List problems |
problems.next | (none) | Next problem |
problems.prev | (none) | Previous problem |
settings | (none) | Settings |
help | (none) | Keyboard shortcuts |
quit | Ctrl+Q | Quit |
Config example
~/.config/druk/config.json