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