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