On Mi, 22 Mai 2013, [email protected] wrote:
> Status: New
> Owner: ----
> Labels: Type-Defect Priority-Medium
>
> New issue 134 by [email protected]: Pasting over visually selected
> line of new buffer not correctly undoable
> http://code.google.com/p/vim/issues/detail?id=134
>
> Steps to reproduce:
> 1. vim -u NONE -N
> 2. ifoo<ESC>yy
> 3. :ene!
> 4. Vp
> 5. u
> 6. :set modified?
>
> Expected:
> The buffer should be empty after undoing the paste over the visually
> selected line.
>
> Instead:
> The buffer retains the last line of what was pasted, even though the
> modified state is set to nomodified. No further undo is possible.
>
> Version/OS tested:
> 1. VIM - Vi IMproved 7.3, 1-905, NetBSD
> 2. VIM - Vi IMproved 7.3, 1-762, Cygwin
> 3. VIM - Vi IMproved 7.3, 1-46, MS-Windows 32-bit GUI
This seems to be an issue with saving enough lines for undo. This
usually happens before putting by calling op_delete(). Unfortunately,
undo isn't stored for new empty buffers. In theory, op_put should also
store undo information, however it seems to me, that it never ever
stores any information for line wise putting (since the computed size of
the range in u_savecommon() will always be zero). However, the attached
patch fixes it (at least for the case of putting into an empty buffer).
regards,
Christian
--
Es lohnt sich nicht, sich an einen Strohhut zu klammern.
-- Heinz Erhardt
--
--
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/groups/opt_out.
diff --git a/src/ops.c b/src/ops.c
--- a/src/ops.c
+++ b/src/ops.c
@@ -3497,7 +3497,8 @@
#endif
if (dir == FORWARD)
++lnum;
- if (u_save(lnum - 1, lnum) == FAIL)
+ /* save at least a single line, even for empty buffers */
+ if (u_save(lnum - 1, lnum + (curwin->w_buffer->b_ml.ml_line_count == 1 ? 1 : 0)) == FAIL)
goto end;
#ifdef FEAT_FOLDING
if (dir == FORWARD)