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]