Hi Dmytro! On Di, 04 Aug 2015, Dmytro Konstantinov wrote:
> Hi Christian! > > Thanks for getting back to me! > > On Tuesday, August 4, 2015 at 6:35:55 PM UTC+1, Christian Brabandt wrote: > > > I am nut sure, I understand fully. How do you suggest to change the > > cursor positioning? > > I'm afraid I know neither C nor VIM internals well enough to propose a > solution. What I can do is prepare the groundwork (describe the inconsistent > behaviour, provide the tests) and hope that someone would be willing to pick > it up and suggest a fix. > > Form everything I've read about the expected behaviour for restoring the > cursor positioning (eg: > http://vim.wikia.com/wiki/Restore_the_cursor_position_after_undoing_text_change_made_by_a_script), > the cursor should be restored "closest to where the first change is made". > > However, the inconsistency I found is that two almost identical bits of > vimscript make the editor behave in different ways. > > # Test 1 > > Imagine I have a buffer with two lines. I do `:normal Go` to add a 3rd line > into that buffer, then undo it. The closest place to where the first (and in > this case, the only) change is made is line 2. Thus, the cursor should be > restored to line 2. > > Now, let's complicate things a little. I have the same buffer with two lines. > I do `:normal Go` to add a 3rd line. But this time, instead of `undo`, I do > `:undojoin` and then run a substitute command (in my test I use `:keepjumps > %s/aaaa/zzzz/`). Only then do I do `:undo`. > > As far as positioning of the cursor goes, the above two examples should be > absolutely identical. This is because we've `:undojoined` our substitution > change onto the back of an existing change, which was the addition of the 3rd > line. Thus, the closest place to where the *first* change is made is still > line 2, which is where the cursor should be positioned after the `:undo`. > > This is exactly how my first test behaves, the one marked with [OK]. > > # Test 2 > > My second test, marked with [ERR], displays a different set of behaviour. It > demonstrates that under certain conditions, "closest to where the first > change is made" rule for the cursor positioning is disregarded and instead > the cursor is restored nearest to the first substitution made by the `:s///` > command. This appears to be inconsistent with how the cursor should be > positioned. > > Would anyone be willing to patch this? Well, I can see that this might be a problem, but I currently don't understand the code, that set's the cursor position and therefore am not sure, how to fix the problem. Best, Christian -- Theorie und Erfahrung (Phänomen) stehen gegeneinander in beständigem Konflikt. Alle Vereinigung in der Reflexion ist eine Täuschung; nur durch Handeln können sie vereinigt werden. -- Goethe, Maximen und Reflektionen, Nr. 1099 -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
