| ... | ... | @@ -4,19 +4,6 @@ T3 Code reads keybindings from: |
| 4 | 4 | |
| 5 | 5 | - `~/.t3/keybindings.json` |
| 6 | 6 | |
| 7 | | Schema source of truth: |
| 8 | | |
| 9 | | - [`packages/contracts/src/keybindings.ts`](packages/contracts/src/keybindings.ts) |
| 10 | | - [`packages/contracts/src/server.ts`](packages/contracts/src/server.ts) |
| 11 | | |
| 12 | | Server-side parsing/default resolution/merging: |
| 13 | | |
| 14 | | - [`apps/server/src/keybindings.ts`](apps/server/src/keybindings.ts) |
| 15 | | |
| 16 | | Server wiring (`server.getConfig`): |
| 17 | | |
| 18 | | - [`apps/server/src/wsServer.ts`](apps/server/src/wsServer.ts) |
| 19 | | |
| 20 | 7 | The file must be a JSON array of rules: |
| 21 | 8 | |
| 22 | 9 | ```json |
| ... | ... | @@ -26,7 +13,25 @@ The file must be a JSON array of rules: |
| 26 | 13 | ] |
| 27 | 14 | ``` |
| 28 | 15 | |
| 29 | | ## Rule Shape |
| 16 | See the full schema for more details: [`packages/contracts/src/keybindings.ts`](packages/contracts/src/keybindings.ts) |
| 17 | |
| 18 | ## Defaults |
| 19 | |
| 20 | ```json |
| 21 | [ |
| 22 | { "key": "mod+j", "command": "terminal.toggle" }, |
| 23 | { "key": "mod+d", "command": "terminal.split", "when": "terminalFocus" }, |
| 24 | { "key": "mod+shift+d", "command": "terminal.new", "when": "terminalFocus" }, |
| 25 | { "key": "mod+shift+o", "command": "chat.new" }, |
| 26 | { "key": "mod+o", "command": "editor.openFavorite" } |
| 27 | ] |
| 28 | ``` |
| 29 | |
| 30 | For most up to date defaults, see [`DEFAULT_KEYBINDINGS` in `apps/server/src/keybindings.ts`](apps/server/src/keybindings.ts) |
| 31 | |
| 32 | ## Configuration |
| 33 | |
| 34 | ### Rule Shape |
| 30 | 35 | |
| 31 | 36 | Each entry supports: |
| 32 | 37 | |
| ... | ... | @@ -36,7 +41,7 @@ Each entry supports: |
| 36 | 41 | |
| 37 | 42 | Invalid rules are ignored. Invalid config files are ignored. Warnings are logged by the server. |
| 38 | 43 | |
| 39 | | ## Available Commands |
| 44 | ### Available Commands |
| 40 | 45 | |
| 41 | 46 | - `terminal.toggle`: open/close terminal drawer |
| 42 | 47 | - `terminal.split`: split terminal (in focused terminal context by default) |
| ... | ... | @@ -44,7 +49,7 @@ Invalid rules are ignored. Invalid config files are ignored. Warnings are logged |
| 44 | 49 | - `chat.new`: create a new chat thread for the active project |
| 45 | 50 | - `editor.openFavorite`: open current project/worktree in the last-used editor |
| 46 | 51 | |
| 47 | | ## Key Syntax |
| 52 | ### Key Syntax |
| 48 | 53 | |
| 49 | 54 | Supported modifiers: |
| 50 | 55 | |
| ... | ... | @@ -61,7 +66,7 @@ Examples: |
| 61 | 66 | - `ctrl+l` |
| 62 | 67 | - `cmd+k` |
| 63 | 68 | |
| 64 | | ## `when` Conditions |
| 69 | ### `when` Conditions |
| 65 | 70 | |
| 66 | 71 | Currently available context keys: |
| 67 | 72 | |
| ... | ... | @@ -83,31 +88,7 @@ Examples: |
| 83 | 88 | |
| 84 | 89 | Unknown condition keys evaluate to `false`. |
| 85 | 90 | |
| 86 | | ## Defaults |
| 87 | | |
| 88 | | Built-in defaults are resolved on the server and sent to the web client via `server.getConfig`: |
| 89 | | |
| 90 | | - Source of truth: [`DEFAULT_KEYBINDINGS` in `apps/server/src/keybindings.ts`](apps/server/src/keybindings.ts) |
| 91 | | |
| 92 | | If you define any rules for a command, the default rule for that command is removed on the server. |
| 93 | | |
| 94 | | ## Server-Resolved Payload |
| 95 | | |
| 96 | | `~/.t3/keybindings.json` is parsed and compiled on the server. The web client receives resolved rules and does not parse raw keybinding strings. |
| 97 | | |
| 98 | | Resolved rule payload fields: |
| 99 | | |
| 100 | | - `command` |
| 101 | | - `shortcut` |
| 102 | | - `whenAst` (optional) |
| 103 | | |
| 104 | | See: |
| 105 | | |
| 106 | | - [`packages/contracts/src/keybindings.ts`](packages/contracts/src/keybindings.ts) |
| 107 | | - [`apps/server/src/keybindings.ts`](apps/server/src/keybindings.ts) |
| 108 | | - [`apps/server/src/wsServer.ts`](apps/server/src/wsServer.ts) |
| 109 | | |
| 110 | | ## Precedence |
| 91 | ### Precedence |
| 111 | 92 | |
| 112 | 93 | - Rules are evaluated in array order. |
| 113 | 94 | - For a key event, the last rule where both `key` matches and `when` evaluates to `true` wins. |