wezterm icon indicating copy to clipboard operation
wezterm copied to clipboard

feat: add opt-in cursor trail / smear effect (the last thing keeping many users on Kitty)

Open y-tretyakov opened this issue 1 month ago • 6 comments

Feature request: opt-in cursor trail / motion smear effect

Dear @wez and the WezTerm team,

I've been trying to fully switch to WezTerm from Kitty for literally years.
Every single time I set it up perfectly, fall in love with the Lua config, the multiplexing, the performance, the fonts, the everything… and then after 2–3 days I crawl back to Kitty with tears in my eyes.

The only reason — literally the one and only missing feature — is the cursor trail/smear effect that Kitty added recently (and that Neovide had forever).

I completely understand and respect that you personally find cursor animations distracting (you mentioned it in https://github.com/wez/wezterm/discussions/1136). But for a surprising number of us this tiny visual cue is not a gimmick — it's a real productivity and comfort feature:

  • When pairing, teaching, or streaming, viewers can instantly see where the cursor jumped
  • On high-DPI / large / ultrawide monitors it's way easier to track fast hjkl, mouse movements, or Ctrl-f/Ctrl-b jumps
  • It simply feels smoother and more responsive when typing or navigating shell output

This is the single remaining excuse many of us have for not making WezTerm our permanent daily driver. Everything else is already objectively better.

Existing related issues (so you see we're not alone):

  • #6492 — Possibility for adding cursor trail in Wezterm?
  • #6529 — cursor animations
  • https://github.com/wez/wezterm/discussions/1136 — old discussion where the topic was dismissed

Proposed solution (as minimal as possible):

Even a simple opt-in option would make hundreds (maybe thousands) of people switch instantly and never look back:

-- wezterm.lua
config.enable_cursor_trail = true        -- false by default, respects your taste!
config.cursor_trail_duration = 0.3       -- seconds, optional
config.cursor_trail_opacity = 0.5        -- optional

Or even just config.cursor_trail = true with hard-coded sane defaults.

It could be disabled by default, hidden behind unstable_features = true, or whatever — just give us the choice.

Please, please consider adding this one tiny feature. It would finally remove the very last reason for many of us to keep Kitty installed. I (and many others silently watching these issues) would be eternally grateful and would evangelize WezTerm even harder than we already do.

Thank you for creating what is already the best terminal on the planet.
This one little thing would make it undeniably perfect for everyone.

With hope and a lot of emotion,
a very sad almost-full-time WezTerm user who just wants to come home 🥲

y-tretyakov avatar Nov 19 '25 00:11 y-tretyakov

Technical implementation sketch (for anyone curious or willing to take a stab at a PR)

Just to show it’s actually pretty lightweight — here’s a realistic minimal approach:

  1. Track last cursor position (already available via events and window:get_cursor_position()).

  2. When the cursor moves > N cells or faster than X ms, trigger a short-lived trail state in the frontend (Rust).

  3. In the existing high-FPS render loop (already used for blinking and animations):

    • Linearly (or eased) interpolate between old → new position over cursor_trail_duration.
    • Draw 1–3 semi-transparent ghost cursors (same shape as the real one) with fading alpha.
  4. Config (100 % opt-in, disabled by default):

    config.cursor_trail = true                  -- false by default, respects your taste!
    config.cursor_trail_duration = 0.35        -- seconds
    config.cursor_trail_opacity = 0.6           -- start opacity of the trail
    config.cursor_trail_min_distance = 4       -- only trigger on noticeable jumps
    
  5. Performance: adding a few extra textured quads with alpha is negligible on the already GPU-accelerated renderer.

No shaders, no particle systems — literally just reusing the exact same code that draws the normal cursor, a couple extra times per frame for ~300 ms.

Happy to draft a proper PR if you give even a tiny “go ahead, I don’t hate the idea” signal @wez 🙏

y-tretyakov avatar Nov 19 '25 01:11 y-tretyakov

This would be a welcome feature. I realize that some people don’t like trails but I think if they’re off by default that’s a good compromise.

baroldgene avatar Nov 19 '25 04:11 baroldgene

working on a PR for this. hope to have a draft up today/tomorrow.

Edit 11-25: still ongoing, feature code complete, but tightening up the integration

https://github.com/user-attachments/assets/e6f093fe-add3-4d91-ad2f-748f8f07d7bc

flowchartsman avatar Nov 19 '25 21:11 flowchartsman

@flowchartsman is the code for the demo shared above available anywhere at the moment?

ced4rtree avatar Dec 01 '25 21:12 ced4rtree

@flowchartsman is the code for the demo shared above available anywhere at the moment?

I have a draft pr up now after some cleanup and refactoring. Initial sketch was pretty verbose, and I still need to do some cleanup, esp WRT defaults, ~but also planning to refactor the interpolation into the quad type, and hopefully transport most logic out of pane.rs~. Feedback most welcome as my rust is... rusty.

flowchartsman avatar Dec 07 '25 22:12 flowchartsman

What a christmas present you got us here, @flowchartsman ! ♥️

gorillamoe avatar Dec 08 '25 06:12 gorillamoe