Subject: Re: bug#77438: [FEATURE REQUEST] Freely positioning the cursor anywhere in the buffer (Vim’s virtualedit=all Equivalent in Emacs)

From: James Cherti <[email-masked]>
Date: Wed, 2 Apr 2025 09:02:04 -0400

Hello Eli,

On 2025-04-02 07:39, Eli Zaretskii wrote:
>> Date: Tue, 1 Apr 2025 16:02:39 -0400
>> From: James Cherti <[email-masked]>
>>
>> Implementing an Emacs equivalent of Vim's `set virtualedit=all`
>> feature would be interesting, especially for editing
>> indentation-sensitive file types like YAML or Python.
>>
>> In Vim, the `set virtualedit=all` setting allows the cursor to move
>> freely to any position in the text, even beyond the end of lines and
>> after the last line of the file. This differs from the default
>> behavior, where the cursor is constrained to valid text positions.
>>
>> Unlike Vim's `virtualedit=all` mode, Emacs' quarter-plane,
>> picture-mode, and artist-mode packages insert actual spaces into the
>> buffer. In contrast, Vim’s `set virtualedit=all` allows the cursor to
>> be placed in positions where no text exists, but real spaces are not
>> added until a character is typed.
>>
>> This distinction is important because, in `virtualedit=all`, the
>> absence of real spaces ensures that the undo/redo history remains
>> unaffected by cursor movements alone.
> 
> Can't one do this using overlays instead of inserting spaces?

I previously attempted to implement this behavior using overlays, but
I encountered an issue: when adding virtual spaces with overlays,
Emacs still treated all the added spaces as a single space for
movement and alignment purposes. This made precise cursor positioning
difficult, as the cursor did not behave as expected when navigating or
attempting to place text at arbitrary positions.

> But eventually, you'd need to insert spaces, if you actually type
> something wherever you move cursor.  So maybe an easier way is to use
> picture-mode after forcing undo to not record some commands for a
> period.  (Not that I understand why not touching the undo history is
> such a big deal.)

One of the purposes of this bug report is to explore the possibility
of implementing a feature in Emacs that allows positioning the cursor
anywhere within the buffer. This would benefit not only modes like
picture-mode, but also indentation-sensitive modes such as Python
and YAML.

Not recording cursor movement in the undo history is advantageous
because it prevents unnecessary undo entries from being created. This
helps keep the undo tree clean and ensures that reverting meaningful
edits remains efficient and straightforward.

For example:
- Modify line 10 (change 1).
- Move the cursor down 10 times.
- Modify line 21 (change 2).

If undo records every cursor movement due to spaces being added
multiple times, reverting to "change 1" would require 12 undo
steps instead of just two, making the process inefficient.

--
James Cherti
GitHub: https://github.com/jamescherti
Website: https://www.jamescherti.com/