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