On Tue, 11 Apr 2006 09:39:05 -0400
Benji Fisher <[EMAIL PROTECTED]> wrote:

> On Tue, Apr 11, 2006 at 01:06:11PM +0200, Christoph Nodes wrote:
> > > >
> > > > Is there a way to avoid that the changes a specific command makes
> > > > are added to the undo history. I am missing something like
> > > > histdel("undo", -1).  "Set undolevels = -1" is no choice since I
> > > > don't want to lose the changes I made before.
> > 
> > The reason for my question is our way of handling the
> > "Gtk-Utf-8-String-problem": Gtk-2.0 functions take UTF-8-encoded
> > strings as arguments. For constant strings coded into the source code
> > this can be a problem if you use characters not included in the ascii
> > character set and you don't want to have UTF-8-encoded source files.
> > Our way is to let vim do the encoding and call a vim function on every
> > BufReadPost and BufWritePre event that uses iconv() to convert these 
> > constant
> > strings. These changes however, are changes that we don't want to undo/redo.
> > 
> > Christoph
> 
>      If you are using vim 7.0 (still in beta testing), then you may be
> able to accomplish what you want with :undojoin .
> 
> :help :undojoin
> 
> HTH                                   --Benji Fisher

Thanks for your hint but this is still not quite what I want. It looks like as 
it
is not possible to erase an undo history entry.

I was wondering if there is somebody here who could have a look at the patch I 
wrote
for the vim-70d version that introduces the :undodelete command. It seems to 
work but
it is sparely tested. Maybe I am overseeing something important ...

Thanks in advance

> cat vim70d-undelete-patch

diff -u -r vim70d/src/proto/undo.pro vim70d-undodelete/src/proto/undo.pro
--- vim70d/src/proto/undo.pro   2006-04-10 14:22:47.000000000 +0200
+++ vim70d-undodelete/src/proto/undo.pro        2006-04-12 13:05:00.000000000 
+0200
@@ -9,6 +9,7 @@
 extern void undo_time __ARGS((long step, int sec, int absolute));
 extern void u_sync __ARGS((int force));
 extern void ex_undolist __ARGS((exarg_T *eap));
+extern void ex_undodelete __ARGS((exarg_T *eap));
 extern void ex_undojoin __ARGS((exarg_T *eap));
 extern void u_unchanged __ARGS((buf_T *buf));
 extern void u_clearall __ARGS((buf_T *buf));
diff -u -r vim70d/src/undo.c vim70d-undodelete/src/undo.c
--- vim70d/src/undo.c   2006-04-10 12:01:29.000000000 +0200
+++ vim70d-undodelete/src/undo.c        2006-04-12 19:21:12.000000000 +0200
@@ -1398,6 +1398,30 @@
 }

 /*
+ * ":undodelete": delete the last undo block
+ */
+/*ARGSUSED*/
+    void
+ex_undodelete(eap)
+    exarg_T *eap;
+{
+    if (curbuf->b_u_newhead == NULL)
+       return;
+    if (p_ul < 0)
+       return;             /* no entries, nothing to do */
+    else
+    {
+       u_header_T *uhfree = curbuf->b_u_newhead;
+       u_header_T *curhead = curbuf->b_u_curhead;
+
+       if (!curbuf->b_u_synced)
+               u_sync(TRUE);
+       if (uhfree->uh_alt_next == NULL)
+               u_freeheader(curbuf, uhfree, &curhead);
+    }
+}
+
+/*
  * ":undojoin": continue adding to the last entry list
  */
 /*ARGSUSED*/


Reply via email to