dotfiles

dot files
git clone git://git.rr3.xyz/dotfiles | git clone gits://git.rr3.xyz/dotfiles
Log | Files | Refs | Submodules

keymap.json (19114B)


      1 // TODO: git, pane splits?, search (next, etc.), vim, project_panel
      2 // For the most part, we use ALT as a modifier for application (Zed)-specific
      3 // commands. In a few cases, we use CTRL instead of ALT for consistency with
      4 // other applications (e.g., web browsers).
      5 [
      6 	// Zed application
      7 	{
      8 		// No "context" field means always active.
      9 		"bindings": {
     10 			// Confirm/cancel
     11 			"enter": "menu::Confirm",
     12 			"escape": "menu::Cancel",
     13 
     14 			// Buffer font size
     15 			"ctrl-alt-pageup": [
     16 				"zed::IncreaseBufferFontSize",
     17 				{ "persist": false },
     18 			],
     19 			"ctrl-alt-pagedown": [
     20 				"zed::DecreaseBufferFontSize",
     21 				{ "persist": false },
     22 			],
     23 			"ctrl-alt-home": ["zed::ResetBufferFontSize", { "persist": false }],
     24 
     25 			// UI font size
     26 			"ctrl-alt-shift-pageup": [
     27 				"zed::IncreaseUiFontSize",
     28 				{ "persist": false },
     29 			],
     30 			"ctrl-alt-shift-pagedown": [
     31 				"zed::DecreaseUiFontSize",
     32 				{ "persist": false },
     33 			],
     34 			"ctrl-alt-shift-home": [
     35 				"zed::ResetUiFontSize",
     36 				{ "persist": false },
     37 			],
     38 
     39 			// Keymap configuration
     40 			"f9": "zed::OpenKeymapFile",
     41 			"shift-f9": "zed::OpenDefaultKeymap",
     42 			"ctrl-f9": "vim::OpenDefaultKeymap",
     43 			"ctrl-shift-f9": "dev::OpenKeyContextView",
     44 
     45 			// Settings configuration
     46 			"f10": "zed::OpenSettingsFile",
     47 			"shift-f10": "zed::OpenDefaultSettings",
     48 			"ctrl-f10": "zed::OpenProjectSettingsFile",
     49 
     50 			// Fullscreen
     51 			"f11": "zed::ToggleFullScreen",
     52 
     53 			// Markdown
     54 			"alt-m": "markdown::OpenPreview",
     55 		},
     56 	},
     57 
     58 	// Menus
     59 	{
     60 		"context": "Picker || menu",
     61 		"bindings": {
     62 			// Navigation
     63 			"up": "menu::SelectPrevious",
     64 			"down": "menu::SelectNext",
     65 			"home": "menu::SelectFirst",
     66 			"end": "menu::SelectLast",
     67 			"pageup": "menu::SelectFirst",
     68 			"pagedown": "menu::SelectLast",
     69 			"tab": "menu::SelectNext",
     70 			"shift-tab": "menu::SelectPrevious",
     71 		},
     72 	},
     73 
     74 	{
     75 		"context": "Workspace",
     76 		"bindings": {
     77 			"alt-space": "command_palette::Toggle",
     78 			"alt-`": "workspace::ToggleZoom",
     79 
     80 			// Open new things
     81 			"ctrl-t": "workspace::NewFile",
     82 			"ctrl-n": "workspace::NewWindow",
     83 			"alt-t": "workspace::NewCenterTerminal",
     84 			"alt-f": "workspace::NewSearch",
     85 			"alt-p": "file_finder::Toggle",
     86 
     87 			// Activate panes
     88 			"ctrl-alt-up": "workspace::ActivatePaneUp",
     89 			"ctrl-alt-down": "workspace::ActivatePaneDown",
     90 			"ctrl-alt-left": "workspace::ActivatePaneLeft",
     91 			"ctrl-alt-right": "workspace::ActivatePaneRight",
     92 
     93 			// Move panes
     94 			"ctrl-alt-shift-up": "workspace::SwapPaneUp",
     95 			"ctrl-alt-shift-down": "workspace::SwapPaneDown",
     96 			"ctrl-alt-shift-left": "workspace::SwapPaneLeft",
     97 			"ctrl-alt-shift-right": "workspace::SwapPaneRight",
     98 
     99 			// Open/focus side panes
    100 			"alt-e": "project_panel::ToggleFocus",
    101 			"alt-g": "git_panel::ToggleFocus",
    102 			"alt-o": "outline_panel::ToggleFocus",
    103 
    104 			// Close side panes
    105 			// Ideally, alt-shift-g would only close the git panel and alt-shift-o
    106 			// would only close the outline panel, but this is the best we can get
    107 			// right now.
    108 			"alt-shift-e": "workspace::ToggleLeftDock",
    109 			"alt-shift-g": "workspace::ToggleRightDock",
    110 			"alt-shift-o": "workspace::ToggleRightDock",
    111 		},
    112 	},
    113 
    114 	{
    115 		"context": "Pane",
    116 		"bindings": {
    117 			// Activate tabs
    118 			"alt-1": ["pane::ActivateItem", 0],
    119 			"alt-2": ["pane::ActivateItem", 1],
    120 			"alt-3": ["pane::ActivateItem", 2],
    121 			"alt-4": ["pane::ActivateItem", 3],
    122 			"alt-5": ["pane::ActivateItem", 4],
    123 			"alt-6": ["pane::ActivateItem", 5],
    124 			"alt-7": ["pane::ActivateItem", 6],
    125 			"alt-8": ["pane::ActivateItem", 7],
    126 			"alt-left": "pane::ActivatePreviousItem",
    127 			"alt-right": "pane::ActivateNextItem",
    128 
    129 			// Move tabs
    130 			"alt-down": "pane::SwapItemLeft",
    131 			"alt-up": "pane::SwapItemRight",
    132 
    133 			// Close and reopen tabs
    134 			"ctrl-w": "pane::CloseActiveItem",
    135 			"ctrl-shift-t": "pane::ReopenClosedItem",
    136 
    137 			// Search
    138 			"alt-s": "project_search::ToggleFilters",
    139 			"alt-r": "search::ToggleRegex",
    140 			"alt-c": "search::ToggleCaseSensitive",
    141 			"alt-d": "search::ToggleReplace",
    142 			"alt-shift-d": "search::ReplaceNext",
    143 			"alt-ctrl-d": "search::ReplaceAll",
    144 		},
    145 	},
    146 
    147 	// Editor (multi-line or single-line)
    148 	{
    149 		"context": "Editor",
    150 		"bindings": {
    151 			// Navigation
    152 			"up": "editor::MoveUp",
    153 			"down": "editor::MoveDown",
    154 			"left": "editor::MoveLeft",
    155 			"right": "editor::MoveRight",
    156 			"home": [
    157 				"editor::MoveToBeginningOfLine",
    158 				{ "stop_at_soft_wraps": true, "stop_at_indent": true },
    159 			],
    160 			"end": ["editor::MoveToEndOfLine", { "stop_at_soft_wraps": true }],
    161 			"pageup": "editor::MovePageUp",
    162 			"pagedown": "editor::MovePageDown",
    163 			"ctrl-up": "editor::LineUp",
    164 			"ctrl-down": "editor::LineDown",
    165 
    166 			// Selections
    167 			"shift-up": "editor::SelectUp",
    168 			"shift-down": "editor::SelectDown",
    169 			"shift-left": "editor::SelectLeft",
    170 			"shift-right": "editor::SelectRight",
    171 			"shift-home": [
    172 				"editor::SelectToBeginningOfLine",
    173 				{ "stop_at_soft_wraps": true, "stop_at_indent": true },
    174 			],
    175 			"shift-end": [
    176 				"editor::SelectToEndOfLine",
    177 				{ "stop_at_soft_wraps": true },
    178 			],
    179 			"shift-pageup": "editor::SelectPageUp",
    180 			"shift-pagedown": "editor::SelectPageDown",
    181 			"ctrl-a": "editor::SelectAll",
    182 
    183 			"tab": "editor::Tab",
    184 			"shift-tab": "editor::Backtab",
    185 			"backspace": "editor::Backspace",
    186 			"shift-backspace": "editor::Backspace",
    187 			"delete": "editor::Delete",
    188 
    189 			"escape": "editor::Cancel",
    190 			"f2": "editor::Rename",
    191 
    192 			"ctrl-x": "editor::Cut",
    193 			"ctrl-c": "editor::Copy",
    194 			"ctrl-v": "editor::Paste",
    195 
    196 			"ctrl-z": "editor::Undo",
    197 			"ctrl-shift-z": "editor::Redo",
    198 		},
    199 	},
    200 
    201 	// Editor (multi-line)
    202 	{
    203 		"context": "Editor && mode == full",
    204 		"bindings": {
    205 			// Newlines
    206 			"enter": "editor::Newline",
    207 			"shift-enter": "editor::Newline",
    208 			"ctrl-enter": "editor::NewlineBelow",
    209 			"ctrl-shift-enter": "editor::NewlineAbove",
    210 
    211 			"ctrl-f": "buffer_search::Deploy",
    212 		},
    213 	},
    214 
    215 	{
    216 		"context": "Editor && renaming",
    217 		"bindings": {
    218 			"enter": "editor::ConfirmRename",
    219 		},
    220 	},
    221 
    222 	{
    223 		"context": "Editor && showing_completions",
    224 		"bindings": {
    225 			"enter": "editor::ConfirmCompletion",
    226 		},
    227 	},
    228 
    229 	{
    230 		"context": "Editor && (showing_code_actions || showing_completions)",
    231 		"bindings": {
    232 			"up": "editor::ContextMenuPrevious",
    233 			"down": "editor::ContextMenuNext",
    234 			"pageup": "editor::ContextMenuFirst",
    235 			"pagedown": "editor::ContextMenuLast",
    236 		},
    237 	},
    238 
    239 	// Git editor
    240 	{
    241 		"context": "GitCommit > Editor && mode == auto_height",
    242 		"bindings": {
    243 			"enter": "editor::Newline",
    244 			"ctrl-enter": "git::Commit",
    245 			"ctrl-shift-enter": "git::Amend",
    246 		},
    247 	},
    248 
    249 	{
    250 		// Currently, "VimControl" is an alias for "vim_mode == normal ||
    251 		// vim_mode == visual || vim_mode == operator", but this could change.
    252 		"context": "VimControl && !menu",
    253 		"bindings": {
    254 			"up": ["vim::Up", { "display_lines": true }],
    255 			"shift-up": "editor::AddSelectionAbove",
    256 			"ctrl-up": "vim::LineUp",
    257 			"ctrl-shift-up": "editor::MoveLineUp",
    258 
    259 			"down": ["vim::Down", { "display_lines": true }],
    260 			"shift-down": "editor::AddSelectionBelow",
    261 			"ctrl-down": "vim::LineDown",
    262 			"ctrl-shift-down": "editor::MoveLineDown",
    263 
    264 			"left": "vim::Left",
    265 			"shift-left": null, // TODO
    266 			"ctrl-left": "vim::PreviousWordStart",
    267 			"ctrl-shift-left": "editor::SelectToPreviousWordStart",
    268 
    269 			"right": "vim::Right",
    270 			"shift-right": null, // TODO
    271 			"ctrl-right": "vim::NextWordStart",
    272 			"ctrl-shift-right": "editor::SelectToNextWordEnd",
    273 
    274 			"home": [
    275 				"editor::MoveToBeginningOfLine",
    276 				{ "stop_at_soft_wraps": true, "stop_at_indent": true },
    277 			],
    278 			"shift-home": null,
    279 			"ctrl-home": ["vim::StartOfLine", { "display_lines": false }],
    280 			"ctrl-shift-home": null,
    281 
    282 			"end": ["vim::EndOfLine", { "display_lines": true }],
    283 			"shift-end": null,
    284 			"ctrl-end": ["vim::EndOfLine", { "display_lines": false }],
    285 			"ctrl-shift-end": null,
    286 
    287 			"pageup": "vim::PageUp",
    288 			"shift-pageup": "vim::MoveToPrevious",
    289 			"ctrl-pageup": "vim::ScrollUp",
    290 			"ctrl-shift-pageup": "vim::StartOfDocument",
    291 
    292 			"pagedown": "vim::PageDown",
    293 			"shift-pagedown": "vim::MoveToNext",
    294 			"ctrl-pagedown": "vim::ScrollDown",
    295 			"ctrl-shift-pagedown": "vim::EndOfDocument",
    296 
    297 			"enter": "editor::NewlineBelow",
    298 			"shift-enter": "editor::NewlineAbove",
    299 			"ctrl-enter": null,
    300 			"ctrl-shift-enter": null,
    301 
    302 			"escape": "vim::SwitchToNormalMode",
    303 			"shift-escape": null,
    304 			"ctrl-escape": null,
    305 			"ctrl-shift-escape": null,
    306 
    307 			"insert": null,
    308 			"shift-insert": null,
    309 			"ctrl-insert": null,
    310 			"ctrl-shift-insert": null,
    311 
    312 			"delete": "vim::DeleteRight",
    313 			"shift-delete": null,
    314 			"ctrl-delete": null,
    315 			"ctrl-shift-delete": null,
    316 
    317 			"space": "vim::WrappingRight",
    318 			"shift-space": null,
    319 			"ctrl-space": null,
    320 			"shift-ctrl-space": null,
    321 
    322 			"backspace": "vim::WrappingLeft",
    323 			"shift-backspace": null,
    324 			"ctrl-backspace": null,
    325 			"shift-ctrl-backspace": null,
    326 
    327 			"tab": null,
    328 			"shift-tab": null,
    329 			"ctrl-tab": null,
    330 			"ctrl-shift-tab": null,
    331 
    332 			"0": ["vim::Number", 0],
    333 			")": null,
    334 			"ctrl-0": null,
    335 			"ctrl-)": null,
    336 
    337 			"1": ["vim::Number", 1],
    338 			"!": null,
    339 			"ctrl-1": null,
    340 			"ctrl-!": null,
    341 
    342 			"2": ["vim::Number", 2],
    343 			"@": "vim::PushReplayRegister",
    344 			"ctrl-2": null,
    345 			"ctrl-@": null,
    346 
    347 			"3": ["vim::Number", 3],
    348 			"#": null,
    349 			"ctrl-3": null,
    350 			"ctrl-#": null,
    351 
    352 			"4": ["vim::Number", 4],
    353 			"$": null,
    354 			"ctrl-4": null,
    355 			"ctrl-$": null,
    356 
    357 			"5": ["vim::Number", 5],
    358 			"%": null,
    359 			"ctrl-5": null,
    360 			"ctrl-%": null,
    361 
    362 			"6": ["vim::Number", 6],
    363 			"^": null,
    364 			"ctrl-6": null,
    365 			"ctrl-^": null,
    366 
    367 			"7": ["vim::Number", 7],
    368 			"&": null,
    369 			"ctrl-7": null,
    370 			"ctrl-&": null,
    371 
    372 			"8": ["vim::Number", 8],
    373 			"*": null,
    374 			"ctrl-8": null,
    375 			"ctrl-*": null,
    376 
    377 			"9": ["vim::Number", 9],
    378 			"(": null,
    379 			"ctrl-9": null,
    380 			"ctrl-(": null,
    381 
    382 			"a": ["vim::PushObject", { "around": true }],
    383 			"A": null,
    384 			"ctrl-a": null,
    385 			"ctrl-A": null,
    386 
    387 			"b": null,
    388 			"B": null,
    389 			"ctrl-b": null,
    390 			"ctrl-B": null,
    391 
    392 			"c": null,
    393 			"C": null,
    394 			"ctrl-c": null,
    395 			"ctrl-C": null,
    396 
    397 			"d": null,
    398 			"D": null,
    399 			"ctrl-d": null,
    400 			"ctrl-D": null,
    401 
    402 			"e": "vim::NextWordEnd",
    403 			"E": "vim::PreviousWordEnd",
    404 			"ctrl-e": "vim::NextSubwordEnd",
    405 			"ctrl-E": "vim::PreviousSubwordEnd",
    406 
    407 			"f": [
    408 				"vim::PushFindForward",
    409 				{ "before": false, "multiline": false },
    410 			],
    411 			"F": [
    412 				"vim::PushFindBackward",
    413 				{ "after": false, "multiline": false },
    414 			],
    415 			"ctrl-f": "vim::RepeatFind",
    416 			"ctrl-F": "vim::RepeatFindReversed",
    417 
    418 			"g": [
    419 				"vim::PushFindForward",
    420 				{ "before": true, "multiline": false },
    421 			],
    422 			"G": [
    423 				"vim::PushFindBackward",
    424 				{ "after": true, "multiline": false },
    425 			],
    426 			"ctrl-g": "vim::RepeatFind",
    427 			"ctrl-G": "vim::RepeatFindReversed",
    428 
    429 			"h": "editor::Hover",
    430 			"H": null,
    431 			"ctrl-h": null,
    432 			"ctrl-H": null,
    433 
    434 			"i": ["vim::PushObject", { "around": false }],
    435 			"I": null,
    436 			"ctrl-i": null,
    437 			"ctrl-I": null,
    438 
    439 			"j": "vim::JoinLines",
    440 			"J": "vim::JoinLinesNoWhitespace",
    441 			"ctrl-j": null,
    442 			"ctrl-J": null,
    443 
    444 			"k": null,
    445 			"K": null,
    446 			"ctrl-k": null,
    447 			"ctrl-K": null,
    448 
    449 			"l": null,
    450 			"L": null,
    451 			"ctrl-l": null,
    452 			"ctrl-L": null,
    453 
    454 			"m": null,
    455 			"M": null,
    456 			"ctrl-m": null,
    457 			"ctrl-M": null,
    458 
    459 			"n": "vim::MoveToNextMatch",
    460 			"N": "vim::MoveToPreviousMatch",
    461 			"ctrl-n": "workspace::NewWindow",
    462 			"ctrl-N": null,
    463 
    464 			"o": null,
    465 			"O": null,
    466 			"ctrl-o": null,
    467 			"ctrl-O": null,
    468 
    469 			"p": null,
    470 			"P": null,
    471 			"ctrl-p": null,
    472 			"ctrl-P": null,
    473 
    474 			"q": "vim::ToggleRecord",
    475 			"Q": "vim::ReplayLastRecording",
    476 			"ctrl-q": null,
    477 			"ctrl-Q": null,
    478 
    479 			"r": null,
    480 			"R": null,
    481 			"ctrl-r": null,
    482 			"ctrl-R": null,
    483 
    484 			"s": null,
    485 			"S": null,
    486 			"ctrl-s": null,
    487 			"ctrl-S": null,
    488 
    489 			"t": null,
    490 			"T": null,
    491 			"ctrl-t": "workspace::NewFile",
    492 			"ctrl-T": "pane::ReopenClosedItem",
    493 
    494 			"u": null,
    495 			"U": null,
    496 			"ctrl-u": null,
    497 			"ctrl-U": null,
    498 
    499 			"v": "vim::ToggleVisual",
    500 			"V": "vim::ToggleVisualLine",
    501 			"ctrl-v": "vim::RestoreVisualSelection",
    502 			"ctrl-V": null,
    503 
    504 			"w": "vim::NextWordStart",
    505 			"W": "vim::PreviousWordStart",
    506 			"ctrl-w": "vim::NextSubwordStart",
    507 			"ctrl-W": "vim::PreviousSubwordStart",
    508 
    509 			"x": null,
    510 			"X": null,
    511 			"ctrl-x": null,
    512 			"ctrl-X": null,
    513 
    514 			"y": null,
    515 			"Y": null,
    516 			"ctrl-y": null,
    517 			"ctrl-Y": null,
    518 
    519 			"z": null,
    520 			"Z": null,
    521 			"ctrl-z": null,
    522 			"ctrl-Z": null,
    523 
    524 			"-": null,
    525 			"_": null,
    526 			"ctrl--": null,
    527 			"ctrl-_": null,
    528 
    529 			"=": null,
    530 			"+": null,
    531 			"ctrl-=": null,
    532 			"ctrl-+": null,
    533 
    534 			"[": "editor::SelectLargerSyntaxNode",
    535 			"{": null,
    536 			"ctrl-[": null,
    537 			"ctrl-{": null,
    538 
    539 			"]": "editor::SelectSmallerSyntaxNode",
    540 			"}": null,
    541 			"ctrl-]": null,
    542 			"ctrl-}": null,
    543 
    544 			"\\": "vim::ToggleComments",
    545 			"|": "vim::GoToColumn",
    546 			"ctrl-\\": null,
    547 			"ctrl-|": null,
    548 
    549 			";": null,
    550 			":": null,
    551 			"ctrl-;": null,
    552 			"ctrl-:": null,
    553 
    554 			"'": null,
    555 			"\"": null,
    556 			"ctrl-'": null,
    557 			"ctrl-\"": null,
    558 
    559 			",": null,
    560 			"<": null,
    561 			"ctrl-,": null,
    562 			"ctrl-<": "vim::Outdent", // For workspace::SendKeystrokes
    563 
    564 			".": null,
    565 			">": null,
    566 			"ctrl-.": null,
    567 			"ctrl->": "vim::Indent", // For workspace::SendKeystrokes
    568 
    569 			"/": "vim::Search",
    570 			"?": "outline::Toggle",
    571 			"ctrl-/": null,
    572 			"ctrl-?": "project_symbols::Toggle",
    573 
    574 			"`": null,
    575 			"~": null,
    576 			"ctrl-`": null,
    577 			"ctrl-~": null,
    578 
    579 			//"ctrl-pageup": ["editor::SelectPrevious", { "replace_newest": false }],
    580 			//"ctrl-pagedown": ["editor::SelectNext", { "replace_newest": false }],
    581 			//"ctrl-shift-pageup": ["editor::SelectPrevious", { "replace_newest": true }],
    582 			//"ctrl-shift-pagedown": ["editor::SelectNext", { "replace_newest": true }],
    583 
    584 			// "": "vim::PushLowercase",
    585 			// "": "vim::PushUppercase",
    586 			// "": "vim::PushOppositeCase",
    587 			// "": "vim::ConvertToLowerCase",
    588 			// "": "vim::ConvertToUpperCase",
    589 			// "": "vim::ChangeCase",
    590 			// "": "vim::Enter",
    591 			// "": "vim::Quotes",
    592 			// "": "vim::Literal",
    593 			// "": "vim::Argument",
    594 			// "": "vim::Exchange",
    595 			// "": "vim::Increment",
    596 			// "": "vim::Decrement",
    597 			// "": "vim::Substitute",
    598 			// "": "editor::SelectAllMatches",
    599 			// TODO: replace mode
    600 		},
    601 	},
    602 
    603 	{
    604 		"context": "vim_mode == normal",
    605 		"bindings": {
    606 			// TODO: organize
    607 			":": "command_palette::Toggle",
    608 			".": "vim::Repeat",
    609 			"escape": "editor::Cancel",
    610 			"+": "vim::Increment",
    611 			"-": "vim::Decrement",
    612 
    613 			"tab": "vim::Indent",
    614 			"shift-tab": "vim::Outdent",
    615 			"ctrl-tab": null,
    616 			"ctrl-shift-tab": null,
    617 
    618 			"a": "vim::InsertAfter",
    619 			"A": "vim::InsertEndOfLine",
    620 			"ctrl-a": null,
    621 			"ctrl-A": null,
    622 
    623 			"c": "vim::PushChange",
    624 			"C": "vim::ChangeToEndOfLine",
    625 			"ctrl-c": null,
    626 			"ctrl-C": null,
    627 
    628 			"d": "vim::PushDelete",
    629 			"D": "vim::DeleteToEndOfLine",
    630 			"ctrl-d": null,
    631 			"ctrl-D": null,
    632 
    633 			"i": "vim::InsertBefore",
    634 			"I": "vim::InsertFirstNonWhitespace",
    635 			"ctrl-i": null,
    636 			"ctrl-I": null,
    637 
    638 			"o": "vim::InsertLineBelow",
    639 			"O": "vim::InsertLineAbove",
    640 			"ctrl-o": null,
    641 			"ctrl-O": null,
    642 
    643 			"p": [
    644 				"vim::Paste",
    645 				{ "preserve_clipboard": true, "before": false },
    646 			],
    647 			"P": ["vim::Paste", { "preserve_clipboard": true, "before": true }],
    648 			"ctrl-p": null,
    649 			"ctrl-P": null,
    650 
    651 			"r": null,
    652 			"R": null,
    653 			"ctrl-r": "vim::Redo",
    654 			"ctrl-R": null,
    655 
    656 			"s": "vim::Substitute",
    657 			"S": "vim::SubstituteLine",
    658 			"ctrl-s": null,
    659 			"ctrl-S": null,
    660 
    661 			"u": "vim::Undo",
    662 			"U": "vim::Redo",
    663 			"ctrl-u": null,
    664 			"ctrl-U": null,
    665 
    666 			"x": "vim::DeleteRight",
    667 			"X": "editor::DeleteLine",
    668 			"ctrl-x": null,
    669 			"ctrl-X": null,
    670 
    671 			"y": "vim::PushYank",
    672 			"Y": "vim::YankLine",
    673 			"ctrl-y": null,
    674 			"ctrl-Y": null,
    675 		},
    676 	},
    677 
    678 	{
    679 		"context": "vim_mode == visual",
    680 		"bindings": {
    681 			// TODO: organize
    682 			":": "vim::VisualCommand",
    683 			"escape": "vim::SwitchToNormalMode",
    684 			"+": "vim::Increment",
    685 			"-": "vim::Decrement",
    686 
    687 			"home": [
    688 				"editor::SelectToBeginningOfLine",
    689 				{ "stop_at_soft_wraps": true, "stop_at_indent": true },
    690 			],
    691 
    692 			"delete": "vim::VisualDelete",
    693 			"shift-delete": null,
    694 			"ctrl-delete": null,
    695 			"ctrl-shift-delete": null,
    696 
    697 			"tab": ["workspace::SendKeystrokes", "ctrl-> ctrl-v"],
    698 			"shift-tab": ["workspace::SendKeystrokes", "ctrl-< ctrl-v"],
    699 			"ctrl-tab": null,
    700 			"ctrl-shift-tab": null,
    701 
    702 			"c": "vim::Substitute",
    703 			"C": "vim::SubstituteLine",
    704 			"ctrl-c": null,
    705 			"ctrl-C": null,
    706 
    707 			"d": "vim::VisualDelete",
    708 			"D": "vim::VisualDeleteLine",
    709 			"ctrl-d": null,
    710 			"ctrl-D": null,
    711 
    712 			"p": ["vim::Paste", { "preserve_clipboard": true }],
    713 			"P": ["vim::Paste", { "preserve_clipboard": true }],
    714 			"ctrl-p": null,
    715 			"ctrl-P": null,
    716 
    717 			"s": "vim::Substitute",
    718 			"S": "vim::SubstituteLine",
    719 			"ctrl-s": null,
    720 			"ctrl-S": null,
    721 
    722 			"x": "vim::VisualDelete",
    723 			"X": "vim::VisualDeleteLine",
    724 			"ctrl-x": null,
    725 			"ctrl-X": null,
    726 
    727 			"y": "vim::VisualYank",
    728 			"Y": "vim::VisualYankLine",
    729 			"ctrl-y": null,
    730 			"ctrl-Y": null,
    731 		},
    732 	},
    733 
    734 	{
    735 		"context": "vim_mode == insert",
    736 		"bindings": {
    737 			"escape": "vim::NormalBefore",
    738 			"ctrl-c": "editor::Paste",
    739 			"ctrl-space": "editor::ShowCompletions",
    740 		},
    741 	},
    742 
    743 	// Make escape leave insert mode even if completions are showing.
    744 	{
    745 		"context": "Editor && vim_mode == insert && showing_completions",
    746 		"bindings": {
    747 			"escape": "vim::NormalBefore",
    748 		},
    749 	},
    750 
    751 	{
    752 		"context": "vim_mode == waiting",
    753 		"bindings": {
    754 			"escape": "vim::ClearOperators",
    755 		},
    756 	},
    757 
    758 	{
    759 		"context": "vim_mode == operator",
    760 		"bindings": {
    761 			"escape": "vim::ClearOperators",
    762 		},
    763 	},
    764 
    765 	{
    766 		"context": "vim_operator == a || vim_operator == i",
    767 		"bindings": {
    768 			"w": "vim::Word",
    769 			"'": "vim::Quotes",
    770 			"\"": "vim::DoubleQuotes",
    771 			"`": "vim::BackQuotes",
    772 
    773 			"(": "vim::Parentheses",
    774 			")": "vim::Parentheses",
    775 
    776 			"[": "vim::SquareBrackets",
    777 			"]": "vim::SquareBrackets",
    778 
    779 			"{": "vim::CurlyBrackets",
    780 			"}": "vim::CurlyBrackets",
    781 
    782 			"<": "vim::AngleBrackets",
    783 			">": "vim::AngleBrackets",
    784 		},
    785 	},
    786 
    787 	{
    788 		"context": "vim_operator == c",
    789 		"bindings": {
    790 			"c": "vim::CurrentLine",
    791 		},
    792 	},
    793 
    794 	{
    795 		"context": "vim_operator == d",
    796 		"bindings": {
    797 			"d": "vim::CurrentLine",
    798 		},
    799 	},
    800 
    801 	{
    802 		"context": "vim_operator == y",
    803 		"bindings": {
    804 			"y": "vim::CurrentLine",
    805 		},
    806 	},
    807 
    808 	{
    809 		"context": "BufferSearchBar",
    810 		"bindings": {
    811 			"enter": "vim::SearchSubmit",
    812 			"escape": "buffer_search::Dismiss",
    813 		},
    814 	},
    815 
    816 	//"": "vim::Word",
    817 	//"": "vim::Subword",
    818 	//"": "vim::OtherEnd",
    819 	//"": "vim::StartOfLine",
    820 	//"": "vim::EndOfLine",
    821 	//"": "vim::CurrentLine",
    822 	//"": "vim::Quotes",
    823 	//"": "vim::DoubleQuotes",
    824 	//"": "vim::BackQuotes",
    825 	//"": "vim::AnyQuotes",
    826 	//"": "vim::Parentheses",
    827 	//"": "vim::SquareBrackets",
    828 	//"": "vim::CurlyBrackets",
    829 	//"": "vim::AngleBrackets",
    830 	// TODO: Establish "logical" editing language. E.g., instead of `D` to delete
    831 	// to end of line (which is a sort of special case of `d`), use `d l` instead,
    832 	// where `l` is the EndOfLine object (as below).
    833 
    834 	{
    835 		"context": "Terminal",
    836 		"bindings": {
    837 			"ctrl-shift-c": "terminal::Copy",
    838 			"ctrl-shift-v": "terminal::Paste",
    839 
    840 			"ctrl-shift-up": "terminal::ScrollLineUp",
    841 			"ctrl-shift-down": "terminal::ScrollLineDown",
    842 
    843 			"ctrl-shift-pageup": "terminal::ScrollPageUp",
    844 			"ctrl-shift-pagedown": "terminal::ScrollPageDown",
    845 
    846 			"ctrl-shift-home": "terminal::ScrollToTop",
    847 			"ctrl-shift-end": "terminal::ScrollToBottom",
    848 		},
    849 	},
    850 ]