updated for version 7.0d03
diff --git a/src/diff.c b/src/diff.c
index bc0364c..4896c04 100644
--- a/src/diff.c
+++ b/src/diff.c
@@ -839,7 +839,13 @@
 		    (diff_flags & DIFF_ICASE) ? "-i " : "",
 		    tmp_orig, tmp_new);
 	    append_redir(cmd, p_srr, tmp_diff);
+#ifdef FEAT_AUTOCMD
+	    ++autocmd_block;	/* Avoid ShellCmdPost stuff */
+#endif
 	    (void)call_shell(cmd, SHELL_FILTER|SHELL_SILENT|SHELL_DOOUT);
+#ifdef FEAT_AUTOCMD
+	    --autocmd_block;
+#endif
 	    vim_free(cmd);
 	}
     }
@@ -942,7 +948,13 @@
 		fullname != NULL ? fullname :
 # endif
 		eap->arg);
+#ifdef FEAT_AUTOCMD
+	++autocmd_block;	/* Avoid ShellCmdPost stuff */
+#endif
 	(void)call_shell(buf, SHELL_FILTER | SHELL_COOKED);
+#ifdef FEAT_AUTOCMD
+	--autocmd_block;
+#endif
     }
 
 #ifdef UNIX
diff --git a/src/edit.c b/src/edit.c
index f2a5cda..a57787a 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -8494,6 +8494,16 @@
     pos_T	tpos;
 
     undisplay_dollar();
+
+#ifdef FEAT_WINDOWS
+    if (mod_mask & MOD_MASK_CTRL)
+    {
+	/* <C-PageUp>: tab page back */
+	goto_tabpage(-1);
+	return;
+    }
+#endif
+
     tpos = curwin->w_cursor;
     if (onepage(BACKWARD, 1L) == OK)
     {
@@ -8543,6 +8553,16 @@
     pos_T	tpos;
 
     undisplay_dollar();
+
+#ifdef FEAT_WINDOWS
+    if (mod_mask & MOD_MASK_CTRL)
+    {
+	/* <C-PageDown>: tab page forward */
+	goto_tabpage(0);
+	return;
+    }
+#endif
+
     tpos = curwin->w_cursor;
     if (onepage(FORWARD, 1L) == OK)
     {
diff --git a/src/ex_getln.c b/src/ex_getln.c
index e4a1c99..11069f2 100644
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -4444,8 +4444,9 @@
 	}
     }
 
-    /* Sort the results. */
-    sort_strings(*file, *num_file);
+    /* Sort the results.  Keep menu's in the specified order. */
+    if (xp->xp_context != EXPAND_MENUNAMES && xp->xp_context != EXPAND_MENUS)
+	sort_strings(*file, *num_file);
 
     return OK;
 }
diff --git a/src/misc1.c b/src/misc1.c
index c8d0000..905df15 100644
--- a/src/misc1.c
+++ b/src/misc1.c
@@ -3085,6 +3085,7 @@
 		    mch_memmove(buf, buf + 3, (size_t)len);
 		continue;
 	    }
+	    break;
 	}
 #ifdef FEAT_MBYTE
 	if (has_mbyte)
@@ -4771,6 +4772,7 @@
 static int	cin_iswhileofdo __ARGS((char_u *, linenr_T, int));
 static int	cin_isbreak __ARGS((char_u *));
 static int	cin_is_cpp_baseclass __ARGS((char_u *line, colnr_T *col));
+static int	get_baseclass_amount __ARGS((int col, int ind_maxparen, int ind_maxcomment, int ind_cpp_baseclass));
 static int	cin_ends_in __ARGS((char_u *, char_u *, char_u *));
 static int	cin_skip2pos __ARGS((pos_T *trypos));
 static pos_T	*find_start_brace __ARGS((int));
@@ -5447,7 +5449,8 @@
     return (STRNCMP(p, "break", 5) == 0 && !vim_isIDc(p[5]));
 }
 
-/* Find the position of a C++ base-class declaration or
+/*
+ * Find the position of a C++ base-class declaration or
  * constructor-initialization. eg:
  *
  * class MyClass :
@@ -5462,10 +5465,11 @@
     static int
 cin_is_cpp_baseclass(line, col)
     char_u	*line;
-    colnr_T	*col;
+    colnr_T	*col;	    /* return: column to align with */
 {
     char_u	*s;
     int		class_or_struct, lookfor_ctor_init, cpp_base_class;
+    linenr_T	lnum = curwin->w_cursor.lnum;
 
     *col = 0;
 
@@ -5478,8 +5482,49 @@
 
     cpp_base_class = lookfor_ctor_init = class_or_struct = FALSE;
 
-    while(*s != NUL)
+    /* Search for a line starting with '#', empty, ending in ';' or containing
+     * '{' or '}' and start below it.  This handles the following situations:
+     *	a = cond ?
+     *	      func() :
+     *	           asdf;
+     *	func::foo()
+     *	      : something
+     *	{}
+     *	Foo::Foo (int one, int two)
+     *		: something(4),
+     *		somethingelse(3)
+     *	{}
+     */
+    while (lnum > 1)
     {
+	s = skipwhite(ml_get(lnum - 1));
+	if (*s == '#' || *s == NUL)
+	    break;
+	while (*s != NUL)
+	{
+	    s = cin_skipcomment(s);
+	    if (*s == '{' || *s == '}'
+		    || (*s == ';' && cin_nocode(s + 1)))
+		break;
+	    if (*s != NUL)
+		++s;
+	}
+	if (*s != NUL)
+	    break;
+	--lnum;
+    }
+
+    s = cin_skipcomment(ml_get(lnum));
+    for (;;)
+    {
+	if (*s == NUL)
+	{
+	    if (lnum == curwin->w_cursor.lnum)
+		break;
+	    /* Continue in the cursor line. */
+	    s = cin_skipcomment(ml_get(++lnum));
+	}
+
 	if (s[0] == ':')
 	{
 	    if (s[1] == ':')
@@ -5542,43 +5587,53 @@
 		lookfor_ctor_init = FALSE;
 
 		/* the first statement starts here: lineup with this one... */
-		if (cpp_base_class && *col == 0)
+		if (cpp_base_class)
 		    *col = (colnr_T)(s - line);
 	    }
 
+	    /* When the line ends in a comma don't align with it. */
+	    if (lnum == curwin->w_cursor.lnum && *s == ',' && cin_nocode(s + 1))
+		*col = 0;
+
 	    s = cin_skipcomment(s + 1);
 	}
     }
 
-    if (cpp_base_class && curwin->w_cursor.lnum > 1)
-    {
-	/* Check that there is no '?' in the previous line to catch:
-	 *	a = cond ?
-	 *	      func() :
-	 *	           asdf;
-	 */
-	s = ml_get(curwin->w_cursor.lnum - 1);
-	if (!cin_ispreproc(s))
-	    while (*s != NUL)
-	    {
-		s = cin_skipcomment(s);
-		if (*s == '?')
-		    /* Disable when finding a '?'... */
-		    cpp_base_class = FALSE;
-		else if (*s == ';' && cin_nocode(s + 1))
-		{
-		    /* ...but re-enable when the line ends in ';'. */
-		    cpp_base_class = TRUE;
-		    break;
-		}
-		if (*s != NUL)
-		    ++s;
-	    }
-    }
-
     return cpp_base_class;
 }
 
+    static int
+get_baseclass_amount(col, ind_maxparen, ind_maxcomment, ind_cpp_baseclass)
+    int		col;
+    int		ind_maxparen;
+    int		ind_maxcomment;
+    int		ind_cpp_baseclass;
+{
+    int		amount;
+    colnr_T	vcol;
+    pos_T	*trypos;
+
+    if (col == 0)
+    {
+	amount = get_indent();
+	if (find_last_paren(ml_get_curline(), '(', ')')
+		&& (trypos = find_match_paren(ind_maxparen,
+						     ind_maxcomment)) != NULL)
+	    amount = get_indent_lnum(trypos->lnum); /* XXX */
+	if (!cin_ends_in(ml_get_curline(), (char_u *)",", NULL))
+	    amount += ind_cpp_baseclass;
+    }
+    else
+    {
+	curwin->w_cursor.col = col;
+	getvcol(curwin, &curwin->w_cursor, &vcol, NULL, NULL);
+	amount = (int)vcol;
+    }
+    if (amount < ind_cpp_baseclass)
+	amount = ind_cpp_baseclass;
+    return amount;
+}
+
 /*
  * Return TRUE if string "s" ends with the string "find", possibly followed by
  * white space and comments.  Skip strings and comments.
@@ -6902,22 +6957,17 @@
 			else
 			    amount += ind_continuation;
 		    }
-		    else if (col == 0 || theline[0] == '{')
+		    else if (theline[0] == '{')
 		    {
-			amount = get_indent();
-			if (find_last_paren(l, '(', ')')
-				&& (trypos = find_match_paren(ind_maxparen,
-					ind_maxcomment)) != NULL)
-			    amount = get_indent_lnum(trypos->lnum); /* XXX */
-			if (theline[0] != '{')
-			    amount += ind_cpp_baseclass;
+			/* Need to find start of the declaration. */
+			lookfor = LOOKFOR_UNTERM;
+			ind_continuation = 0;
+			continue;
 		    }
 		    else
-		    {
-			curwin->w_cursor.col = col;
-			getvcol(curwin, &curwin->w_cursor, &col, NULL, NULL);
-			amount = (int)col;
-		    }
+								     /* XXX */
+			amount = get_baseclass_amount(col, ind_maxparen,
+					   ind_maxcomment, ind_cpp_baseclass);
 		    break;
 		}
 		else if (lookfor == LOOKFOR_CPP_BASECLASS)
@@ -6967,7 +7017,8 @@
 		     * If we are looking for ',', we also look for matching
 		     * braces.
 		     */
-		    if (trypos == NULL && find_last_paren(l, '{', '}'))
+		    if (trypos == NULL && terminated == ','
+					      && find_last_paren(l, '{', '}'))
 			trypos = find_start_brace(ind_maxcomment);
 
 		    if (trypos != NULL)
@@ -7490,21 +7541,9 @@
 		}
 		if (n)
 		{
-		    if (col == 0)
-		    {
-			amount = get_indent() + ind_cpp_baseclass;  /* XXX */
-			if (find_last_paren(l, '(', ')')
-				&& (trypos = find_match_paren(ind_maxparen,
-					ind_maxcomment)) != NULL)
-			    amount = get_indent_lnum(trypos->lnum)
-					   + ind_cpp_baseclass;	    /* XXX */
-		    }
-		    else
-		    {
-			curwin->w_cursor.col = col;
-			getvcol(curwin, &curwin->w_cursor, &col, NULL, NULL);
-			amount = (int)col;
-		    }
+								     /* XXX */
+		    amount = get_baseclass_amount(col, ind_maxparen,
+					   ind_maxcomment, ind_cpp_baseclass);
 		    break;
 		}
 
@@ -7604,7 +7643,7 @@
 		 *     bar;
 		 * indent_to_0 here;
 		 */
-		if (cin_ends_in(l, (char_u*)";", NULL))
+		if (cin_ends_in(l, (char_u *)";", NULL))
 		{
 		    l = ml_get(curwin->w_cursor.lnum - 1);
 		    if (cin_ends_in(l, (char_u *)",", NULL)
diff --git a/src/option.c b/src/option.c
index 36cfe03..70f686a 100644
--- a/src/option.c
+++ b/src/option.c
@@ -2066,7 +2066,7 @@
     {"sessionoptions", "ssop", P_STRING|P_VI_DEF|P_COMMA|P_NODUP,
 #ifdef FEAT_SESSION
 			    (char_u *)&p_ssop, PV_NONE,
-	 {(char_u *)"blank,buffers,curdir,folds,help,options,tabpage,winsize",
+	 {(char_u *)"blank,buffers,curdir,folds,help,options,tabpages,winsize",
 							       (char_u *)0L}
 #else
 			    (char_u *)NULL, PV_NONE,
@@ -6458,6 +6458,12 @@
 	if (check_opt_strings(p_fcl, p_fcl_values, TRUE) != OK)
 	    errmsg = e_invarg;
     }
+    /* 'foldignore' */
+    else if (gvarp == &curwin->w_allbuf_opt.wo_fdi)
+    {
+	if (foldmethodIsIndent(curwin))
+	    foldUpdateAll(curwin);
+    }
 #endif
 
 #ifdef FEAT_VIRTUALEDIT
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 50a03a5..d196c86 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -584,20 +584,6 @@
 	for (p = (char *)error_ga.ga_data; *p; ++p)
 	    if (!isspace(*p))
 	    {
-#if 0
-		/* Truncate a very long message, it will go off-screen. */
-		if (STRLEN(p) > 2000)
-		{
-		    char_u	*s = p + 2000 - 14;
-
-#ifdef FEAT_MBYTE
-		    if (has_mbyte)
-			s -= (*mb_head_off)(p, s);
-#endif
-		    STRCPY(s, _("...(truncated)"));
-		}
-#endif
-
 		(void)gui_mch_dialog(
 #ifdef FEAT_GUI
 				     gui.starting ? VIM_INFO :
@@ -608,13 +594,6 @@
 #endif
 					     (char_u *)_("Error"),
 				     p, (char_u *)_("&Ok"), 1, NULL);
-#if 0
-#ifdef WIN3264
-		MessageBox(NULL, p, "Vim", MB_TASKMODAL|MB_SETFOREGROUND);
-#else
-		MessageBox(NULL, p, "Vim", MB_TASKMODAL);
-#endif
-#endif
 		break;
 	    }
 	ga_clear(&error_ga);
diff --git a/src/testdir/test3.in b/src/testdir/test3.in
index 51ad720..8983118 100644
--- a/src/testdir/test3.in
+++ b/src/testdir/test3.in
Binary files differ
diff --git a/src/testdir/test3.ok b/src/testdir/test3.ok
index b197a28..2c7fd17 100644
--- a/src/testdir/test3.ok
+++ b/src/testdir/test3.ok
@@ -618,7 +618,7 @@
 
 Constructor::Constructor(int a,
 		int b ) /*x*/ : /*x*/ BaseClass(a),
-							  member(b)
+	member(b)
 {
 }
 
@@ -651,7 +651,7 @@
 };
 
 class CAbc : public BaseClass1,
-			 protected BaseClass2
+	protected BaseClass2
 {
 };
 
@@ -730,6 +730,31 @@
 	next_line_of_code();
 }
 
+barry()
+{
+	Foo::Foo (int one,
+			int two)
+		: something(4)
+	{}
+}
+
+barry()
+{
+	Foo::Foo (int one, int two)
+		: something(4)
+	{}
+}
+
+Constructor::Constructor(int a,
+		int b 
+		)  : 
+	BaseClass(a,
+			b,
+			c),
+	mMember(b)
+{
+}
+
 /* end of AUTO */
 
 
@@ -1070,6 +1095,16 @@
 };
 
 
+	void
+foo()
+{
+	if (a)
+	{
+	} else
+		asdf;
+}
+
+
 {
 	averylongfunctionnamelongfunctionnameaverylongfunctionname()->asd(
 			asdasdf,
diff --git a/src/version.h b/src/version.h
index 980a85c..11f5d83 100644
--- a/src/version.h
+++ b/src/version.h
@@ -35,6 +35,6 @@
  */
 #define VIM_VERSION_NODOT	"vim70d"
 #define VIM_VERSION_SHORT	"7.0d"
-#define VIM_VERSION_MEDIUM	"7.0d02 BETA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0d02 BETA (2006 Apr 12)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0d02 BETA (2006 Apr 12, compiled "
+#define VIM_VERSION_MEDIUM	"7.0d03 BETA"
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0d03 BETA (2006 Apr 13)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0d03 BETA (2006 Apr 13, compiled "