vim.json

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