vim.json

  1[
  2  {
  3    "context": "ProjectPanel || Editor",
  4    "bindings": {
  5      "ctrl-6": "pane::AlternateFile"
  6    }
  7  },
  8  {
  9    "context": "Editor && VimControl && !VimWaiting && !menu",
 10    "bindings": {
 11      "i": [
 12        "vim::PushOperator",
 13        {
 14          "Object": {
 15            "around": false
 16          }
 17        }
 18      ],
 19      "a": [
 20        "vim::PushOperator",
 21        {
 22          "Object": {
 23            "around": true
 24          }
 25        }
 26      ],
 27      ":": "command_palette::Toggle",
 28      "h": "vim::Left",
 29      "left": "vim::Left",
 30      "backspace": "vim::Backspace",
 31      "j": "vim::Down",
 32      "down": "vim::Down",
 33      "enter": "vim::NextLineStart",
 34      "tab": "vim::Tab",
 35      "shift-tab": "vim::Tab",
 36      "k": "vim::Up",
 37      "up": "vim::Up",
 38      "l": "vim::Right",
 39      "right": "vim::Right",
 40      "space": "vim::Space",
 41      "$": "vim::EndOfLine",
 42      "^": "vim::FirstNonWhitespace",
 43      "_": "vim::StartOfLineDownward",
 44      "g _": "vim::EndOfLineDownward",
 45      "shift-g": "vim::EndOfDocument",
 46      "{": "vim::StartOfParagraph",
 47      "}": "vim::EndOfParagraph",
 48      "|": "vim::GoToColumn",
 49
 50      // Word motions
 51      "w": "vim::NextWordStart",
 52      "e": "vim::NextWordEnd",
 53      "b": "vim::PreviousWordStart",
 54      "g e": "vim::PreviousWordEnd",
 55
 56      // Subword motions
 57      // "w": "vim::NextSubwordStart",
 58      // "b": "vim::PreviousSubwordStart",
 59      // "e": "vim::NextSubwordEnd",
 60      // "g e": "vim::PreviousSubwordEnd",
 61
 62      "shift-w": [
 63        "vim::NextWordStart",
 64        {
 65          "ignorePunctuation": true
 66        }
 67      ],
 68      "shift-e": [
 69        "vim::NextWordEnd",
 70        {
 71          "ignorePunctuation": true
 72        }
 73      ],
 74      "shift-b": [
 75        "vim::PreviousWordStart",
 76        {
 77          "ignorePunctuation": true
 78        }
 79      ],
 80      "g shift-e": ["vim::PreviousWordEnd", { "ignorePunctuation": true }],
 81
 82      "/": "vim::Search",
 83      "g /": "pane::DeploySearch",
 84      "?": [
 85        "vim::Search",
 86        {
 87          "backwards": true
 88        }
 89      ],
 90      "*": "vim::MoveToNext",
 91      "#": "vim::MoveToPrev",
 92      "n": "vim::MoveToNextMatch",
 93      "shift-n": "vim::MoveToPrevMatch",
 94      "%": "vim::Matching",
 95      "f": [
 96        "vim::PushOperator",
 97        {
 98          "FindForward": {
 99            "before": false
100          }
101        }
102      ],
103      "t": [
104        "vim::PushOperator",
105        {
106          "FindForward": {
107            "before": true
108          }
109        }
110      ],
111      "shift-f": [
112        "vim::PushOperator",
113        {
114          "FindBackward": {
115            "after": false
116          }
117        }
118      ],
119      "shift-t": [
120        "vim::PushOperator",
121        {
122          "FindBackward": {
123            "after": true
124          }
125        }
126      ],
127      "m": ["vim::PushOperator", "Mark"],
128      "'": ["vim::PushOperator", { "Jump": { "line": true } }],
129      "`": ["vim::PushOperator", { "Jump": { "line": false } }],
130      ";": "vim::RepeatFind",
131      ",": "vim::RepeatFindReversed",
132      "ctrl-o": "pane::GoBack",
133      "ctrl-i": "pane::GoForward",
134      "ctrl-]": "editor::GoToDefinition",
135      "escape": ["vim::SwitchMode", "Normal"],
136      "ctrl-[": ["vim::SwitchMode", "Normal"],
137      "v": "vim::ToggleVisual",
138      "shift-v": "vim::ToggleVisualLine",
139      "ctrl-v": "vim::ToggleVisualBlock",
140      "ctrl-q": "vim::ToggleVisualBlock",
141      "shift-k": "editor::Hover",
142      "shift-r": "vim::ToggleReplace",
143      "0": "vim::StartOfLine", // When no number operator present, use start of line motion
144      "ctrl-f": "vim::PageDown",
145      "pagedown": "vim::PageDown",
146      "ctrl-b": "vim::PageUp",
147      "pageup": "vim::PageUp",
148      "ctrl-d": "vim::ScrollDown",
149      "ctrl-u": "vim::ScrollUp",
150      "ctrl-e": "vim::LineDown",
151      "ctrl-y": "vim::LineUp",
152      // "g" commands
153      "g g": "vim::StartOfDocument",
154      "g h": "editor::Hover",
155      "g t": "pane::ActivateNextItem",
156      "g shift-t": "pane::ActivatePrevItem",
157      "g d": "editor::GoToDefinition",
158      "g shift-d": "editor::GoToTypeDefinition",
159      "g cmd-d": "editor::GoToImplementation",
160      "g x": "editor::OpenUrl",
161      "g n": "vim::SelectNextMatch",
162      "g shift-n": "vim::SelectPreviousMatch",
163      "g l": "vim::SelectNext",
164      "g shift-l": "vim::SelectPrevious",
165      "g >": [
166        "editor::SelectNext",
167        {
168          "replace_newest": true
169        }
170      ],
171      "g <": [
172        "editor::SelectPrevious",
173        {
174          "replace_newest": true
175        }
176      ],
177      "g a": "editor::SelectAllMatches",
178      "g s": "outline::Toggle",
179      "g shift-s": "project_symbols::Toggle",
180      "g .": "editor::ToggleCodeActions", // zed specific
181      "g shift-a": "editor::FindAllReferences", // zed specific
182      "g space": "editor::OpenExcerpts", // zed specific
183      "g *": [
184        "vim::MoveToNext",
185        {
186          "partialWord": true
187        }
188      ],
189      "g #": [
190        "vim::MoveToPrev",
191        {
192          "partialWord": true
193        }
194      ],
195      "g j": [
196        "vim::Down",
197        {
198          "displayLines": true
199        }
200      ],
201      "g down": [
202        "vim::Down",
203        {
204          "displayLines": true
205        }
206      ],
207      "g k": [
208        "vim::Up",
209        {
210          "displayLines": true
211        }
212      ],
213      "g up": [
214        "vim::Up",
215        {
216          "displayLines": true
217        }
218      ],
219      "g $": [
220        "vim::EndOfLine",
221        {
222          "displayLines": true
223        }
224      ],
225      "g end": [
226        "vim::EndOfLine",
227        {
228          "displayLines": true
229        }
230      ],
231      "g 0": [
232        "vim::StartOfLine",
233        {
234          "displayLines": true
235        }
236      ],
237      "g home": [
238        "vim::StartOfLine",
239        {
240          "displayLines": true
241        }
242      ],
243      "g ^": [
244        "vim::FirstNonWhitespace",
245        {
246          "displayLines": true
247        }
248      ],
249      "g v": "vim::RestoreVisualSelection",
250      "g ]": "editor::GoToDiagnostic",
251      "g [": "editor::GoToPrevDiagnostic",
252      "g i": "vim::InsertAtPrevious",
253      "g ,": "vim::ChangeListNewer",
254      "g ;": "vim::ChangeListOlder",
255      "shift-h": "vim::WindowTop",
256      "shift-m": "vim::WindowMiddle",
257      "shift-l": "vim::WindowBottom",
258      // z commands
259      "z t": "editor::ScrollCursorTop",
260      "z z": "editor::ScrollCursorCenter",
261      "z .": ["workspace::SendKeystrokes", "z z ^"],
262      "z b": "editor::ScrollCursorBottom",
263      "z c": "editor::Fold",
264      "z o": "editor::UnfoldLines",
265      "z f": "editor::FoldSelectedRanges",
266      "shift-z shift-q": [
267        "pane::CloseActiveItem",
268        {
269          "saveIntent": "skip"
270        }
271      ],
272      "shift-z shift-z": [
273        "pane::CloseActiveItem",
274        {
275          "saveIntent": "saveAll"
276        }
277      ],
278      // Count support
279      "1": ["vim::Number", 1],
280      "2": ["vim::Number", 2],
281      "3": ["vim::Number", 3],
282      "4": ["vim::Number", 4],
283      "5": ["vim::Number", 5],
284      "6": ["vim::Number", 6],
285      "7": ["vim::Number", 7],
286      "8": ["vim::Number", 8],
287      "9": ["vim::Number", 9],
288      // window related commands (ctrl-w X)
289      "ctrl-w left": ["workspace::ActivatePaneInDirection", "Left"],
290      "ctrl-w right": ["workspace::ActivatePaneInDirection", "Right"],
291      "ctrl-w up": ["workspace::ActivatePaneInDirection", "Up"],
292      "ctrl-w down": ["workspace::ActivatePaneInDirection", "Down"],
293      "ctrl-w h": ["workspace::ActivatePaneInDirection", "Left"],
294      "ctrl-w l": ["workspace::ActivatePaneInDirection", "Right"],
295      "ctrl-w k": ["workspace::ActivatePaneInDirection", "Up"],
296      "ctrl-w j": ["workspace::ActivatePaneInDirection", "Down"],
297      "ctrl-w ctrl-h": ["workspace::ActivatePaneInDirection", "Left"],
298      "ctrl-w ctrl-l": ["workspace::ActivatePaneInDirection", "Right"],
299      "ctrl-w ctrl-k": ["workspace::ActivatePaneInDirection", "Up"],
300      "ctrl-w ctrl-j": ["workspace::ActivatePaneInDirection", "Down"],
301      "ctrl-w shift-left": ["workspace::SwapPaneInDirection", "Left"],
302      "ctrl-w shift-right": ["workspace::SwapPaneInDirection", "Right"],
303      "ctrl-w shift-up": ["workspace::SwapPaneInDirection", "Up"],
304      "ctrl-w shift-down": ["workspace::SwapPaneInDirection", "Down"],
305      "ctrl-w shift-h": ["workspace::SwapPaneInDirection", "Left"],
306      "ctrl-w shift-l": ["workspace::SwapPaneInDirection", "Right"],
307      "ctrl-w shift-k": ["workspace::SwapPaneInDirection", "Up"],
308      "ctrl-w shift-j": ["workspace::SwapPaneInDirection", "Down"],
309      "ctrl-w g t": "pane::ActivateNextItem",
310      "ctrl-w ctrl-g t": "pane::ActivateNextItem",
311      "ctrl-w g shift-t": "pane::ActivatePrevItem",
312      "ctrl-w ctrl-g shift-t": "pane::ActivatePrevItem",
313      "ctrl-w w": "workspace::ActivateNextPane",
314      "ctrl-w ctrl-w": "workspace::ActivateNextPane",
315      "ctrl-w p": "workspace::ActivatePreviousPane",
316      "ctrl-w ctrl-p": "workspace::ActivatePreviousPane",
317      "ctrl-w shift-w": "workspace::ActivatePreviousPane",
318      "ctrl-w ctrl-shift-w": "workspace::ActivatePreviousPane",
319      "ctrl-w v": "pane::SplitLeft",
320      "ctrl-w ctrl-v": "pane::SplitLeft",
321      "ctrl-w s": "pane::SplitUp",
322      "ctrl-w shift-s": "pane::SplitUp",
323      "ctrl-w ctrl-s": "pane::SplitUp",
324      "ctrl-w c": "pane::CloseAllItems",
325      "ctrl-w ctrl-c": "pane::CloseAllItems",
326      "ctrl-w q": "pane::CloseAllItems",
327      "ctrl-w ctrl-q": "pane::CloseAllItems",
328      "ctrl-w o": "workspace::CloseInactiveTabsAndPanes",
329      "ctrl-w ctrl-o": "workspace::CloseInactiveTabsAndPanes",
330      "ctrl-w n": ["workspace::NewFileInDirection", "Up"],
331      "ctrl-w ctrl-n": ["workspace::NewFileInDirection", "Up"],
332
333      "ctrl-w d": "editor::GoToDefinitionSplit",
334      "ctrl-w g d": "editor::GoToDefinitionSplit",
335      "ctrl-w shift-d": "editor::GoToTypeDefinitionSplit",
336      "ctrl-w g shift-d": "editor::GoToTypeDefinitionSplit",
337      "ctrl-w space": "editor::OpenExcerptsSplit",
338      "ctrl-w g space": "editor::OpenExcerptsSplit",
339      "-": "pane::RevealInProjectPanel"
340    }
341  },
342  {
343    // escape is in its own section so that it cancels a pending count.
344    "context": "Editor && vim_mode == normal && vim_operator == none && !VimWaiting",
345    "bindings": {
346      "escape": "editor::Cancel",
347      "ctrl-[": "editor::Cancel"
348    }
349  },
350  {
351    "context": "Editor && vim_mode == normal && vim_operator == none && !VimWaiting",
352    "bindings": {
353      ".": "vim::Repeat",
354      "c": ["vim::PushOperator", "Change"],
355      "shift-c": "vim::ChangeToEndOfLine",
356      "d": ["vim::PushOperator", "Delete"],
357      "shift-d": "vim::DeleteToEndOfLine",
358      "shift-j": "vim::JoinLines",
359      "y": ["vim::PushOperator", "Yank"],
360      "shift-y": "vim::YankLine",
361      "i": "vim::InsertBefore",
362      "shift-i": "vim::InsertFirstNonWhitespace",
363      "a": "vim::InsertAfter",
364      "shift-a": "vim::InsertEndOfLine",
365      "x": "vim::DeleteRight",
366      "shift-x": "vim::DeleteLeft",
367      "o": "vim::InsertLineBelow",
368      "shift-o": "vim::InsertLineAbove",
369      "~": "vim::ChangeCase",
370      "ctrl-a": "vim::Increment",
371      "ctrl-x": "vim::Decrement",
372      "p": "vim::Paste",
373      "shift-p": [
374        "vim::Paste",
375        {
376          "before": true
377        }
378      ],
379      "u": "editor::Undo",
380      "ctrl-r": "editor::Redo",
381      "r": ["vim::PushOperator", "Replace"],
382      "s": "vim::Substitute",
383      "shift-s": "vim::SubstituteLine",
384      ">": ["vim::PushOperator", "Indent"],
385      "<": ["vim::PushOperator", "Outdent"],
386      "g u": ["vim::PushOperator", "Lowercase"],
387      "g shift-u": ["vim::PushOperator", "Uppercase"],
388      "g ~": ["vim::PushOperator", "OppositeCase"],
389      "\"": ["vim::PushOperator", "Register"],
390      "ctrl-pagedown": "pane::ActivateNextItem",
391      "ctrl-pageup": "pane::ActivatePrevItem",
392      // tree-sitter related commands
393      "[ x": "editor::SelectLargerSyntaxNode",
394      "] x": "editor::SelectSmallerSyntaxNode",
395      "] d": "editor::GoToDiagnostic",
396      "[ d": "editor::GoToPrevDiagnostic",
397      "] c": "editor::GoToHunk",
398      "[ c": "editor::GoToPrevHunk"
399    }
400  },
401  {
402    "context": "Editor && vim_mode == visual && vim_operator == none && !VimWaiting",
403    "bindings": {
404      "\"": ["vim::PushOperator", "Register"],
405      // tree-sitter related commands
406      "[ x": "editor::SelectLargerSyntaxNode",
407      "] x": "editor::SelectSmallerSyntaxNode"
408    }
409  },
410  {
411    "context": "Editor && VimCount",
412    "bindings": {
413      "0": ["vim::Number", 0]
414    }
415  },
416  {
417    "context": "Editor && vim_operator == c",
418    "bindings": {
419      "c": "vim::CurrentLine",
420      "d": "editor::Rename" // zed specific
421    }
422  },
423  {
424    "context": "Editor && vim_mode == normal && vim_operator == c",
425    "bindings": {
426      "s": [
427        "vim::PushOperator",
428        {
429          "ChangeSurrounds": {}
430        }
431      ]
432    }
433  },
434  {
435    "context": "Editor && vim_operator == d",
436    "bindings": {
437      "d": "vim::CurrentLine"
438    }
439  },
440  {
441    "context": "Editor && vim_operator == gu",
442    "bindings": {
443      "g u": "vim::CurrentLine",
444      "u": "vim::CurrentLine"
445    }
446  },
447  {
448    "context": "Editor && vim_operator == gU",
449    "bindings": {
450      "g shift-u": "vim::CurrentLine",
451      "shift-u": "vim::CurrentLine"
452    }
453  },
454  {
455    "context": "Editor && vim_operator == g~",
456    "bindings": {
457      "g ~": "vim::CurrentLine",
458      "~": "vim::CurrentLine"
459    }
460  },
461  {
462    "context": "Editor && vim_mode == normal && vim_operator == d",
463    "bindings": {
464      "s": ["vim::PushOperator", "DeleteSurrounds"]
465    }
466  },
467  {
468    "context": "Editor && vim_operator == y",
469    "bindings": {
470      "y": "vim::CurrentLine"
471    }
472  },
473  {
474    "context": "Editor && vim_mode == normal && vim_operator == y",
475    "bindings": {
476      "s": [
477        "vim::PushOperator",
478        {
479          "AddSurrounds": {}
480        }
481      ]
482    }
483  },
484  {
485    "context": "Editor && vim_operator == ys",
486    "bindings": {
487      "s": "vim::CurrentLine"
488    }
489  },
490  {
491    "context": "Editor && vim_operator == >",
492    "bindings": {
493      ">": "vim::CurrentLine"
494    }
495  },
496  {
497    "context": "Editor && vim_operator == <",
498    "bindings": {
499      "<": "vim::CurrentLine"
500    }
501  },
502  {
503    "context": "Editor && VimObject",
504    "bindings": {
505      "w": "vim::Word",
506      "shift-w": [
507        "vim::Word",
508        {
509          "ignorePunctuation": true
510        }
511      ],
512      "t": "vim::Tag",
513      "s": "vim::Sentence",
514      "p": "vim::Paragraph",
515      "'": "vim::Quotes",
516      "`": "vim::BackQuotes",
517      "\"": "vim::DoubleQuotes",
518      "|": "vim::VerticalBars",
519      "(": "vim::Parentheses",
520      ")": "vim::Parentheses",
521      "b": "vim::Parentheses",
522      "[": "vim::SquareBrackets",
523      "]": "vim::SquareBrackets",
524      "{": "vim::CurlyBrackets",
525      "}": "vim::CurlyBrackets",
526      "shift-b": "vim::CurlyBrackets",
527      "<": "vim::AngleBrackets",
528      ">": "vim::AngleBrackets",
529      "a": "vim::Argument"
530    }
531  },
532  {
533    "context": "Editor && vim_mode == visual && !VimWaiting && !VimObject",
534    "bindings": {
535      "u": "vim::ConvertToLowerCase",
536      "U": "vim::ConvertToUpperCase",
537      "o": "vim::OtherEnd",
538      "shift-o": "vim::OtherEnd",
539      "d": "vim::VisualDelete",
540      "x": "vim::VisualDelete",
541      "shift-d": "vim::VisualDeleteLine",
542      "shift-x": "vim::VisualDeleteLine",
543      "y": "vim::VisualYank",
544      "shift-y": "vim::VisualYank",
545      "p": "vim::Paste",
546      "shift-p": [
547        "vim::Paste",
548        {
549          "preserveClipboard": true
550        }
551      ],
552      "s": "vim::Substitute",
553      "shift-s": "vim::SubstituteLine",
554      "shift-r": "vim::SubstituteLine",
555      "c": "vim::Substitute",
556      "~": "vim::ChangeCase",
557      "*": [
558        "vim::MoveToNext",
559        {
560          "partialWord": true
561        }
562      ],
563      "#": [
564        "vim::MoveToPrev",
565        {
566          "partialWord": true
567        }
568      ],
569      "ctrl-a": "vim::Increment",
570      "ctrl-x": "vim::Decrement",
571      "g ctrl-a": [
572        "vim::Increment",
573        {
574          "step": true
575        }
576      ],
577      "g ctrl-x": [
578        "vim::Decrement",
579        {
580          "step": true
581        }
582      ],
583      "shift-i": "vim::InsertBefore",
584      "shift-a": "vim::InsertAfter",
585      "shift-j": "vim::JoinLines",
586      "r": ["vim::PushOperator", "Replace"],
587      "ctrl-c": ["vim::SwitchMode", "Normal"],
588      "escape": ["vim::SwitchMode", "Normal"],
589      "ctrl-[": ["vim::SwitchMode", "Normal"],
590      ">": "vim::Indent",
591      "<": "vim::Outdent",
592      "i": [
593        "vim::PushOperator",
594        {
595          "Object": {
596            "around": false
597          }
598        }
599      ],
600      "a": [
601        "vim::PushOperator",
602        {
603          "Object": {
604            "around": true
605          }
606        }
607      ]
608    }
609  },
610  {
611    "context": "Editor && vim_mode == normal && !VimWaiting",
612    "bindings": {
613      "g c c": "editor::ToggleComments"
614    }
615  },
616  {
617    "context": "Editor && vim_mode == visual",
618    "bindings": {
619      "g c": "editor::ToggleComments"
620    }
621  },
622  {
623    "context": "Editor && vim_mode == insert",
624    "bindings": {
625      "escape": "vim::NormalBefore",
626      "ctrl-c": "vim::NormalBefore",
627      "ctrl-[": "vim::NormalBefore",
628      "ctrl-x ctrl-o": "editor::ShowCompletions",
629      "ctrl-x ctrl-a": "assistant::InlineAssist", // zed specific
630      "ctrl-x ctrl-c": "editor::ShowInlineCompletion", // zed specific
631      "ctrl-x ctrl-l": "editor::ToggleCodeActions", // zed specific
632      "ctrl-x ctrl-z": "editor::Cancel",
633      "ctrl-w": "editor::DeleteToPreviousWordStart",
634      "ctrl-u": "editor::DeleteToBeginningOfLine",
635      "ctrl-t": "vim::Indent",
636      "ctrl-d": "vim::Outdent",
637      "ctrl-r \"": "editor::Paste",
638      "ctrl-r +": "editor::Paste"
639    }
640  },
641  {
642    "context": "Editor && vim_mode == replace",
643    "bindings": {
644      "escape": "vim::NormalBefore",
645      "ctrl-c": "vim::NormalBefore",
646      "ctrl-[": "vim::NormalBefore",
647      "backspace": "vim::UndoReplace"
648    }
649  },
650  {
651    "context": "Editor && VimWaiting",
652    "bindings": {
653      "tab": "vim::Tab",
654      "enter": "vim::Enter",
655      "escape": ["vim::SwitchMode", "Normal"],
656      "ctrl-[": ["vim::SwitchMode", "Normal"]
657    }
658  },
659  {
660    "context": "BufferSearchBar && !in_replace",
661    "bindings": {
662      "enter": "vim::SearchSubmit",
663      "escape": "buffer_search::Dismiss"
664    }
665  },
666  {
667    "context": "EmptyPane || SharedScreen",
668    "bindings": {
669      ":": "command_palette::Toggle"
670    }
671  },
672  {
673    // netrw compatibility
674    "context": "ProjectPanel && not_editing",
675    "bindings": {
676      ":": "command_palette::Toggle",
677      "%": "project_panel::NewFile",
678      "/": "project_panel::NewSearchInDirectory",
679      "d": "project_panel::NewDirectory",
680      "enter": "project_panel::OpenPermanent",
681      "escape": "project_panel::ToggleFocus",
682      "h": "project_panel::CollapseSelectedEntry",
683      "j": "menu::SelectNext",
684      "k": "menu::SelectPrev",
685      "l": "project_panel::ExpandSelectedEntry",
686      "o": "project_panel::OpenPermanent",
687      "shift-d": "project_panel::Delete",
688      "shift-r": "project_panel::Rename",
689      "t": "project_panel::OpenPermanent",
690      "v": "project_panel::OpenPermanent",
691      "p": "project_panel::Open",
692      "x": "project_panel::RevealInFinder",
693      "shift-g": "menu::SelectLast",
694      "g g": "menu::SelectFirst",
695      "-": "project_panel::SelectParent"
696    }
697  }
698]