updated for version 7.0g02
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 5891f83..368d65c 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -4999,7 +4999,7 @@
     char_u	*rep_buf = NULL;
     garray_T	*gap;
 
-    replace_termcodes(rep, &rep_buf, FALSE, FALSE);
+    replace_termcodes(rep, &rep_buf, FALSE, FALSE, FALSE);
     if (rep_buf == NULL)
     {
 	/* Can't replace termcodes - try using the string as is */
@@ -9855,29 +9855,12 @@
 	    return FAIL;
 
 	/*
-	 * Wipe out an empty unnamed buffer we started in.
-	 */
-	if (put_line(fd, "if exists('s:wipebuf')") == FAIL)
-	    return FAIL;
-	if (put_line(fd, "  exe 'bwipe ' . s:wipebuf") == FAIL)
-	    return FAIL;
-	if (put_line(fd, "endif") == FAIL)
-	    return FAIL;
-	if (put_line(fd, "unlet! s:wipebuf") == FAIL)
-	    return FAIL;
-
-	/*
 	 * Restore window sizes again after jumping around in windows, because
 	 * the current window has a minimum size while others may not.
 	 */
 	if (nr > 1 && ses_winsizes(fd, restore_size) == FAIL)
 	    return FAIL;
 
-	/* Re-apply 'winheight', 'winwidth' and 'shortmess'. */
-	if (fprintf(fd, "set winheight=%ld winwidth=%ld shortmess=%s",
-			       p_wh, p_wiw, p_shm) < 0 || put_eol(fd) == FAIL)
-	    return FAIL;
-
 	/* Don't continue in another tab page when doing only the current one
 	 * or when at the last tab page. */
 	if (!(ssop_flags & SSOP_TABPAGES) || curtab->tp_next == NULL)
@@ -9893,6 +9876,22 @@
 	    return FAIL;
     }
 
+    /*
+     * Wipe out an empty unnamed buffer we started in.
+     */
+    if (put_line(fd, "if exists('s:wipebuf')") == FAIL)
+	return FAIL;
+    if (put_line(fd, "  exe 'bwipe ' . s:wipebuf") == FAIL)
+	return FAIL;
+    if (put_line(fd, "endif") == FAIL)
+	return FAIL;
+    if (put_line(fd, "unlet! s:wipebuf") == FAIL)
+	return FAIL;
+
+    /* Re-apply 'winheight', 'winwidth' and 'shortmess'. */
+    if (fprintf(fd, "set winheight=%ld winwidth=%ld shortmess=%s",
+			       p_wh, p_wiw, p_shm) < 0 || put_eol(fd) == FAIL)
+	return FAIL;
 
     /*
      * Lastly, execute the x.vim file if it exists.
diff --git a/src/getchar.c b/src/getchar.c
index 88e724f..7d2cfd7 100644
--- a/src/getchar.c
+++ b/src/getchar.c
@@ -3034,6 +3034,7 @@
     mapblock_T	**map_table;
     int		unique = FALSE;
     int		silent = FALSE;
+    int		special = FALSE;
 #ifdef FEAT_EVAL
     int		expr = FALSE;
 #endif
@@ -3075,6 +3076,16 @@
 	    continue;
 	}
 
+	/*
+	 * Check for "<special>": accept special keys in <>
+	 */
+	if (STRNCMP(keys, "<special>", 9) == 0)
+	{
+	    keys = skipwhite(keys + 9);
+	    special = TRUE;
+	    continue;
+	}
+
 #ifdef FEAT_EVAL
 	/*
 	 * Check for "<script>": remap script-local mappings only
@@ -3147,13 +3158,13 @@
      * replace_termcodes() also removes CTRL-Vs and sometimes backslashes.
      */
     if (haskey)
-	keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE);
+	keys = replace_termcodes(keys, &keys_buf, TRUE, TRUE, special);
     if (hasarg)
     {
 	if (STRICMP(rhs, "<nop>") == 0)	    /* "<Nop>" means nothing */
 	    rhs = (char_u *)"";
 	else
-	    rhs = replace_termcodes(rhs, &arg_buf, FALSE, TRUE);
+	    rhs = replace_termcodes(rhs, &arg_buf, FALSE, TRUE, special);
     }
 
 #ifdef FEAT_FKMAP
@@ -3819,7 +3830,7 @@
     char_u	*buf;
     int		retval;
 
-    rhs = replace_termcodes(str, &buf, FALSE, TRUE);
+    rhs = replace_termcodes(str, &buf, FALSE, TRUE, FALSE);
 
     if (vim_strchr(modechars, 'n') != NULL)
 	mode |= NORMAL;
diff --git a/src/gui.c b/src/gui.c
index 0c90539..3a07cf1 100644
--- a/src/gui.c
+++ b/src/gui.c
@@ -4544,6 +4544,12 @@
 	if (wp == curwin || wp == NULL)
 	    return;	/* still in the same old window, or none at all */
 
+#ifdef FEAT_WINDOWS
+	/* Ignore position in the tab pages line. */
+	if (Y_2_ROW(y) < tabline_height())
+	    return;
+#endif
+
 	/*
 	 * format a mouse click on status line input
 	 * ala gui_send_mouse_event(0, x, y, 0, 0);
@@ -4597,7 +4603,11 @@
     /* Don't move the mouse when it's left or right of the Vim window */
     if (x < 0 || x > Columns * gui.char_width)
 	return;
+# ifdef FEAT_WINDOWS
+    if (Y_2_ROW(y) >= tabline_height())
+# else
     if (y >= 0)
+# endif
 	wp = xy2win(x, y);
     if (wp != curwin && wp != NULL)	/* If in other than current window */
     {
diff --git a/src/if_ole.cpp b/src/if_ole.cpp
index 59c786a..45ee335 100644
--- a/src/if_ole.cpp
+++ b/src/if_ole.cpp
@@ -314,7 +314,7 @@
     }
 
     /* Translate key codes like <Esc> */
-    str = replace_termcodes((char_u *)buffer, &ptr, FALSE, TRUE);
+    str = replace_termcodes((char_u *)buffer, &ptr, FALSE, TRUE, FALSE);
 
     /* If ptr was set, then a new buffer was allocated,
      * so we can free the old one.
diff --git a/src/option.c b/src/option.c
index 8d5dcac..1234bac 100644
--- a/src/option.c
+++ b/src/option.c
@@ -6420,7 +6420,7 @@
     {
 	if (*p_pt)
 	{
-	    (void)replace_termcodes(p_pt, &p, TRUE, TRUE);
+	    (void)replace_termcodes(p_pt, &p, TRUE, TRUE, FALSE);
 	    if (p != NULL)
 	    {
 		if (new_value_alloced)
diff --git a/src/proto/term.pro b/src/proto/term.pro
index 7b53749..9ce594e 100644
--- a/src/proto/term.pro
+++ b/src/proto/term.pro
@@ -51,7 +51,7 @@
 extern void del_termcode __ARGS((char_u *name));
 extern void set_mouse_topline __ARGS((win_T *wp));
 extern int check_termcode __ARGS((int max_offset, char_u *buf, int buflen));
-extern char_u *replace_termcodes __ARGS((char_u *from, char_u **bufp, int from_part, int do_lt));
+extern char_u *replace_termcodes __ARGS((char_u *from, char_u **bufp, int from_part, int do_lt, int special));
 extern int find_term_bykeys __ARGS((char_u *src));
 extern void show_termcodes __ARGS((void));
 extern int show_one_termcode __ARGS((char_u *name, char_u *code, int printit));
diff --git a/src/quickfix.c b/src/quickfix.c
index 4f5fe24..19e03c4 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -118,6 +118,7 @@
 static void	qf_clean_dir_stack __ARGS((struct dir_stack_T **));
 #ifdef FEAT_WINDOWS
 static int	qf_win_pos_update __ARGS((qf_info_T *qi, int old_qf_index));
+static int	is_qf_win __ARGS((win_T *win, qf_info_T *qi));
 static win_T	*qf_find_win __ARGS((qf_info_T *qi));
 static buf_T	*qf_find_buf __ARGS((qf_info_T *qi));
 static void	qf_update_buffer __ARGS((qf_info_T *qi));
@@ -2199,6 +2200,7 @@
     int		height;
     win_T	*win;
     tabpage_T	*prevtab = curtab;
+    buf_T	*qf_buf;
 
     if (eap->cmdidx == CMD_lopen || eap->cmdidx == CMD_lwindow)
     {
@@ -2231,6 +2233,8 @@
 	win_goto(win);
     else
     {
+	qf_buf = qf_find_buf(qi);
+
 	/* The current window becomes the previous window afterwards. */
 	win = curwin;
 
@@ -2256,13 +2260,21 @@
 	    win->w_llist->qf_refcount++;
 	}
 
-	(void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE);
-	/* switch off 'swapfile' */
-	set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
-	set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
+	if (qf_buf != NULL)
+	    /* Use the existing quickfix buffer */
+	    (void)do_ecmd(qf_buf->b_fnum, NULL, NULL, NULL, ECMD_ONE,
+						     ECMD_HIDE + ECMD_OLDBUF);
+	else
+	{
+	    /* Create a new quickfix buffer */
+	    (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE);
+	    /* switch off 'swapfile' */
+	    set_option_value((char_u *)"swf", 0L, NULL, OPT_LOCAL);
+	    set_option_value((char_u *)"bt", 0L, (char_u *)"quickfix",
 								   OPT_LOCAL);
-	set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
-	set_option_value((char_u *)"diff", 0L, (char_u *)"", OPT_LOCAL);
+	    set_option_value((char_u *)"bh", 0L, (char_u *)"wipe", OPT_LOCAL);
+	    set_option_value((char_u *)"diff", 0L, (char_u *)"", OPT_LOCAL);
+	}
 
 	/* Only set the height when still in the same tab page and there is no
 	 * window to the side. */
@@ -2352,7 +2364,31 @@
 }
 
 /*
+ * Check whether the given window is displaying the specified quickfix/location
+ * list buffer
+ */
+    static int
+is_qf_win(win, qi)
+    win_T	*win;
+    qf_info_T	*qi;
+{
+    /*
+     * A window displaying the quickfix buffer will have the w_llist_ref field
+     * set to NULL.
+     * A window displaying a location list buffer will have the w_llist_ref
+     * pointing to the location list.
+     */
+    if (bt_quickfix(win->w_buffer))
+	if ((qi == &ql_info && win->w_llist_ref == NULL)
+		|| (qi != &ql_info && win->w_llist_ref == qi))
+	    return TRUE;
+
+    return FALSE;
+}
+
+/*
  * Find a window displaying the quickfix/location list 'qi'
+ * Searches in only the windows opened in the current tab.
  */
     static win_T *
 qf_find_win(qi)
@@ -2360,33 +2396,29 @@
 {
     win_T	*win;
 
-    /*
-     * When searching for the quickfix buffer, find a window
-     * with w_llist_ref set to NULL.
-     * When searching for the location list buffer, find a window
-     * with w_llist_ref pointing to the supplied location list.
-     */
     FOR_ALL_WINDOWS(win)
-	if (bt_quickfix(win->w_buffer))
-	    if ((qi == &ql_info && win->w_llist_ref == NULL)
-		|| (qi != &ql_info && win->w_llist_ref == qi))
-		break;
+	if (is_qf_win(win, qi))
+	    break;
 
     return win;
 }
 
 /*
- * Find quickfix buffer.
+ * Find a quickfix buffer.
+ * Searches in windows opened in all the tabs.
  */
     static buf_T *
 qf_find_buf(qi)
     qf_info_T	*qi;
 {
+    tabpage_T	*tp;
     win_T	*win;
 
-    win = qf_find_win(qi);
+    FOR_ALL_TAB_WINDOWS(tp, win)
+	if (is_qf_win(win, qi))
+	    return win->w_buffer;
 
-    return (win != NULL) ? win->w_buffer: NULL;
+    return NULL;
 }
 
 /*
diff --git a/src/spell.c b/src/spell.c
index 5e37500..757efc6 100644
--- a/src/spell.c
+++ b/src/spell.c
@@ -7031,7 +7031,7 @@
 	    continue;	/* empty or blank line */
 	rline[l] = NUL;
 
-	/* Convert from "=encoding={encoding}" to 'encoding' when needed. */
+	/* Convert from "/encoding={encoding}" to 'encoding' when needed. */
 	vim_free(pc);
 #ifdef FEAT_MBYTE
 	if (spin->si_conv.vc_type != CONV_NONE)
@@ -7069,7 +7069,7 @@
 		    char_u	*enc;
 
 		    /* Setup for conversion to 'encoding'. */
-		    line += 10;
+		    line += 9;
 		    enc = enc_canonize(line);
 		    if (enc != NULL && !spin->si_ascii
 			    && convert_setup(&spin->si_conv, enc,
diff --git a/src/term.c b/src/term.c
index 99dc1b0..7597c93 100644
--- a/src/term.c
+++ b/src/term.c
@@ -4945,12 +4945,13 @@
  * nothing).  When 'cpoptions' does not contain 'B', a backslash can be used
  * instead of a CTRL-V.
  */
-    char_u  *
-replace_termcodes(from, bufp, from_part, do_lt)
+    char_u *
+replace_termcodes(from, bufp, from_part, do_lt, special)
     char_u	*from;
     char_u	**bufp;
     int		from_part;
     int		do_lt;		/* also translate <lt> */
+    int		special;	/* always accept <key> notation */
 {
     int		i;
     int		slen;
@@ -4963,7 +4964,7 @@
     char_u	*result;	/* buffer for resulting string */
 
     do_backslash = (vim_strchr(p_cpo, CPO_BSLASH) == NULL);
-    do_special = (vim_strchr(p_cpo, CPO_SPECI) == NULL);
+    do_special = (vim_strchr(p_cpo, CPO_SPECI) == NULL) || special;
     do_key_code = (vim_strchr(p_cpo, CPO_KEYCODE) == NULL);
 
     /*
diff --git a/src/version.h b/src/version.h
index d37c326..f1c2dc5 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.0g-01 BETA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0g01 BETA (2006 May 2)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0g01 BETA (2006 May 2, compiled "
+#define VIM_VERSION_MEDIUM	"7.0g02 BETA"
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0g02 BETA (2006 May 3)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0g02 BETA (2006 May 3, compiled "
diff --git a/src/window.c b/src/window.c
index 09c638e..cbcdd4e 100644
--- a/src/window.c
+++ b/src/window.c
@@ -5195,6 +5195,7 @@
     int		sline, line_size;
     int		space;
     int		did_below = FALSE;
+    int		old_height = wp->w_height;
 #define FRACTION_MULT	16384L
 
     /* Don't want a negative height.  Happens when splitting a tiny window.
@@ -5238,9 +5239,15 @@
 	}
 	else
 	{
-	    space = height;
+	    space = height - 1;
+
 	    while (lnum > 1)
 	    {
+		/* When using "~" lines stop when at the old topline, don't
+		 * scroll down. */
+		if (did_below && height < old_height && lnum <= wp->w_topline)
+		    sline = 0;
+
 		space -= line_size;
 		if (space > 0 && sline <= 0 && !did_below)
 		{