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