Hi,

2013/10/02 Wed 19:52:29 UTC+9 Bram Moolenaar wrote:
> Ken Takata wrote:
> 
> > Hi,
> > 
> > Sometimes (maybe when scrolling occurs) undo messages like
> > "2 fewer lines: before #79  7 seconds ago" are not shown.
> > (Vim 7.4.041 on Windows, 7.3.429 on Linux)
> > 
> > E.g.
> > 
> > 1. $ gvim -N -u NONE -U NONE
> > 2. Input a line: `ifoo<CR><Esc>`.
> > 3. Repeat it more than 25 times (= more than the screen lines) using `.`.
> > 4. Go to the first line using `gg`, then undo by using `u`.
> >    Undo message will not be shown.
> > 5. Repeat `ggu` several times.
> >    Undo message will be shown if the file lines becomes fewer than the 
> > screen
> >    lines.
> > 
> > Attached patch seems to fix this, but I'm not sure this is the best way.
> 
> No, this forces a redraw of the whole screen.  It works because instead
> of deleting lines, which causes the message to scroll up and be cleared,
> it overwrites the screen.
> 
> It's better to find a way to fill keep_msg.  Unfortunately there is no
> asy way to call smsg() and have msg_attr_keep() called with "keep" set
> to TRUE.  A global variable would be the easyest, but it's ugly.

Then I think it's better to add a new function smsg_attr_keep().
Please check the attached patch.

BTW, Yukihiro Nakadaira found an easier way to reproduce the problem:

$ vim -u NONE -N
Ofoo<Esc>..uuu

Now we don't need to repeat `.` 25 times ;-)

Regards,
Ken Takata

-- 
-- 
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 vim_dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
# HG changeset patch
# Parent e182ca7f57a0e48d8b3d85a143b8cee04505d476

diff --git a/src/message.c b/src/message.c
--- a/src/message.c
+++ b/src/message.c
@@ -339,8 +339,8 @@
 
 /*
  * Automatic prototype generation does not understand this function.
- * Note: Caller of smgs() and smsg_attr() must check the resulting string is
- * shorter than IOSIZE!!!
+ * Note: Caller of smgs(), smsg_attr() and smsg_attr_keep() must check the
+ * resulting string is shorter than IOSIZE!!!
  */
 #ifndef PROTO
 # ifndef HAVE_STDARG_H
@@ -357,6 +357,12 @@
 #endif
 smsg_attr __ARGS((int, char_u *, long, long, long,
 			long, long, long, long, long, long, long));
+int
+#ifdef __BORLANDC__
+_RTLENTRYF
+#endif
+smsg_attr_keep __ARGS((int, int, char_u *, long, long, long,
+			long, long, long, long, long, long, long));
 
 int vim_snprintf __ARGS((char *, size_t, char *, long, long, long,
 				   long, long, long, long, long, long, long));
@@ -389,9 +395,24 @@
     char_u	*s;
     long	a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
 {
+    return smsg_attr_keep(0, FALSE, s,
+				     a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
+}
+
+/* VARARGS */
+    int
+#ifdef __BORLANDC__
+_RTLENTRYF
+#endif
+smsg_attr_keep(attr, keep, s, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
+    int		attr;
+    int		keep;
+    char_u	*s;
+    long	a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
+{
     vim_snprintf((char *)IObuff, IOSIZE, (char *)s,
 				     a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
-    return msg_attr(IObuff, attr);
+    return msg_attr_keep(IObuff, attr, keep);
 }
 
 # else /* HAVE_STDARG_H */
@@ -426,6 +447,20 @@
     return msg_attr(IObuff, attr);
 }
 
+    int
+#ifdef __BORLANDC__
+_RTLENTRYF
+#endif
+smsg_attr_keep(int attr, int keep, char_u *s, ...)
+{
+    va_list arglist;
+
+    va_start(arglist, s);
+    vim_vsnprintf((char *)IObuff, IOSIZE, (char *)s, arglist, NULL);
+    va_end(arglist);
+    return msg_attr_keep(IObuff, attr, keep);
+}
+
 # endif /* HAVE_STDARG_H */
 #endif
 
diff --git a/src/proto.h b/src/proto.h
--- a/src/proto.h
+++ b/src/proto.h
@@ -120,6 +120,12 @@
 #  ifdef __BORLANDC__
 _RTLENTRYF
 #  endif
+smsg_attr_keep __ARGS((int, int, char_u *, ...));
+
+int
+#  ifdef __BORLANDC__
+_RTLENTRYF
+#  endif
 vim_snprintf_add __ARGS((char *, size_t, char *, ...));
 
 int
diff --git a/src/undo.c b/src/undo.c
--- a/src/undo.c
+++ b/src/undo.c
@@ -2729,7 +2729,7 @@
     }
 #endif
 
-    smsg((char_u *)_("%ld %s; %s #%ld  %s"),
+    smsg_attr_keep(0, TRUE, (char_u *)_("%ld %s; %s #%ld  %s"),
 	    u_oldcount < 0 ? -u_oldcount : u_oldcount,
 	    _(msgstr),
 	    did_undo ? _("before") : _("after"),

Raspunde prin e-mail lui