1[
2 {
3 "context": "VimControl && !menu",
4 "bindings": {
5 "i": [
6 "vim::PushObject",
7 {
8 "around": false
9 }
10 ],
11 "a": [
12 "vim::PushObject",
13 {
14 "around": true
15 }
16 ],
17 "left": "vim::Left",
18 "h": "vim::Left",
19 "backspace": "vim::Backspace",
20 "down": "vim::Down",
21 "ctrl-j": "vim::Down",
22 "j": "vim::Down",
23 "ctrl-m": "vim::NextLineStart",
24 "+": "vim::NextLineStart",
25 "enter": "vim::NextLineStart",
26 "-": "vim::PreviousLineStart",
27 "shift-tab": "vim::Tab",
28 "tab": "vim::Tab",
29 "up": "vim::Up",
30 "k": "vim::Up",
31 "right": "vim::Right",
32 "l": "vim::Right",
33 "space": "vim::Space",
34 "end": "vim::EndOfLine",
35 "$": "vim::EndOfLine",
36 "^": "vim::FirstNonWhitespace",
37 "_": "vim::StartOfLineDownward",
38 "g _": "vim::EndOfLineDownward",
39 "shift-g": "vim::EndOfDocument",
40 "{": "vim::StartOfParagraph",
41 "}": "vim::EndOfParagraph",
42 "(": "vim::SentenceBackward",
43 ")": "vim::SentenceForward",
44 "|": "vim::GoToColumn",
45 "] ]": "vim::NextSectionStart",
46 "] [": "vim::NextSectionEnd",
47 "[ [": "vim::PreviousSectionStart",
48 "[ ]": "vim::PreviousSectionEnd",
49 "] m": "vim::NextMethodStart",
50 "] shift-m": "vim::NextMethodEnd",
51 "[ m": "vim::PreviousMethodStart",
52 "[ shift-m": "vim::PreviousMethodEnd",
53 "[ *": "vim::PreviousComment",
54 "[ /": "vim::PreviousComment",
55 "] *": "vim::NextComment",
56 "] /": "vim::NextComment",
57 // Word motions
58 "w": "vim::NextWordStart",
59 "e": "vim::NextWordEnd",
60 "b": "vim::PreviousWordStart",
61 "g e": "vim::PreviousWordEnd",
62 // Subword motions
63 // "w": "vim::NextSubwordStart",
64 // "b": "vim::PreviousSubwordStart",
65 // "e": "vim::NextSubwordEnd",
66 // "g e": "vim::PreviousSubwordEnd",
67 "shift-w": [
68 "vim::NextWordStart",
69 {
70 "ignore_punctuation": true
71 }
72 ],
73 "shift-e": [
74 "vim::NextWordEnd",
75 {
76 "ignore_punctuation": true
77 }
78 ],
79 "shift-b": [
80 "vim::PreviousWordStart",
81 {
82 "ignore_punctuation": true
83 }
84 ],
85 "g shift-e": [
86 "vim::PreviousWordEnd",
87 {
88 "ignore_punctuation": true
89 }
90 ],
91 "/": "vim::Search",
92 "g /": "pane::DeploySearch",
93 "?": [
94 "vim::Search",
95 {
96 "backwards": true
97 }
98 ],
99 "*": "vim::MoveToNext",
100 "#": "vim::MoveToPrevious",
101 "n": "vim::MoveToNextMatch",
102 "shift-n": "vim::MoveToPreviousMatch",
103 "%": "vim::Matching",
104 "] }": [
105 "vim::UnmatchedForward",
106 {
107 "char": "}"
108 }
109 ],
110 "[ {": [
111 "vim::UnmatchedBackward",
112 {
113 "char": "{"
114 }
115 ],
116 "] )": [
117 "vim::UnmatchedForward",
118 {
119 "char": ")"
120 }
121 ],
122 "[ (": [
123 "vim::UnmatchedBackward",
124 {
125 "char": "("
126 }
127 ],
128 "f": [
129 "vim::PushFindForward",
130 {
131 "before": false
132 }
133 ],
134 "t": [
135 "vim::PushFindForward",
136 {
137 "before": true
138 }
139 ],
140 "shift-f": [
141 "vim::PushFindBackward",
142 {
143 "after": false
144 }
145 ],
146 "shift-t": [
147 "vim::PushFindBackward",
148 {
149 "after": true
150 }
151 ],
152 "m": "vim::PushMark",
153 "'": [
154 "vim::PushJump",
155 {
156 "line": true
157 }
158 ],
159 "`": [
160 "vim::PushJump",
161 {
162 "line": false
163 }
164 ],
165 ";": "vim::RepeatFind",
166 ",": "vim::RepeatFindReversed",
167 "ctrl-o": "pane::GoBack",
168 "ctrl-i": "pane::GoForward",
169 "ctrl-]": "editor::GoToDefinition",
170 "escape": "vim::SwitchToNormalMode",
171 "ctrl-[": "vim::SwitchToNormalMode",
172 "v": "vim::ToggleVisual",
173 "shift-v": "vim::ToggleVisualLine",
174 "ctrl-g": "vim::ShowLocation",
175 "ctrl-v": "vim::ToggleVisualBlock",
176 "ctrl-q": "vim::ToggleVisualBlock",
177 "shift-k": "editor::Hover",
178 "shift-r": "vim::ToggleReplace",
179 "0": "vim::StartOfLine",
180 "home": "vim::StartOfLine",
181 "ctrl-f": "vim::PageDown",
182 "pagedown": "vim::PageDown",
183 "ctrl-b": "vim::PageUp",
184 "pageup": "vim::PageUp",
185 "ctrl-d": "vim::ScrollDown",
186 "ctrl-u": "vim::ScrollUp",
187 "ctrl-e": "vim::LineDown",
188 "ctrl-y": "vim::LineUp",
189 // "g" commands
190 "g r": "vim::PushReplaceWithRegister",
191 "g g": "vim::StartOfDocument",
192 "g h": "editor::Hover",
193 "g t": "pane::ActivateNextItem",
194 "g shift-t": "pane::ActivatePreviousItem",
195 "g d": "editor::GoToDefinition",
196 "g shift-d": "editor::GoToDeclaration",
197 "g y": "editor::GoToTypeDefinition",
198 "g shift-i": "editor::GoToImplementation",
199 "g x": "editor::OpenUrl",
200 "g f": "editor::OpenSelectedFilename",
201 "g n": "vim::SelectNextMatch",
202 "g shift-n": "vim::SelectPreviousMatch",
203 "g l": "vim::SelectNext",
204 "g shift-l": "vim::SelectPrevious",
205 "g >": [
206 "editor::SelectNext",
207 {
208 "replace_newest": true
209 }
210 ],
211 "g <": [
212 "editor::SelectPrevious",
213 {
214 "replace_newest": true
215 }
216 ],
217 "g a": "editor::SelectAllMatches",
218 "g s": "outline::Toggle",
219 "g shift-s": "project_symbols::Toggle",
220 "g .": "editor::ToggleCodeActions", // zed specific
221 "g shift-a": "editor::FindAllReferences", // zed specific
222 "g space": "editor::OpenExcerpts", // zed specific
223 "g *": [
224 "vim::MoveToNext",
225 {
226 "partial_word": true
227 }
228 ],
229 "g #": [
230 "vim::MoveToPrevious",
231 {
232 "partial_word": true
233 }
234 ],
235 "g j": [
236 "vim::Down",
237 {
238 "display_lines": true
239 }
240 ],
241 "g down": [
242 "vim::Down",
243 {
244 "display_lines": true
245 }
246 ],
247 "g k": [
248 "vim::Up",
249 {
250 "display_lines": true
251 }
252 ],
253 "g up": [
254 "vim::Up",
255 {
256 "display_lines": true
257 }
258 ],
259 "g $": [
260 "vim::EndOfLine",
261 {
262 "display_lines": true
263 }
264 ],
265 "g end": [
266 "vim::EndOfLine",
267 {
268 "display_lines": true
269 }
270 ],
271 "g 0": [
272 "vim::StartOfLine",
273 {
274 "display_lines": true
275 }
276 ],
277 "g home": [
278 "vim::StartOfLine",
279 {
280 "display_lines": true
281 }
282 ],
283 "g ^": [
284 "vim::FirstNonWhitespace",
285 {
286 "display_lines": true
287 }
288 ],
289 "g v": "vim::RestoreVisualSelection",
290 "g ]": "editor::GoToDiagnostic",
291 "g [": "editor::GoToPreviousDiagnostic",
292 "g i": "vim::InsertAtPrevious",
293 "g ,": "vim::ChangeListNewer",
294 "g ;": "vim::ChangeListOlder",
295 "shift-h": "vim::WindowTop",
296 "shift-m": "vim::WindowMiddle",
297 "shift-l": "vim::WindowBottom",
298 "q": "vim::ToggleRecord",
299 "shift-q": "vim::ReplayLastRecording",
300 "@": "vim::PushReplayRegister",
301 // z commands
302 "z enter": [
303 "workspace::SendKeystrokes",
304 "z t ^"
305 ],
306 "z -": [
307 "workspace::SendKeystrokes",
308 "z b ^"
309 ],
310 "z ^": [
311 "workspace::SendKeystrokes",
312 "shift-h k z b ^"
313 ],
314 "z +": [
315 "workspace::SendKeystrokes",
316 "shift-l j z t ^"
317 ],
318 "z t": "editor::ScrollCursorTop",
319 "z z": "editor::ScrollCursorCenter",
320 "z .": [
321 "workspace::SendKeystrokes",
322 "z z ^"
323 ],
324 "z b": "editor::ScrollCursorBottom",
325 "z a": "editor::ToggleFold",
326 "z shift-a": "editor::ToggleFoldRecursive",
327 "z c": "editor::Fold",
328 "z shift-c": "editor::FoldRecursive",
329 "z o": "editor::UnfoldLines",
330 "z shift-o": "editor::UnfoldRecursive",
331 "z f": "editor::FoldSelectedRanges",
332 "z shift-m": "editor::FoldAll",
333 "z shift-r": "editor::UnfoldAll",
334 "shift-z shift-q": [
335 "pane::CloseActiveItem",
336 {
337 "save_intent": "skip"
338 }
339 ],
340 "shift-z shift-z": [
341 "pane::CloseActiveItem",
342 {
343 "save_intent": "save_all"
344 }
345 ],
346 // Count support
347 "1": [
348 "vim::Number",
349 1
350 ],
351 "2": [
352 "vim::Number",
353 2
354 ],
355 "3": [
356 "vim::Number",
357 3
358 ],
359 "4": [
360 "vim::Number",
361 4
362 ],
363 "5": [
364 "vim::Number",
365 5
366 ],
367 "6": [
368 "vim::Number",
369 6
370 ],
371 "7": [
372 "vim::Number",
373 7
374 ],
375 "8": [
376 "vim::Number",
377 8
378 ],
379 "9": [
380 "vim::Number",
381 9
382 ],
383 "ctrl-w d": "editor::GoToDefinitionSplit",
384 "ctrl-w g d": "editor::GoToDefinitionSplit",
385 "ctrl-w shift-d": "editor::GoToTypeDefinitionSplit",
386 "ctrl-w g shift-d": "editor::GoToTypeDefinitionSplit",
387 "ctrl-w space": "editor::OpenExcerptsSplit",
388 "ctrl-w g space": "editor::OpenExcerptsSplit",
389 "ctrl-6": "pane::AlternateFile"
390 }
391 },
392 {
393 "context": "vim_mode == normal",
394 "bindings": {
395 "ctrl-[": "editor::Cancel",
396 "escape": "editor::Cancel",
397 ":": "command_palette::Toggle",
398 ".": "vim::Repeat",
399 "c": "vim::PushChange",
400 "shift-c": "vim::ChangeToEndOfLine",
401 "d": "vim::PushDelete",
402 "shift-d": "vim::DeleteToEndOfLine",
403 "shift-j": "vim::JoinLines",
404 "g shift-j": "vim::JoinLinesNoWhitespace",
405 "y": "vim::PushYank",
406 "shift-y": "vim::YankLine",
407 "i": "vim::InsertBefore",
408 "shift-i": "vim::InsertFirstNonWhitespace",
409 "a": "vim::InsertAfter",
410 "shift-a": "vim::InsertEndOfLine",
411 "x": "vim::DeleteRight",
412 "shift-x": "vim::DeleteLeft",
413 "o": "vim::InsertLineBelow",
414 "shift-o": "vim::InsertLineAbove",
415 "~": "vim::ChangeCase",
416 "ctrl-a": "vim::Increment",
417 "ctrl-x": "vim::Decrement",
418 "p": "vim::Paste",
419 "shift-p": [
420 "vim::Paste",
421 {
422 "before": true
423 }
424 ],
425 "u": "vim::Undo",
426 "ctrl-r": "vim::Redo",
427 "r": "vim::PushReplace",
428 "s": "vim::Substitute",
429 "shift-s": "vim::SubstituteLine",
430 ">": "vim::PushIndent",
431 "<": "vim::PushOutdent",
432 "=": "vim::PushAutoIndent",
433 "!": "vim::PushShellCommand",
434 "g u": "vim::PushLowercase",
435 "g shift-u": "vim::PushUppercase",
436 "g ~": "vim::PushOppositeCase",
437 "\"": "vim::PushRegister",
438 "g w": "vim::PushRewrap",
439 "g q": "vim::PushRewrap",
440 "ctrl-pagedown": "pane::ActivateNextItem",
441 "ctrl-pageup": "pane::ActivatePreviousItem",
442 "insert": "vim::InsertBefore",
443 // tree-sitter related commands
444 "[ x": "vim::SelectLargerSyntaxNode",
445 "] x": "vim::SelectSmallerSyntaxNode",
446 "] d": "editor::GoToDiagnostic",
447 "[ d": "editor::GoToPreviousDiagnostic",
448 "] c": "editor::GoToHunk",
449 "[ c": "editor::GoToPreviousHunk",
450 "g c": "vim::PushToggleComments"
451 }
452 },
453 {
454 "context": "VimControl && VimCount",
455 "bindings": {
456 "0": [
457 "vim::Number",
458 0
459 ],
460 ":": "vim::CountCommand"
461 }
462 },
463 {
464 "context": "vim_mode == visual",
465 "bindings": {
466 ":": "vim::VisualCommand",
467 "u": "vim::ConvertToLowerCase",
468 "shift-u": "vim::ConvertToUpperCase",
469 "shift-o": "vim::OtherEnd",
470 "o": "vim::OtherEnd",
471 "d": "vim::VisualDelete",
472 "x": "vim::VisualDelete",
473 "shift-d": "vim::VisualDeleteLine",
474 "shift-x": "vim::VisualDeleteLine",
475 "y": "vim::VisualYank",
476 "shift-y": "vim::VisualYankLine",
477 "p": "vim::Paste",
478 "shift-p": [
479 "vim::Paste",
480 {
481 "preserve_clipboard": true
482 }
483 ],
484 "c": "vim::Substitute",
485 "s": "vim::Substitute",
486 "shift-r": "vim::SubstituteLine",
487 "shift-s": "vim::SubstituteLine",
488 "~": "vim::ChangeCase",
489 "*": [
490 "vim::MoveToNext",
491 {
492 "partial_word": true
493 }
494 ],
495 "#": [
496 "vim::MoveToPrevious",
497 {
498 "partial_word": true
499 }
500 ],
501 "ctrl-a": "vim::Increment",
502 "ctrl-x": "vim::Decrement",
503 "g ctrl-a": [
504 "vim::Increment",
505 {
506 "step": true
507 }
508 ],
509 "g ctrl-x": [
510 "vim::Decrement",
511 {
512 "step": true
513 }
514 ],
515 "shift-i": "vim::InsertBefore",
516 "shift-a": "vim::InsertAfter",
517 "g shift-i": "vim::VisualInsertFirstNonWhiteSpace",
518 "g shift-a": "vim::VisualInsertEndOfLine",
519 "shift-j": "vim::JoinLines",
520 "g shift-j": "vim::JoinLinesNoWhitespace",
521 "r": "vim::PushReplace",
522 "ctrl-c": "vim::SwitchToNormalMode",
523 "ctrl-[": "vim::SwitchToNormalMode",
524 "escape": "vim::SwitchToNormalMode",
525 ">": "vim::Indent",
526 "<": "vim::Outdent",
527 "=": "vim::AutoIndent",
528 "!": "vim::ShellCommand",
529 "i": [
530 "vim::PushObject",
531 {
532 "around": false
533 }
534 ],
535 "a": [
536 "vim::PushObject",
537 {
538 "around": true
539 }
540 ],
541 "g r": [
542 "vim::Paste",
543 {
544 "preserve_clipboard": true
545 }
546 ],
547 "g c": "vim::ToggleComments",
548 "g q": "vim::Rewrap",
549 "\"": "vim::PushRegister",
550 // tree-sitter related commands
551 "[ x": "editor::SelectLargerSyntaxNode",
552 "] x": "editor::SelectSmallerSyntaxNode"
553 }
554 },
555 {
556 "context": "vim_mode == insert",
557 "bindings": {
558 "ctrl-c": "vim::NormalBefore",
559 "ctrl-[": "vim::NormalBefore",
560 "escape": "vim::NormalBefore",
561 "ctrl-x": null,
562 "ctrl-x ctrl-o": "editor::ShowCompletions",
563 "ctrl-x ctrl-a": "assistant::InlineAssist", // zed specific
564 "ctrl-x ctrl-c": "editor::ShowEditPrediction", // zed specific
565 "ctrl-x ctrl-l": "editor::ToggleCodeActions", // zed specific
566 "ctrl-x ctrl-z": "editor::Cancel",
567 "ctrl-w": "editor::DeleteToPreviousWordStart",
568 "ctrl-u": "editor::DeleteToBeginningOfLine",
569 "ctrl-t": "vim::Indent",
570 "ctrl-d": "vim::Outdent",
571 "ctrl-k": [
572 "vim::PushDigraph",
573 {}
574 ],
575 "ctrl-v": [
576 "vim::PushLiteral",
577 {}
578 ],
579 "ctrl-shift-v": "editor::Paste", // note: this is *very* similar to ctrl-v in vim, but ctrl-shift-v on linux is the typical shortcut for paste when ctrl-v is already in use.
580 "ctrl-q": [
581 "vim::PushLiteral",
582 {}
583 ],
584 "ctrl-shift-q": [
585 "vim::PushLiteral",
586 {}
587 ],
588 "ctrl-r": "vim::PushRegister",
589 "insert": "vim::ToggleReplace",
590 "ctrl-o": "vim::TemporaryNormal"
591 }
592 },
593 {
594 "context": "vim_mode == helix_normal",
595 "bindings": {
596 "i": "vim::InsertBefore",
597 "a": "vim::InsertAfter",
598 "d": "vim::HelixDelete",
599 "w": "vim::NextWordStart",
600 "e": "vim::NextWordEnd",
601 "b": "vim::PreviousWordStart",
602 "h": "vim::Left",
603 "j": "vim::Down",
604 "k": "vim::Up",
605 "l": "vim::Right"
606 }
607 },
608 {
609 "context": "vim_mode == insert && !(showing_code_actions || showing_completions)",
610 "bindings": {
611 "ctrl-p": "editor::ShowCompletions",
612 "ctrl-n": "editor::ShowCompletions"
613 }
614 },
615 {
616 "context": "vim_mode == replace",
617 "bindings": {
618 "ctrl-c": "vim::NormalBefore",
619 "ctrl-[": "vim::NormalBefore",
620 "escape": "vim::NormalBefore",
621 "ctrl-k": [
622 "vim::PushDigraph",
623 {}
624 ],
625 "ctrl-v": [
626 "vim::PushLiteral",
627 {}
628 ],
629 "ctrl-shift-v": "editor::Paste", // note: this is *very* similar to ctrl-v in vim, but ctrl-shift-v on linux is the typical shortcut for paste when ctrl-v is already in use.
630 "ctrl-q": [
631 "vim::PushLiteral",
632 {}
633 ],
634 "ctrl-shift-q": [
635 "vim::PushLiteral",
636 {}
637 ],
638 "backspace": "vim::UndoReplace",
639 "tab": "vim::Tab",
640 "enter": "vim::Enter",
641 "insert": "vim::InsertBefore"
642 }
643 },
644 {
645 "context": "vim_mode == waiting",
646 "bindings": {
647 "tab": "vim::Tab",
648 "enter": "vim::Enter",
649 "ctrl-c": "vim::ClearOperators",
650 "ctrl-[": "vim::ClearOperators",
651 "escape": "vim::ClearOperators",
652 "ctrl-k": [
653 "vim::PushDigraph",
654 {}
655 ],
656 "ctrl-v": [
657 "vim::PushLiteral",
658 {}
659 ],
660 "ctrl-q": [
661 "vim::PushLiteral",
662 {}
663 ]
664 }
665 },
666 {
667 "context": "Editor && vim_mode == waiting && (vim_operator == ys || vim_operator == cs)",
668 "bindings": {
669 "escape": "vim::SwitchToNormalMode"
670 }
671 },
672 {
673 "context": "vim_mode == operator",
674 "bindings": {
675 "ctrl-c": "vim::ClearOperators",
676 "ctrl-[": "vim::ClearOperators",
677 "escape": "vim::ClearOperators",
678 "g c": "vim::Comment"
679 }
680 },
681 {
682 "context": "vim_operator == a || vim_operator == i || vim_operator == cs",
683 "bindings": {
684 "w": "vim::Word",
685 "shift-w": [
686 "vim::Word",
687 {
688 "ignore_punctuation": true
689 }
690 ],
691 // Subword TextObject
692 // "w": "vim::Subword",
693 // "shift-w": ["vim::Subword", { "ignore_punctuation": true }],
694 "t": "vim::Tag",
695 "s": "vim::Sentence",
696 "p": "vim::Paragraph",
697 "'": "vim::Quotes",
698 "`": "vim::BackQuotes",
699 "\"": "vim::DoubleQuotes",
700 "q": "vim::AnyQuotes",
701 "|": "vim::VerticalBars",
702 "(": "vim::Parentheses",
703 ")": "vim::Parentheses",
704 "b": "vim::Parentheses",
705 // "b": "vim::AnyBrackets",
706 "[": "vim::SquareBrackets",
707 "]": "vim::SquareBrackets",
708 "r": "vim::SquareBrackets",
709 "{": "vim::CurlyBrackets",
710 "}": "vim::CurlyBrackets",
711 "shift-b": "vim::CurlyBrackets",
712 "<": "vim::AngleBrackets",
713 ">": "vim::AngleBrackets",
714 "a": "vim::Argument",
715 "i": "vim::IndentObj",
716 "shift-i": [
717 "vim::IndentObj",
718 {
719 "include_below": true
720 }
721 ],
722 "f": "vim::Method",
723 "c": "vim::Class",
724 "e": "vim::EntireFile"
725 }
726 },
727 {
728 "context": "vim_operator == c",
729 "bindings": {
730 "c": "vim::CurrentLine",
731 "x": "vim::Exchange",
732 "d": "editor::Rename", // zed specific
733 "s": [
734 "vim::PushChangeSurrounds",
735 {}
736 ]
737 }
738 },
739 {
740 "context": "vim_operator == d",
741 "bindings": {
742 "d": "vim::CurrentLine",
743 "s": "vim::PushDeleteSurrounds",
744 "o": "editor::ToggleSelectedDiffHunks", // "d o"
745 "p": "git::Restore" // "d p"
746 }
747 },
748 {
749 "context": "vim_operator == gu",
750 "bindings": {
751 "g u": "vim::CurrentLine",
752 "u": "vim::CurrentLine"
753 }
754 },
755 {
756 "context": "vim_operator == gU",
757 "bindings": {
758 "g shift-u": "vim::CurrentLine",
759 "shift-u": "vim::CurrentLine"
760 }
761 },
762 {
763 "context": "vim_operator == g~",
764 "bindings": {
765 "g ~": "vim::CurrentLine",
766 "~": "vim::CurrentLine"
767 }
768 },
769 {
770 "context": "vim_operator == gq",
771 "bindings": {
772 "g q": "vim::CurrentLine",
773 "q": "vim::CurrentLine",
774 "g w": "vim::CurrentLine",
775 "w": "vim::CurrentLine"
776 }
777 },
778 {
779 "context": "vim_operator == y",
780 "bindings": {
781 "y": "vim::CurrentLine",
782 "s": [
783 "vim::PushAddSurrounds",
784 {}
785 ]
786 }
787 },
788 {
789 "context": "vim_operator == ys",
790 "bindings": {
791 "s": "vim::CurrentLine"
792 }
793 },
794 {
795 "context": "vim_operator == >",
796 "bindings": {
797 ">": "vim::CurrentLine"
798 }
799 },
800 {
801 "context": "vim_operator == <",
802 "bindings": {
803 "<": "vim::CurrentLine"
804 }
805 },
806 {
807 "context": "vim_operator == eq",
808 "bindings": {
809 "=": "vim::CurrentLine"
810 }
811 },
812 {
813 "context": "vim_operator == sh",
814 "bindings": {
815 "!": "vim::CurrentLine"
816 }
817 },
818 {
819 "context": "vim_operator == gc",
820 "bindings": {
821 "c": "vim::CurrentLine"
822 }
823 },
824 {
825 "context": "vim_operator == gr",
826 "bindings": {
827 "r": "vim::CurrentLine"
828 }
829 },
830 {
831 "context": "vim_operator == cx",
832 "bindings": {
833 "x": "vim::CurrentLine",
834 "c": "vim::ClearExchange"
835 }
836 },
837 {
838 "context": "vim_mode == literal",
839 "bindings": {
840 "ctrl-@": [
841 "vim::Literal",
842 [
843 "ctrl-@",
844 "\u0000"
845 ]
846 ],
847 "ctrl-a": [
848 "vim::Literal",
849 [
850 "ctrl-a",
851 "\u0001"
852 ]
853 ],
854 "ctrl-b": [
855 "vim::Literal",
856 [
857 "ctrl-b",
858 "\u0002"
859 ]
860 ],
861 "ctrl-c": [
862 "vim::Literal",
863 [
864 "ctrl-c",
865 "\u0003"
866 ]
867 ],
868 "ctrl-d": [
869 "vim::Literal",
870 [
871 "ctrl-d",
872 "\u0004"
873 ]
874 ],
875 "ctrl-e": [
876 "vim::Literal",
877 [
878 "ctrl-e",
879 "\u0005"
880 ]
881 ],
882 "ctrl-f": [
883 "vim::Literal",
884 [
885 "ctrl-f",
886 "\u0006"
887 ]
888 ],
889 "ctrl-g": [
890 "vim::Literal",
891 [
892 "ctrl-g",
893 "\u0007"
894 ]
895 ],
896 "ctrl-h": [
897 "vim::Literal",
898 [
899 "ctrl-h",
900 "\u0008"
901 ]
902 ],
903 "ctrl-i": [
904 "vim::Literal",
905 [
906 "ctrl-i",
907 "\u0009"
908 ]
909 ],
910 "ctrl-j": [
911 "vim::Literal",
912 [
913 "ctrl-j",
914 "\u000A"
915 ]
916 ],
917 "ctrl-k": [
918 "vim::Literal",
919 [
920 "ctrl-k",
921 "\u000B"
922 ]
923 ],
924 "ctrl-l": [
925 "vim::Literal",
926 [
927 "ctrl-l",
928 "\u000C"
929 ]
930 ],
931 "ctrl-m": [
932 "vim::Literal",
933 [
934 "ctrl-m",
935 "\u000D"
936 ]
937 ],
938 "ctrl-n": [
939 "vim::Literal",
940 [
941 "ctrl-n",
942 "\u000E"
943 ]
944 ],
945 "ctrl-o": [
946 "vim::Literal",
947 [
948 "ctrl-o",
949 "\u000F"
950 ]
951 ],
952 "ctrl-p": [
953 "vim::Literal",
954 [
955 "ctrl-p",
956 "\u0010"
957 ]
958 ],
959 "ctrl-q": [
960 "vim::Literal",
961 [
962 "ctrl-q",
963 "\u0011"
964 ]
965 ],
966 "ctrl-r": [
967 "vim::Literal",
968 [
969 "ctrl-r",
970 "\u0012"
971 ]
972 ],
973 "ctrl-s": [
974 "vim::Literal",
975 [
976 "ctrl-s",
977 "\u0013"
978 ]
979 ],
980 "ctrl-t": [
981 "vim::Literal",
982 [
983 "ctrl-t",
984 "\u0014"
985 ]
986 ],
987 "ctrl-u": [
988 "vim::Literal",
989 [
990 "ctrl-u",
991 "\u0015"
992 ]
993 ],
994 "ctrl-v": [
995 "vim::Literal",
996 [
997 "ctrl-v",
998 "\u0016"
999 ]
1000 ],
1001 "ctrl-w": [
1002 "vim::Literal",
1003 [
1004 "ctrl-w",
1005 "\u0017"
1006 ]
1007 ],
1008 "ctrl-x": [
1009 "vim::Literal",
1010 [
1011 "ctrl-x",
1012 "\u0018"
1013 ]
1014 ],
1015 "ctrl-y": [
1016 "vim::Literal",
1017 [
1018 "ctrl-y",
1019 "\u0019"
1020 ]
1021 ],
1022 "ctrl-z": [
1023 "vim::Literal",
1024 [
1025 "ctrl-z",
1026 "\u001A"
1027 ]
1028 ],
1029 "ctrl-[": [
1030 "vim::Literal",
1031 [
1032 "ctrl-[",
1033 "\u001B"
1034 ]
1035 ],
1036 "ctrl-\\": [
1037 "vim::Literal",
1038 [
1039 "ctrl-\\",
1040 "\u001C"
1041 ]
1042 ],
1043 "ctrl-]": [
1044 "vim::Literal",
1045 [
1046 "ctrl-]",
1047 "\u001D"
1048 ]
1049 ],
1050 "ctrl-^": [
1051 "vim::Literal",
1052 [
1053 "ctrl-^",
1054 "\u001E"
1055 ]
1056 ],
1057 "ctrl-_": [
1058 "vim::Literal",
1059 [
1060 "ctrl-_",
1061 "\u001F"
1062 ]
1063 ],
1064 "escape": [
1065 "vim::Literal",
1066 [
1067 "escape",
1068 "\u001B"
1069 ]
1070 ],
1071 "enter": [
1072 "vim::Literal",
1073 [
1074 "enter",
1075 "\u000D"
1076 ]
1077 ],
1078 "tab": [
1079 "vim::Literal",
1080 [
1081 "tab",
1082 "\u0009"
1083 ]
1084 ],
1085 // zed extensions:
1086 "backspace": [
1087 "vim::Literal",
1088 [
1089 "backspace",
1090 "\u0008"
1091 ]
1092 ],
1093 "delete": [
1094 "vim::Literal",
1095 [
1096 "delete",
1097 "\u007F"
1098 ]
1099 ]
1100 }
1101 },
1102 {
1103 "context": "BufferSearchBar && !in_replace",
1104 "bindings": {
1105 "enter": "vim::SearchSubmit",
1106 "escape": "buffer_search::Dismiss"
1107 }
1108 },
1109 {
1110 "context": "GitPanel || ProjectPanel || CollabPanel || OutlinePanel || ChatPanel || VimControl || EmptyPane || SharedScreen || MarkdownPreview || KeyContextView",
1111 "bindings": {
1112 // window related commands (ctrl-w X)
1113 "ctrl-w": null,
1114 "ctrl-w left": "workspace::ActivatePaneLeft",
1115 "ctrl-w right": "workspace::ActivatePaneRight",
1116 "ctrl-w up": "workspace::ActivatePaneUp",
1117 "ctrl-w down": "workspace::ActivatePaneDown",
1118 "ctrl-w ctrl-h": "workspace::ActivatePaneLeft",
1119 "ctrl-w ctrl-l": "workspace::ActivatePaneRight",
1120 "ctrl-w ctrl-k": "workspace::ActivatePaneUp",
1121 "ctrl-w ctrl-j": "workspace::ActivatePaneDown",
1122 "ctrl-w h": "workspace::ActivatePaneLeft",
1123 "ctrl-w l": "workspace::ActivatePaneRight",
1124 "ctrl-w k": "workspace::ActivatePaneUp",
1125 "ctrl-w j": "workspace::ActivatePaneDown",
1126 "ctrl-w shift-left": "workspace::SwapPaneLeft",
1127 "ctrl-w shift-right": "workspace::SwapPaneRight",
1128 "ctrl-w shift-up": "workspace::SwapPaneUp",
1129 "ctrl-w shift-down": "workspace::SwapPaneDown",
1130 "ctrl-w shift-h": "workspace::SwapPaneLeft",
1131 "ctrl-w shift-l": "workspace::SwapPaneRight",
1132 "ctrl-w shift-k": "workspace::SwapPaneUp",
1133 "ctrl-w shift-j": "workspace::SwapPaneDown",
1134 "ctrl-w >": "vim::ResizePaneRight",
1135 "ctrl-w <": "vim::ResizePaneLeft",
1136 "ctrl-w -": "vim::ResizePaneDown",
1137 "ctrl-w +": "vim::ResizePaneUp",
1138 "ctrl-w _": "vim::MaximizePane",
1139 "ctrl-w =": "vim::ResetPaneSizes",
1140 "ctrl-w g t": "pane::ActivateNextItem",
1141 "ctrl-w ctrl-g t": "pane::ActivateNextItem",
1142 "ctrl-w g shift-t": "pane::ActivatePreviousItem",
1143 "ctrl-w ctrl-g shift-t": "pane::ActivatePreviousItem",
1144 "ctrl-w w": "workspace::ActivateNextPane",
1145 "ctrl-w ctrl-w": "workspace::ActivateNextPane",
1146 "ctrl-w p": "workspace::ActivatePreviousPane",
1147 "ctrl-w ctrl-p": "workspace::ActivatePreviousPane",
1148 "ctrl-w shift-w": "workspace::ActivatePreviousPane",
1149 "ctrl-w ctrl-shift-w": "workspace::ActivatePreviousPane",
1150 "ctrl-w ctrl-v": "pane::SplitVertical",
1151 "ctrl-w v": "pane::SplitVertical",
1152 "ctrl-w shift-s": "pane::SplitHorizontal",
1153 "ctrl-w ctrl-s": "pane::SplitHorizontal",
1154 "ctrl-w s": "pane::SplitHorizontal",
1155 "ctrl-w ctrl-c": "pane::CloseActiveItem",
1156 "ctrl-w c": "pane::CloseActiveItem",
1157 "ctrl-w ctrl-q": "pane::CloseActiveItem",
1158 "ctrl-w q": "pane::CloseActiveItem",
1159 "ctrl-w ctrl-a": "pane::CloseAllItems",
1160 "ctrl-w a": "pane::CloseAllItems",
1161 "ctrl-w ctrl-o": "workspace::CloseInactiveTabsAndPanes",
1162 "ctrl-w o": "workspace::CloseInactiveTabsAndPanes",
1163 "ctrl-w ctrl-n": "workspace::NewFileSplitHorizontal",
1164 "ctrl-w n": "workspace::NewFileSplitHorizontal"
1165 }
1166 },
1167 {
1168 "context": "ChangesList || EmptyPane || SharedScreen || MarkdownPreview || KeyContextView || Welcome",
1169 "bindings": {
1170 ":": "command_palette::Toggle",
1171 "g /": "pane::DeploySearch"
1172 }
1173 },
1174 {
1175 // netrw compatibility
1176 "context": "ProjectPanel && not_editing",
1177 "bindings": {
1178 ":": "command_palette::Toggle",
1179 "%": "project_panel::NewFile",
1180 "/": "project_panel::NewSearchInDirectory",
1181 "d": "project_panel::NewDirectory",
1182 "enter": "project_panel::OpenPermanent",
1183 "escape": "project_panel::ToggleFocus",
1184 "h": "project_panel::CollapseSelectedEntry",
1185 "j": "menu::SelectNext",
1186 "k": "menu::SelectPrevious",
1187 "l": "project_panel::ExpandSelectedEntry",
1188 "o": "project_panel::OpenPermanent",
1189 "shift-d": "project_panel::Delete",
1190 "shift-r": "project_panel::Rename",
1191 "t": "project_panel::OpenPermanent",
1192 "v": "project_panel::OpenPermanent",
1193 "p": "project_panel::Open",
1194 "x": "project_panel::RevealInFileManager",
1195 "s": "project_panel::OpenWithSystem",
1196 "] c": "project_panel::SelectNextGitEntry",
1197 "[ c": "project_panel::SelectPrevGitEntry",
1198 "] d": "project_panel::SelectNextDiagnostic",
1199 "[ d": "project_panel::SelectPrevDiagnostic",
1200 "}": "project_panel::SelectNextDirectory",
1201 "{": "project_panel::SelectPrevDirectory",
1202 "shift-g": "menu::SelectLast",
1203 "g g": "menu::SelectFirst",
1204 "-": "project_panel::SelectParent",
1205 "ctrl-6": "pane::AlternateFile"
1206 }
1207 },
1208 {
1209 "context": "OutlinePanel && not_editing",
1210 "bindings": {
1211 "j": "menu::SelectNext",
1212 "k": "menu::SelectPrevious",
1213 "shift-g": "menu::SelectLast",
1214 "g g": "menu::SelectFirst"
1215 }
1216 },
1217 {
1218 "context": "GitPanel && ChangesList",
1219 "use_key_equivalents": true,
1220 "bindings": {
1221 "k": "menu::SelectPrevious",
1222 "j": "menu::SelectNext",
1223 "g g": "menu::SelectFirst",
1224 "shift-g": "menu::SelectLast",
1225 "g f": "menu::Confirm",
1226 "i": "git_panel::FocusEditor",
1227 "x": "git::ToggleStaged",
1228 "shift-x": "git::StageAll",
1229 "shift-u": "git::UnstageAll"
1230 }
1231 },
1232 {
1233 "context": "Editor && edit_prediction",
1234 "bindings": {
1235 // This is identical to the binding in the base keymap, but the vim bindings above to
1236 // "vim::Tab" shadow it, so it needs to be bound again.
1237 "tab": "editor::AcceptEditPrediction"
1238 }
1239 },
1240 {
1241 "context": "os != macos && Editor && edit_prediction_conflict",
1242 "bindings": {
1243 // alt-l is provided as an alternative to tab/alt-tab. and will be displayed in the UI. This
1244 // is because alt-tab may not be available, as it is often used for window switching on Linux
1245 // and Windows.
1246 "alt-l": "editor::AcceptEditPrediction"
1247 }
1248 }
1249]