Skip to content
| Marketplace
Sign in
Visual Studio Code>Visualization>Smear Cursor for Visual Studio CodeNew to Visual Studio Code? Get it now.
Smear Cursor for Visual Studio Code

Smear Cursor for Visual Studio Code

davellen

|
2 installs
| (0) | Free
sphamba's smear-cursor.nvim ported to Visual Studio Code: animate the cursor with a smear effect.
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info
Smear Cursor icon

Smear Cursor for Visual Studio Code

Animate the cursor with a smear effect.
A faithful Visual Studio Code port of smear-cursor.nvim by sphamba.

Install Smear Cursor

VS Code Marketplace   VS Code 1.85 or newer   Build status   GPL-3.0 License

VS Code Marketplace installs   Open VSX downloads

Smear cursor demo

Features

  • Smear animation driven by the same spring physics as smear-cursor.nvim
  • Every smear-cursor.nvim option that makes sense in VS Code, with the same names and defaults
  • Vector rendering: smooth edges, a continuous gradient and sub-character particles, where the Neovim plugin has to approximate with block characters
  • Follows the theme's cursor color, or any color you pick
  • Follows the cursor style, including mode changes made by VSCodeVim and VSCode Neovim
  • Optional particles, for when a smear is not enough

🔥 Fire hazard

Show demo

Fire hazard preset


Installation

From the Marketplace:

  1. Open the Extensions view in VS Code (Ctrl+Shift+X / Cmd+Shift+X)
  2. Search for Smear Cursor for Visual Studio Code
  3. Click Install

Or via Quick Open:

Launch Quick Open (Ctrl+P / Cmd+P), paste the command below, and press Enter:

ext install davellen.smear-cursor-vscode

The smear starts right away. The commands Smear Cursor: Toggle, Smear Cursor: Enable and Smear Cursor: Disable switch it on and off.

[!TIP] The smear looks closest to Neovim with a block cursor: "editor.cursorStyle": "block".

Configuration

All settings live under smearCursor.* and map one-to-one to the smear-cursor.nvim options (snake_case becomes camelCase). Search for Smear Cursor in the Settings UI to browse them with descriptions and ranges.

Faster smear
{
  "smearCursor.stiffness": 0.8,                   // default 0.6   [0, 1]
  "smearCursor.trailingStiffness": 0.6,           // default 0.45  [0, 1]
  "smearCursor.stiffnessInsertMode": 0.7,         // default 0.5   [0, 1]
  "smearCursor.trailingStiffnessInsertMode": 0.7, // default 0.5   [0, 1]
  "smearCursor.damping": 0.95,                    // default 0.85  [0, 1]
  "smearCursor.dampingInsertMode": 0.95,          // default 0.9   [0, 1]
  "smearCursor.distanceStopAnimating": 0.5        // default 0.1   > 0
}

Lower damping (e.g. 0.65) makes the smear bouncier: it overshoots the target.

Smooth cursor without smear
{
  "smearCursor.stiffness": 0.5,
  "smearCursor.trailingStiffness": 0.5
}
🔥 Fire hazard
{
  "smearCursor.cursorColor": "#ff4000",
  "smearCursor.particlesEnabled": true,
  "smearCursor.stiffness": 0.5,
  "smearCursor.trailingStiffness": 0.2,
  "smearCursor.trailingExponent": 5,
  "smearCursor.damping": 0.6,
  "smearCursor.gradientExponent": 0,
  "smearCursor.neverDrawOverTarget": true,
  "smearCursor.particleSpread": 1,
  "smearCursor.particlesPerSecond": 500,
  "smearCursor.particlesPerLength": 50,
  "smearCursor.particleMaxLifetime": 800,
  "smearCursor.particleMaxInitialVelocity": 20,
  "smearCursor.particleVelocityFromCursor": 0.5,
  "smearCursor.particleDamping": 0.15,
  "smearCursor.particleGravity": -50,
  "smearCursor.minDistanceEmitParticles": 0
}

Colors

smearCursor.cursorColor accepts:

  • empty (default): the theme's editorCursor.foreground, which follows theme changes
  • a CSS color: #d3cdc3, rgb(211 205 195), orange
  • a theme color id: terminal.ansiRed, editorError.foreground
  • none: the color of the text under the cursor

smearCursor.cursorColorInsertMode does the same for insert mode and falls back to cursorColor.

Vim modes

With VSCodeVim or VSCode Neovim installed, the cursor style tells the extension the current mode: a block cursor means normal, a line means insert, an underline means replace. Insert mode then uses the *InsertMode parameters, and smearInsertMode / smearReplaceMode apply, as in Neovim. smearCursor.modeDetection controls this.

Differences from smear-cursor.nvim

smear-cursor.nvim VS Code
vertical_bar_cursor*, horizontal_bar_cursor_replace_mode cursorShape, which follows the editor cursor style by default
smear_between_buffers smearBetweenEditors: only within the same editor group, because the extension API has no screen coordinates across groups
filetypes_disabled disabledLanguages (language ids)
distance_stop_animating_vertical_bar defaults to 0.1 instead of 0.875, because thin bars are drawn exactly
legacy_computing_symbols_support*, use_diagonal_blocks, max_slope_*, min_slope_vertical, max_angle_difference_diagonal, max_offset_diagonal, min_shade_no_diagonal*, max_shade_no_matrix, matrix_pixel_*, color_levels, gamma, cterm_*, particle_switch_octant_braille not needed: they tune the rasterization into characters
max_kept_windows, windows_zindex, hide_target_hack, transparent_bg_fallback_color not needed: they work around terminal rendering
smear_to_cmd, smear_terminal_mode, delay_after_key, delay_disable, particles_over_text not applicable

How it works

The extension API cannot draw over the editor. The smear is the ::before pseudo-element of a text decoration on the cursor cell, absolutely positioned over the smear's bounding box. An SVG mask, regenerated every frame, cuts out the exact smear shape, gradient and particles. The color is a plain background, so theme colors work.

Known limitations:

  • The real cursor stays visible: extensions cannot hide it
  • With word wrap, smears across wrapped lines are misplaced vertically
  • Only the primary cursor is animated
  • Wide characters (CJK, some emoji) count as one column

Development

npm install
npm test          # compile and run the unit tests
npm run package   # build a .vsix

Press F5 in VS Code to launch an Extension Development Host with the extension loaded. Every push to main and every pull request builds the .vsix on GitHub Actions. Releases are automatic and follow Conventional Commits: on main, a feat: commit releases a new minor version, fix: or perf: a patch, and a breaking change (feat!: or a BREAKING CHANGE: footer) a major one, with the .vsix attached to the GitHub release. Other types (chore:, docs:, ci:…) do not release. Versions come from the git tags, so package.json needs no manual bump.

File Role
src/physics.ts Smear dynamics, ported from animation.lua, with no VS Code dependency
src/scene.ts Turns a frame into the SVG mask and CSS
src/renderer.ts Draws a scene as a decoration
src/controller.ts Tracks the cursor, decides when to smear, runs the frame loop
src/editor.ts Editor metrics, cursor shape and mode detection
src/config.ts Settings, whose defaults live in package.json

Credits

This extension is a port of the original Neovim plugin created by sphamba:

🔗 smear-cursor.nvim on GitHub

The animation code is translated from smear-cursor.nvim, so this extension is released under the same GPL-3.0 license. All credit for the idea and the physics goes to the original author. This extension simply brings that experience to VS Code.

If you enjoy Smear Cursor, consider leaving a ⭐ on the original GitHub repo of smear-cursor.nvim
  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft