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)

Raspunde prin e-mail lui