VulCode

vscode-neovim: our changes to an open source project

Vim mode for VS Code where the editing is done by a real Neovim.

All contributions
Language
TypeScript
GitHub stars
7,753
1merged change
Merged on 23 September 2026.
Number 23 of the 64 GitHub projects with our changes, by stars. First is Zed (91,587).

The change merged into vscode-neovim

Visual mode selections no longer cut emoji and other characters outside the Unicode BMP in half.

How we tested it

We added three integration tests: a selection over one character outside the BMP, over two of them in a row, and over a mix of ordinary multi-byte characters and characters outside the BMP. We could not run the integration suite locally and said so in the pull request, so the project's CI was its first run.

TypeScript, React and Node

Our projects in this technology, their screens and when we choose it.

The bug, the fix and the lesson

A summary of our Tech news write-up: what was broken, what we changed and what it means for our own work.

What was broken

A selection split an emoji in half

In visual mode the code added one UTF-16 unit to the end of the selection. A character outside the BMP takes two, so the selection ended halfway through a surrogate pair.

What we changed

A step over the whole character

The code first moves the end of the selection past the whole character in bytes, and only then converts the column to UTF-16.

What it taught us

JavaScript measures strings in UTF-16 units, and an emoji takes two.

Every cursor offset has to be counted in characters, not units.

Other projects with our changes: TypeScript, React and Node

5 projects in this technology have our merged changes. The bar is the repository's stars, next to it the number of our changes. Each row leads to the project's page.

Questions about our changes to vscode-neovim

Where these changes come from, who merged them and whether we can fix something in your library.

Using vscode-neovim in your project?

If something in it does not work, we fix it at the source and leave a workaround until the release. We reply within an hour.