71 / dance

Make your cursors dance with Kakoune-like modal editing in VS Code.
https://marketplace.visualstudio.com/items?itemName=gregoire.dance
ISC License
437 stars 55 forks source link

Keypresses race #343

Open CosineP opened 1 month ago

CosineP commented 1 month ago

Hi folks -

First of all, I want to thank you all for allowing me to use VSCode! I have long been hopelessly kakoune-pilled, and when I last tried VSCode there was no useful kakoune extension, so this is a huge win.

Here is the problem I am having: if my laptop gets below 20% (and tlp throttles my CPU), when I issue a bunch of commands they will occur in a fairly random order. The result is that I have to wait for the editor to respond after each keypress before I can press the next one if I want a consistent result.

Here's an easy way to reproduce: put your cursor at the beginning of a long line. Hold "e". If your cursor repeat is fast enough and your computer isn't a supercomputer, then your cursor jumps around to various ends of words, ending up at the end of a random word. (This happens to me even at full charge.)

If you allow me to bloviate for a moment, I can only assume this is because the handler for each keypress is issued asynchronously, but the effects are not await-ed before the next keypress is handled.

This is breaking for me when my laptop is under 20%, but over 20% usually the keypresses issue quickly enough to not matter. Current workaround is keep my laptop charged, because I really like this extension, but I still see races sometimes when I type really quickly. Fixing this would also allow dance to work on less powerful machines.

sgraf812 commented 1 month ago

I'm seeing the same, but on my desktop machine as well, so I would not say it's related to "less powerful" machines.

For me, a good reproducer is opening a file and keep pressing j. As soon as the cursor hits the bottom line of the viewport, scrolling slows down and the cursor jumps around in circles due to the race condition. It's quite annoying.

sgraf812 commented 1 month ago

If I'm not mistaken, this code currently implements j:

https://github.com/71/dance/blob/7bf14636eac5422dd22af9964c2555ee8d3e4ef6/src/commands/select.ts#L318-L327

Perhaps it would be better to maintain a globally coherent array of selections that is asynchronously updated with diffs. I think that's what VSCodeVim does. At least they are using cursorMove commands to update the cursor position with a diff rather than with an updated position:

https://github.com/VSCodeVim/Vim/blob/33ac373dde7d14260d0ac1133bf1ba25a39dd556/src/actions/motion.ts#L85