vim.json

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