Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/replit/codemirror-vim

Vim keybindings for CM6
https://github.com/replit/codemirror-vim

codemirror codemirror-6 editor vim

Last synced: 5 days ago
JSON representation

Vim keybindings for CM6

Awesome Lists containing this project

README

        

# Vim keybindings for CM6

Run on Replit badge
NPM version badge

## Installation

```sh
npm i @replit/codemirror-vim
```

## Usage

```js
import { basicSetup, EditorView } from 'codemirror';
import { vim } from "@replit/codemirror-vim"

let view = new EditorView({
doc: "",
extensions: [
// make sure vim is included before other keymaps
vim(),
// include the default keymap and all other keymaps you want to use in insert mode
basicSetup,
],
parent: document.querySelector('#editor'),
})
```
> **Note**:
> if you are not using `basicSetup`, make sure you include the [drawSelection](https://codemirror.net/docs/ref/#view.drawSelection) plugin to correctly render the selection in visual mode.

## Usage of cm5 vim extension api

The same api that could be used in previous version of codemirror https://codemirror.net/doc/manual.html#vimapi, can be used with this plugin too, just replace the old editor instance with `view.cm` in your code

```js
import {Vim, getCM} from "@replit/codemirror-vim"

let cm = getCM(view)
// use cm to access the old cm5 api
Vim.exitInsertMode(cm)
Vim.handleKey(cm, "")
```

### Define additional ex commands
```js
Vim.defineEx('write', 'w', function() {
// save the file
});
```

### Map keys
```js
Vim.map("jj", "", "insert"); // in insert mode
Vim.map("Y", "y$"); // in normal mode
```

### Unmap keys

```js
Vim.unmap("jj", "insert");
```

### Add custom key

```js
defaultKeymap.push({ keys: 'gq', type: 'operator', operator: 'hardWrap' });
Vim.defineOperator("hardWrap", function(cm, operatorArgs, ranges, oldAnchor, newHead) {
// make changes and return new cursor position
});
```