# Code Editor Vim Keybindings

> Use Vim keybindings in Warp's code editor for keyboard-driven navigation and editing.

- 网址：https://funcoding.ai/agents/warp/code/code-editor/code-editor-vim-keybindings/
- 来源：Warp 官方文档原文（英文），MIT 许可，同步于 2026-10-11
- 官方原文：https://docs.warp.dev/code/code-editor/code-editor-vim-keybindings/

---
Warp's built-in code editor supports native Vim keybindings for keyboard-driven navigation and editing. Enable Vim mode to use familiar motions, text objects, visual mode, registers, and editing commands directly in Warp without switching to an external editor.

## About Vim keybindings

The Vi family of programs (including Vim and Neovim) are modal text editors that allow for keyboard-driven text editing. Vi-style keybindings are especially popular among developers for their speed and precision in navigating and manipulating code. Warp’s [code editor](https://funcoding.ai/agents/warp/code/code-editor/) now includes native support for Vim keybindings (also known as Vim mode), offering a familiar editing experience directly within your coding workflows.

### How to enable Vim keybindings

Vim mode in the code editor uses the same setting toggle as the input editor. To enable:

* Through the [Command Palette](https://funcoding.ai/agents/warp/terminal/command-palette/), search for "Vim Keybindings".
* Through **Settings** > **Features** > **Text Editing**, toggle "Edit code and commands with Vim keybindings".

Unlike the input editor, the Vim implementation in the code editor starts in Normal mode.

### Customizing keybindings

At the moment, Warp only supports default Vim keybindings.

One exception is the keyboard shortcut for exiting insert mode, which can be rebound under **Settings** > **Keyboard shortcuts** > **Exit Vim insert mode**, or through the [Command Palette](https://funcoding.ai/agents/warp/terminal/command-palette/) search for "Exit Vim insert mode".

## Supported keybindings

Below is a list of the vim functionality implemented in Warp so far.

### Movement

See [Vim docs: motion](https://vimdoc.sourceforge.net/htmldoc/motion.html) for more information.

#### Basic

| Command(s)                   | Description                                         |
| ---------------------------- | --------------------------------------------------- |
| `h`, `j`, `k`, `l`           | single-char movement                                |
| `<space>`, `<backspace>`     | single-char movement with line wrap                 |
| `w`, `W`, `b`, `B`, `e`, `E` | word movement                                       |
| `ge`, `gE`                   | end of previous word                                |
| `$`                          | end of line                                         |
| `0`                          | beginning of line                                   |
| `^`                          | first non-whitespace character of line              |
| `%`                          | jump to matching bracket                            |
| `[`, `]`                     | prev/next unmatched bracket                         |
| `_`                          | beginning of the current line                       |
| `+`                          | first non-whitespace character of the next line     |
| `-`                          | first non-whitespace character of the previous line |
| `, `                     | prev/next paragraph                                 |

#### Multi-line-related

| Command(s) | Description             |
| ---------- | ----------------------- |
| `gg`, `G`  | jump to first/last line |

### Editing

| Command(s) | Description                                                 |
| ---------- | ----------------------------------------------------------- |
| `r`        | replace character under cursor                              |
| `d`, `D`   | delete a range or object                                    |
| `c`, `C`   | change a range or object (delete, then go to insert mode)   |
| `s`, `S`   | substitute (like change, but can only delete at the cursor) |
| `x`, `X`   | delete under cursor                                         |
| `y`, `Y`   | yank (copy) into the clipboard                              |
| `p`, `P`   | paste from the clipboard                                    |
| `u`, `⌃r`  | undo, redo                                                  |
| `~`        | toggle upper/lowercase under cursor                         |
| `gu`       | lowercase under cursor (`u` in visual mode)                 |
| `gU`       | uppercase under cursor (`U` in visual mode)                 |
| `J`        | join current and following lines                            |
| `.`        | repeat last edit                                            |
| `gcc`      | toggle comments on current line                             |
| `gc`       | toggle comments on visual selection                         |
| `>`, `<`   | indent or dedent a range or object                          |
| `>>`, `<<` | indent or dedent the current line                           |

See [Vim docs: editing](https://vimdoc.sourceforge.net/htmldoc/editing.html) for more information.

#### Indenting and dedenting

`>` and `<` are operators, so they combine with any supported motion or text object the same way `d` and `y` do:

| Command   | Description                                              |
| --------- | -------------------------------------------------------- |
| `>>`      | indent the current line                                  |
| `<<`      | dedent the current line                                  |
| `>j`      | indent the current line and the line below               |
| `>ap`     | indent the current paragraph                             |
| `3>>`     | indent the current line and the two below it             |
| `>` / `<` | indent or dedent the selection in visual or visual line mode |

In visual mode, `>` and `<` shift the selected lines and return to Normal mode.

See [Vim docs: shifting text](https://vimdoc.sourceforge.net/htmldoc/change.html#%3E) for more information.

#### Text objects

| Command(s)       | Description                                |
| ---------------- | ------------------------------------------ |
| `i`              | inner (exclude delimiters in text object)  |
| `a`              | around (include delimiters in text object) |
| `w`, `W`         | whitespace-delimited string (word)         |
| `"`, `'`, \`\`\` | quote-delimited string                     |
| `(`, `{`, `[`    | parenthesized/bracketed string             |
| `l`              | current line without leading/trailing whitespace (`il`); entire buffer (`al`) |

See [Vim docs: text objects](https://vimdoc.sourceforge.net/htmldoc/motion.html#text-objects) for more information.

### Search

#### Character search

| Command(s)         | Description                                            |
| ------------------ | ------------------------------------------------------ |
| `t`, `T`, `f`, `F` | find next/prev matching character on line              |
| `;`                | repeat last character search in the same direction     |
| `,`                | repeat last character search in the opposite direction |

See [Vim docs: left-right motions](https://vimdoc.sourceforge.net/htmldoc/motion.html#f) for more information.

#### General search

Unlike Vim, general search commands don't search within the buffer. Instead, they open Warp's native command search.

| Command(s)         | Description              |
| ------------------ | ------------------------ |
| `/`, `?`, `*`, `#` | open Warp command search |

### Mode switching

| Command(s) | Description                                                       |
| ---------- | ----------------------------------------------------------------- |
| `i`        | insert text before the cursor                                     |
| `I`        | insert text before the first non-whitespace character in the line |
| `a`        | append text after the cursor                                      |
| `A`        | append text at the end of the line                                |
| `o`        | begin new line below the cursor and insert text                   |
| `O`        | begin new line above the cursor and insert text                   |
| `v`        | visual character mode                                             |
| `V`        | visual line mode                                                  |

See [Vim docs: insert](https://vimdoc.sourceforge.net/htmldoc/insert.html#insert) and [Vim docs: visual mode](https://vimdoc.sourceforge.net/htmldoc/visual.html#visual-mode) for more information.

### Registers

| Command(s) | Description     |
| ---------- | --------------- |
| `"`        | register prefix |

Warp currently supports the following registers:

| Register name    | Description                                                      |
| ---------------- | ---------------------------------------------------------------- |
| `a`–`z`, `A`–`Z` | named registers                                                  |
| `+`              | system clipboard                                                 |
| `*`              | system clipboard                                                 |
| `"`              | unnamed register, containing the text of the last delete or yank |

See [Vim docs: registers](https://vimdoc.sourceforge.net/htmldoc/change.html#registers) for more information.

## Feedback

The best way to report bugs and request features is through Warp's [GitHub Issues](https://github.com/warpdotdev/Warp/issues) page. Note that the issue or request is for Vim keybindings.
