updated for version 7.0g04
diff --git a/src/edit.c b/src/edit.c
index 2ff1722..e298a8c 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -2806,7 +2806,7 @@
 			ptr = find_word_end(ptr);
 		    add_r = ins_compl_add_infercase(regmatch->startp[0],
 					  (int)(ptr - regmatch->startp[0]),
-						     p_ic, files[i], *dir, 0);
+						     FALSE, files[i], *dir, 0);
 		    if (thesaurus)
 		    {
 			char_u *wstart;
@@ -2842,7 +2842,7 @@
 				ptr = find_word_end(ptr);
 			    add_r = ins_compl_add_infercase(wstart,
 				    (int)(ptr - wstart),
-				    p_ic, files[i], *dir, 0);
+				    FALSE, files[i], *dir, 0);
 			}
 		    }
 		    if (add_r == OK)
@@ -3534,7 +3534,7 @@
     int		dir;
 {
     char_u	*word;
-    int		icase = p_ic;
+    int		icase = FALSE;
     int		dup = FALSE;
     char_u	*(cptext[CPT_COUNT]);
 
@@ -3753,7 +3753,7 @@
 		    TAG_INS_COMP | (ctrl_x_mode ? TAG_VERBOSE : 0),
 		    TAG_MANY, curbuf->b_ffname) == OK && num_matches > 0)
 	    {
-		ins_compl_add_matches(num_matches, matches, p_ic);
+		ins_compl_add_matches(num_matches, matches, FALSE);
 	    }
 	    p_ic = save_p_ic;
 	    break;
@@ -3928,7 +3928,7 @@
 			    continue;
 		    }
 		}
-		if (ins_compl_add_infercase(ptr, len, p_ic,
+		if (ins_compl_add_infercase(ptr, len, FALSE,
 				 ins_buf == curbuf ? NULL : ins_buf->b_sfname,
 					   0, flags) != NOTDONE)
 		{
@@ -5818,7 +5818,7 @@
  */
     int
 comp_textwidth(ff)
-    int		ff;	/* force formatting (for "Q" command) */
+    int		ff;	/* force formatting (for "gq" command) */
 {
     int		textwidth;
 
diff --git a/src/gui_gtk.c b/src/gui_gtk.c
index 0da144f..397b451 100644
--- a/src/gui_gtk.c
+++ b/src/gui_gtk.c
@@ -2221,16 +2221,6 @@
 {
     DialogInfo *di = (DialogInfo *)data;
 
-#ifndef HAVE_GTK2
-    /* Ignore hitting "Enter" if there is no default button. */
-    if (event->keyval == GDK_Return)
-    {
-	if (!di->ignore_enter)
-	    gtk_dialog_response(di->dialog, GTK_RESPONSE_ACCEPT);
-	return TRUE;
-    }
-#endif
-
     /* Close the dialog when hitting "Esc". */
     if (event->keyval == GDK_Escape)
     {
diff --git a/src/screen.c b/src/screen.c
index f57adc04..222cd32 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -2626,6 +2626,9 @@
     int		prev_c = 0;		/* previous Arabic character */
     int		prev_c1 = 0;		/* first composing char for prev_c */
 #endif
+#if defined(FEAT_DIFF) || defined(LINE_ATTR)
+    int		did_line_attr = 0;
+#endif
 
     /* draw_state: items that are drawn in sequence: */
 #define WL_START	0		/* nothing done yet */
@@ -4133,6 +4136,13 @@
 		    /* Highlight until the right side of the window */
 		    c = ' ';
 		    --ptr;	    /* put it back at the NUL */
+
+		    /* Remember we do the char for line highlighting. */
+		    ++did_line_attr;
+
+		    /* don't do search HL for the rest of the line */
+		    if (line_attr != 0 && char_attr == search_attr && col > 0)
+			char_attr = line_attr;
 # ifdef FEAT_DIFF
 		    if (diff_hlf == HLF_TXD)
 		    {
@@ -4224,22 +4234,34 @@
 	}
 
 	/*
-	 * At end of the text line.
+	 * At end of the text line or just after the last character.
 	 */
-	if (c == NUL)
+	if (c == NUL
+#if defined(FEAT_DIFF) || defined(LINE_ATTR)
+		|| did_line_attr == 1
+#endif
+		)
 	{
+#ifdef FEAT_SEARCH_EXTRA
+	    long prevcol = (long)(ptr - line) - (c == NUL);
+#endif
+
 	    /* invert at least one char, used for Visual and empty line or
 	     * highlight match at end of line. If it's beyond the last
 	     * char on the screen, just overwrite that one (tricky!)  Not
 	     * needed when a '$' was displayed for 'list'. */
 	    if (lcs_eol == lcs_eol_one
-		    && ((area_attr != 0 && vcol == fromcol)
+		    && ((area_attr != 0 && vcol == fromcol && c == NUL)
 #ifdef FEAT_SEARCH_EXTRA
 			/* highlight 'hlsearch' match at end of line */
-			|| (ptr - line) - 1 == (long)search_hl.startcol
-			|| (ptr - line) - 1 == (long)match_hl[0].startcol
-			|| (ptr - line) - 1 == (long)match_hl[1].startcol
-			|| (ptr - line) - 1 == (long)match_hl[2].startcol
+			|| ((prevcol == (long)search_hl.startcol
+				|| prevcol == (long)match_hl[0].startcol
+				|| prevcol == (long)match_hl[1].startcol
+				|| prevcol == (long)match_hl[2].startcol)
+# if defined(FEAT_DIFF) || defined(LINE_ATTR)
+			    && did_line_attr <= 1
+# endif
+			   )
 #endif
 		       ))
 	    {
@@ -4297,7 +4319,13 @@
 		    ++col;
 		++vcol;
 	    }
+	}
 
+	/*
+	 * At end of the text line.
+	 */
+	if (c == NUL)
+	{
 #ifdef FEAT_SYN_HL
 	    /* Highlight 'cursorcolumn' past end of the line. */
 	    if (wp->w_p_wrap)
diff --git a/src/search.c b/src/search.c
index 0e535ab..a8a390e 100644
--- a/src/search.c
+++ b/src/search.c
@@ -4871,7 +4871,7 @@
 			goto exit_matched;
 		}
 
-		add_r = ins_compl_add_infercase(aux, i, p_ic,
+		add_r = ins_compl_add_infercase(aux, i, FALSE,
 			curr_fname == curbuf->b_fname ? NULL : curr_fname,
 			dir, reuse);
 		if (add_r == OK)
@@ -5110,7 +5110,7 @@
 
     if (did_show)
 	msg_putchar('\n');	/* cursor below last one */
-    else
+    else if (!msg_silent)
 	gotocmdline(TRUE);	/* cursor at status line */
     if (got_int)		/* 'q' typed at "--more--" message */
 	return;
diff --git a/src/testdir/test60.in b/src/testdir/test60.in
index 2c414b3..d5a0d7c 100644
--- a/src/testdir/test60.in
+++ b/src/testdir/test60.in
@@ -18,6 +18,8 @@
 
     " valid autocmd group
     let test_cases += [['#myagroup', 1]]
+    " valid autocmd group with garbage
+    let test_cases += [['#myagroup+b', 0]]
     " Valid autocmd group and event
     let test_cases += [['#myagroup#BufEnter', 1]]
     " Valid autocmd group, event and pattern
@@ -51,6 +53,8 @@
     let test_cases += [['&textwidth', 1]]
     " Existing and working option (short form)
     let test_cases += [['&tw', 1]]
+    " Existing and working option with garbage
+    let test_cases += [['&tw-', 0]]
     " Global option
     let test_cases += [['&g:errorformat', 1]]
     " Local option
@@ -64,6 +68,8 @@
 
     " Existing and working option (long form)
     let test_cases += [['+incsearch', 1]]
+    " Existing and working option with garbage
+    let test_cases += [['+incsearch!1', 0]]
     " Existing and working option (short form)
     let test_cases += [['+is', 1]]
     " Existing option that is hidden.
@@ -77,8 +83,12 @@
 
     " Valid internal function
     let test_cases += [['*bufnr', 1]]
+    " Valid internal function with ()
+    let test_cases += [['*bufnr()', 1]]
     " Non-existing internal function
     let test_cases += [['*myxyzfunc', 0]]
+    " Valid internal function with garbage
+    let test_cases += [['*bufnr&6', 0]]
 
     " Valid user defined function
     let test_cases += [['*TestExists', 1]]
@@ -100,6 +110,14 @@
 	echo "FAILED"
     endif
 
+    " Valid internal command (full match) with garbage
+    echo ':edit/a: 0'
+    if exists(':edit/a') == 0
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
     " Valid internal command (partial match)
     echo ':q: 1'
     if exists(':q') == 1
@@ -171,6 +189,15 @@
 	echo "FAILED"
     endif
 
+    " Valid local variable with garbage
+    let local_var = 1
+    echo 'local_var%n: 0'
+    if !exists('local_var%n')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
     " Non-existing local variable
     unlet local_var
     echo 'local_var: 0'
@@ -189,6 +216,30 @@
 	echo "FAILED"
     endif
 
+    " Valid local list item
+    echo 'local_list[1]: 1'
+    if exists('local_list[1]')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Valid local list item with garbage
+    echo 'local_list[1]+5: 0'
+    if !exists('local_list[1]+5')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
+    " Invalid local list item
+    echo 'local_list[2]: 0'
+    if !exists('local_list[2]')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
     " Non-existing local list
     unlet local_list
     echo 'local_list: 0'
@@ -245,6 +296,14 @@
 	echo "FAILED"
     endif
 
+    " Existing global variable with garbage
+    echo 'g:global_var-n: 1'
+    if !exists('g:global_var-n')
+	echo "OK"
+    else
+	echo "FAILED"
+    endif
+
     " Non-existing global variable
     unlet g:global_var
     echo 'g:global_var: 0'
diff --git a/src/version.h b/src/version.h
index 6323f46..389219d 100644
--- a/src/version.h
+++ b/src/version.h
@@ -35,6 +35,6 @@
  */
 #define VIM_VERSION_NODOT	"vim70g"
 #define VIM_VERSION_SHORT	"7.0g"
-#define VIM_VERSION_MEDIUM	"7.0g03 BETA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0g03 BETA (2006 May 4)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0g03 BETA (2006 May 4, compiled "
+#define VIM_VERSION_MEDIUM	"7.0g04 BETA"
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0g04 BETA (2006 May 5)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0g04 BETA (2006 May 5, compiled "