Zed Keyboard Shortcuts
Zed's shortcut set will look immediately familiar to anyone coming from VS Code, and that is deliberate rather than accidental. The command palette, the file finder, the multi-cursor selection key and the terminal toggle all sit where a VS Code user expects them, which lowers the cost of trying the editor considerably. Where Zed diverges tends to be in the places it does something VS Code does not — its collaboration features and its assistant panel have bindings with no counterpart elsewhere. The more important thing to know before memorising anything is that Zed treats the whole keymap as swappable. A base keymap setting offers Zed's own defaults alongside prepackaged VS Code, JetBrains, Sublime Text, Atom, Emacs, TextMate and Cursor layouts, selectable from the settings window or the command palette. Choosing the one matching whatever you used before is a legitimate answer to every mapping question below, and for anyone who has years of muscle memory in another editor it is usually the right one. Vim mode and Helix mode are separate toggles layered on top, adding modal editing rather than replacing the base keymap. The bindings listed here are Zed's own defaults on Linux and Windows, with the macOS variants noted. Zed publishes its complete default keymaps as JSON files per platform, and the editor ships a keymap editor — reachable with Ctrl+K then Ctrl+S — that lists every action with its current binding and lets you change any of them inline. That editor is the authoritative reference for your installation, which matters because Zed releases frequently and the defaults have moved between versions. One structural note that explains a lot of Zed's behaviour: bindings are scoped to a context, arranged as a tree from the workspace down through panes to individual editors. The same keystroke can mean different things depending on whether focus is in an editor, the project panel or the terminal, and when two bindings compete the one attached to the more specific context wins. That is why a shortcut can work in one panel and appear dead in another, and the command palette is the quickest way to find out what is actually bound where you are.
Editing Selection
| Action | Windows | Mac | Description |
|---|---|---|---|
| Select the next occurrence | Ctrl+D | Cmd+D | Adds the next instance of the current selection to the selection set, giving one cursor per match. The standard route into multi-cursor editing, and the reason renaming a local variable rarely needs a refactor command. |
| Toggle line comment | Ctrl+/ | Cmd+/ | Comments or uncomments the current line or selection, using whichever syntax the file's language expects. Works across a multi-cursor selection, so several disconnected regions can be commented in one keystroke. |
| Format the current file | Ctrl+Shift+I | Cmd+Shift+I | Runs the configured formatter over the whole buffer. Zed can also format on save, which is the setting most people end up enabling — at which point this becomes the manual override for files you have not saved yet. |
| Rename a symbol | F2 | F2 | Renames the symbol at the cursor everywhere it appears in the codebase, driven by the language server. Different in kind from multi-cursor editing, which is textual — this understands scope, so an identically named variable in another function is left alone. |
| Expand / shrink selection by syntax | Ctrl+Right / Ctrl+Left (bindable) | Ctrl+Right / Ctrl+Left | Grows the selection to the enclosing syntax node — argument to call, call to statement, statement to block — rather than by words or lines. Depends on the syntax tree rather than on whitespace, so it selects structurally meaningful regions. |
Navigation Search
| Action | Windows | Mac | Description |
|---|---|---|---|
| Open the command palette | Ctrl+Shift+P | Cmd+Shift+P | Lists every action Zed exposes, filtered as you type, with each command's current keyboard binding shown beside it. Zed has no published catalogue of actions, so this doubles as the discovery mechanism for both commands and their keys. |
| Open a file by name | Ctrl+P | Cmd+P | Fuzzy-matches against every file in the project, so a few characters from anywhere in the path usually land it. Ctrl+E is bound to the same action, which is convenient on keyboards where P is awkward to reach with the modifier held. |
| Search across the project | Ctrl+Shift+F | Cmd+Shift+F | Searches file contents rather than filenames, opening results in a dedicated pane you can edit directly. Editing search results in place is the part worth knowing — changes made there apply to the underlying files. |
| Go to definition | F12 | F12 | Jumps to where the symbol under the cursor is defined, using the language server rather than a text search. Accuracy therefore depends on the language server being installed and having finished indexing, which on a large project takes a moment after opening. |
| Go to line | Ctrl+G | Ctrl+G | Jumps to a line number typed into a small prompt. Note this is Ctrl on macOS too rather than Cmd, one of a handful of bindings where Zed follows terminal convention instead of the platform one. |
| Show the file outline | Ctrl+Shift+O | Cmd+Shift+O | Lists the symbols in the current file — functions, classes, methods — as a filterable jump list. Faster than scrolling for orienting yourself in a long file you did not write. |
Panes Panels
| Action | Windows | Mac | Description |
|---|---|---|---|
| Toggle the integrated terminal | Ctrl+` | Ctrl+` | Shows and hides the terminal panel at the bottom of the window. Once focus is in the terminal, editor bindings no longer apply — Zed's context tree scopes them out, which is why the shortcut that worked a second ago suddenly does not. |
| Toggle the project panel | Ctrl+Shift+E | Cmd+Shift+E | Shows and hides the file tree. Worth pairing with the file finder — most Zed users end up leaving the panel closed and navigating by name, reopening it only to see structure. |
| Split the pane | Ctrl+\ | Cmd+\ | Splits the editor area, placing the current file in a new pane beside the existing one. Panes are independent views, so the same file can be open in both at different scroll positions. |
| Open the keymap editor | Ctrl+K Ctrl+S | Cmd+K Cmd+S | Opens a searchable list of every action and its current binding, editable in place. This is a key sequence rather than a chord — press Ctrl+K, release, then Ctrl+S, which is how several of Zed's less-common bindings work. |
| Switch the base keymap | Command palette → 'toggle base keymap' | Command palette → 'toggle base keymap' | Swaps the entire default keymap for a VS Code, JetBrains, Sublime Text, Atom, Emacs, TextMate or Cursor layout. The single most effective thing to do on day one if you are arriving with years of habit from another editor. |
Frequently Asked Questions
Why do Zed's shortcuts look so much like VS Code's?
Because matching them lowers the cost of trying the editor, and Zed's team have been open about wanting that. The command palette, file finder, multi-cursor key, comment toggle and terminal toggle are all where a VS Code user reaches for them. Where Zed differs is mostly in features VS Code lacks — the collaboration panel and the assistant have bindings with no counterpart. If the remaining differences still bother you, the VS Code base keymap removes them entirely.
How do I change a keyboard shortcut in Zed?
Ctrl+K then Ctrl+S opens the keymap editor, which lists every action alongside its current binding and lets you change one by clicking the pencil icon, double-clicking the row, or pressing Enter on it. Anything you change there is written to keymap.json, which lives at ~/.config/zed/keymap.json on macOS and Linux and under AppData\Roaming on Windows. Editing that file directly works equally well if you would rather manage it as text.
What are key sequences, and how do they differ from combinations?
A combination is keys pressed together, like Ctrl+P. A sequence is keys pressed one after another, written with a space — Ctrl+K Ctrl+S means press Ctrl+K, release, then press Ctrl+S. Zed supports both, which is how it fits a large number of actions into a limited keyboard. When one binding is a prefix of another, Zed waits about a second after the first key to see whether you are going to complete the longer sequence before firing the shorter one.
Why does a shortcut work in the editor but not in the terminal?
Zed scopes bindings to a context, and the contexts form a tree — Workspace at the root, then Panes and Panels, then individual Editors. A binding attached to Editor does not apply when focus is in the terminal panel or the project panel. When two bindings compete for the same keystroke, the one on the more specific context wins. If you want to see what is active where you are, the command palette has a key context view that prints the current tree.
Does Zed support Vim keybindings?
Yes, as a mode layered on top of whichever base keymap you have chosen rather than as a replacement for it. There is also a Helix mode built on the same machinery, using the same contexts. Both add modal editing — normal, insert and visual states — and the vim_mode context becomes available for scoping your own bindings, so you can bind something that only applies in normal mode.
How do I disable a binding I keep hitting by accident?
Bind it to null in keymap.json for the context where it bothers you. That disables every binding matching that keystroke further up the context tree as well, which is usually what you want. If you only meant to stop one specific action and keep another, you have to rebind rather than null it, since null is a blunt instrument by design.
Do the shortcuts work on a non-QWERTY keyboard?
Layouts that can type the full ASCII range — Dvorak, Colemak and similar — work as expected. Layouts that cannot, such as Cyrillic or Hebrew, are handled by matching against the ASCII equivalent of the physical key, so Ctrl with a Cyrillic character matches the binding for the Latin letter that key produces. On extended-Latin layouts such as French AZERTY or German QWERTZ, Zed relocates some bindings to keys that are actually reachable, and a use_key_equivalents setting opts your own bindings into the same treatment.
Where can I see every default binding for my platform?
Zed publishes complete default keymap files as JSON, one per platform, and the keymap editor inside the application shows the same information in a searchable form with your customisations applied. The published files are useful when you want to read the whole set at once or diff between versions; the in-app editor is better for answering 'what is this key bound to right now', which is the more common question.