As any Zed command is available, you may find that it's helpful to remember mnemonics that run the correct command. For example:
- `:diffs` for "toggle all hunk diffs"
- `:cpp` for "copy path to file"
- `:crp` for "copy relative path"
- `:reveal` for "reveal in finder"
- `:zlog` for "open zed log"
- `:clank` for "cancel language server work"
## Customizing key bindings
In this section, we'll learn how to customize the key bindings of Zed's vim mode. You'll learn:
- How to select the correct context for your new key bindings.
- Useful contexts for vim mode key bindings.
- Common key bindings to customize for extra productivity.
### Selecting the correct context
Zed's key bindings are evaluated only when the `"context"` property matches your location in the editor. For example, if you add key bindings to the `"Editor"` context, they will only work when you're editing a file. If you add key bindings to the `"Workspace"` context, they will work everywhere in Zed. Here's an example of a key binding that saves when you're editing a file:
```json
{
"context": "Editor",
"bindings": {
"ctrl-s": "file::Save"
}
}
```
Contexts are nested, so when you're editing a file, the context is the `"Editor"` context, which is inside the `"Pane"` context, which is inside the `"Workspace"` context. That's why any key bindings you add to the `"Workspace"` context will work when you're editing a file. Here's an example:
```json
// This key binding will work when you're editing a file. It comes built into Zed by default as the workspace: save command.
{
"context": "Workspace",
"bindings": {
"ctrl-s": "file::Save"
}
}
```
Contexts are expressions. They support boolean operators like `&&` (and) and `||` (or). For example, you can use the context `"Editor && vim_mode == normal"` to create key bindings that only work when you're editing a file _and_ you're in vim's normal mode.
Vim mode adds several contexts to the `"Editor"` context:
| Operator | Description |
| -------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| VimControl | Indicates that vim keybindings should work. Currently an alias for `vim_mode == normal \|\| vim_mode == visual \|\| vim_mode == operator`, but the definition may change over time |
| vim_mode == normal | Normal mode |
| vim_mode == visual | Visual mode |
| vim_mode == insert | Insert mode |
| vim_mode == replace | Replace mode |
| vim_mode == waiting | Waiting for an arbitrary key (e.g., after typing `f` or `t`) |
| vim_mode == operator | Waiting for another binding to trigger (e.g., after typing `c` or `d`) |
| vim_operator | Set to `none` unless `vim_mode == operator`, in which case it is set to the current operator's default keybinding (e.g., after typing `d`, `vim_operator == d`) |