updated for version 7.0118
diff --git a/src/eval.c b/src/eval.c
index f2cc2a0..ae36e6f 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -643,6 +643,7 @@
 static long get_tv_number __ARGS((typval_T *varp));
 static long get_tv_number_chk __ARGS((typval_T *varp, int *denote));
 static linenr_T get_tv_lnum __ARGS((typval_T *argvars));
+static linenr_T get_tv_lnum_buf __ARGS((typval_T *argvars, buf_T *buf));
 static char_u *get_tv_string __ARGS((typval_T *varp));
 static char_u *get_tv_string_buf __ARGS((typval_T *varp, char_u *buf));
 static char_u *get_tv_string_chk __ARGS((typval_T *varp));
@@ -9187,11 +9188,12 @@
     buf = get_buf_tv(&argvars[0]);
     --emsg_off;
 
-    lnum = get_tv_lnum(&argvars[1]);
+    lnum = get_tv_lnum_buf(&argvars[1], buf);
     if (argvars[2].v_type == VAR_UNKNOWN)
 	end = lnum;
     else
-	end = get_tv_lnum(&argvars[2]);
+	end = get_tv_lnum_buf(&argvars[2], buf);
+
     get_buffer_lines(buf, lnum, end, TRUE, rettv);
 }
 
@@ -15651,7 +15653,8 @@
 }
 
 /*
- * Get the lnum from the first argument.  Also accepts ".", "$", etc.
+ * Get the lnum from the first argument.
+ * Also accepts ".", "$", etc., but that only works for the current buffer.
  * Returns -1 on error.
  */
     static linenr_T
@@ -15673,6 +15676,24 @@
 }
 
 /*
+ * Get the lnum from the first argument.
+ * Also accepts "$", then "buf" is used.
+ * Returns 0 on error.
+ */
+    static linenr_T
+get_tv_lnum_buf(argvars, buf)
+    typval_T	*argvars;
+    buf_T	*buf;
+{
+    if (argvars[0].v_type == VAR_STRING
+	    && argvars[0].vval.v_string != NULL
+	    && argvars[0].vval.v_string[0] == '$'
+	    && buf != NULL)
+	return buf->b_ml.ml_line_count;
+    return get_tv_number_chk(&argvars[0], NULL);
+}
+
+/*
  * Get the string value of a variable.
  * If it is a Number variable, the number is converted into a string.
  * get_tv_string() uses a single, static buffer.  YOU CAN ONLY USE IT ONCE!
@@ -18678,6 +18699,23 @@
 }
 #endif
 
+/*
+ * Display script name where an item was last set.
+ * Should only be invoked when 'verbose' is non-zero.
+ */
+    void
+last_set_msg(scriptID)
+    scid_T scriptID;
+{
+    if (scriptID != 0)
+    {
+	verbose_enter();
+	MSG_PUTS(_("\n\tLast set from "));
+	MSG_PUTS(get_scriptname(scriptID));
+	verbose_leave();
+    }
+}
+
 #endif /* FEAT_EVAL */
 
 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO)
diff --git a/src/main.c b/src/main.c
index 876289f..380a572 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1034,7 +1034,7 @@
 	    emsg_on_display = FALSE;	/* can delete error message now */
 	    did_emsg = FALSE;
 	    msg_didany = FALSE;		/* reset lines_left in msg_start() */
-	    clear_sb_text();		/* clear scroll-back text */
+	    may_clear_sb_text();	/* clear scroll-back text on next msg */
 	    showruler(FALSE);
 
 	    setcursor();
diff --git a/src/misc2.c b/src/misc2.c
index db6642e..d677b1b 100644
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -870,10 +870,13 @@
 	if (releasing)
 	    break;
 	releasing = TRUE;
-	try_again = mf_release_all();
+
+	clear_sb_text();	      /* free any scrollback text */
+	try_again = mf_release_all(); /* release as many blocks as possible */
 #ifdef FEAT_EVAL
-	try_again |= garbage_collect();
+	try_again |= garbage_collect(); /* cleanup recursive lists/dicts */
 #endif
+
 	releasing = FALSE;
 	if (!try_again)
 	    break;
diff --git a/src/option.c b/src/option.c
index e177216..32eca0b 100644
--- a/src/option.c
+++ b/src/option.c
@@ -3814,15 +3814,7 @@
 		    showoneopt(&options[opt_idx], opt_flags);
 #ifdef FEAT_EVAL
 		    if (p_verbose > 0)
-		    {
-			if (options[opt_idx].scriptID != 0)
-			{
-			    verbose_enter();
-			    MSG_PUTS(_("\n\tLast set from "));
-			    MSG_PUTS(get_scriptname(options[opt_idx].scriptID));
-			    verbose_leave();
-			}
-		    }
+			last_set_msg(options[opt_idx].scriptID);
 #endif
 		}
 		else
diff --git a/src/po/Makefile b/src/po/Makefile
index 617d4f9..f428187 100644
--- a/src/po/Makefile
+++ b/src/po/Makefile
@@ -27,6 +27,7 @@
 		zh_CN.UTF-8 \
 		zh_TW \
 		zh_TW.UTF-8 \
+# end marker
 
 MOFILES = \
 		af.mo \
@@ -51,6 +52,7 @@
 		zh_CN.mo \
 		zh_TW.UTF-8.mo \
 		zh_TW.mo \
+# end marker
 
 CONVERTED = \
 		cs.cp1250.mo \
@@ -60,6 +62,7 @@
 		sk.cp1250.mo \
 		uk.cp1251.mo \
 		zh_CN.cp936.mo \
+# end marker
 
 CHECKFILES = \
 		af.ck \
@@ -91,6 +94,7 @@
 		sk.cp1250.ck \
 		uk.cp1251.ck \
 		zh_CN.cp936.ck \
+# end marker
 
 PACKAGE = vim
 SHELL = /bin/sh
diff --git a/src/proto/eval.pro b/src/proto/eval.pro
index 86ea396..51fb26d 100644
--- a/src/proto/eval.pro
+++ b/src/proto/eval.pro
@@ -86,6 +86,7 @@
 int read_viminfo_varlist __ARGS((vir_T *virp, int writing));
 void write_viminfo_varlist __ARGS((FILE *fp));
 int store_session_globals __ARGS((FILE *fd));
+void last_set_msg __ARGS((scid_T scriptID));
 int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen));
 char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u *flags));
 /* vim: set ft=c : */
diff --git a/src/proto/message.pro b/src/proto/message.pro
index faa0368..e0e2e6e 100644
--- a/src/proto/message.pro
+++ b/src/proto/message.pro
@@ -39,7 +39,9 @@
 void msg_puts_long_attr __ARGS((char_u *longstr, int attr));
 void msg_puts_long_len_attr __ARGS((char_u *longstr, int len, int attr));
 void msg_puts_attr __ARGS((char_u *s, int attr));
+void may_clear_sb_text __ARGS((void));
 void clear_sb_text __ARGS((void));
+void show_sb_text __ARGS((void));
 int msg_use_printf __ARGS((void));
 void mch_errmsg __ARGS((char *str));
 void mch_msg __ARGS((char *str));
diff --git a/src/syntax.c b/src/syntax.c
index 714c90a..99d9e67 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -51,6 +51,9 @@
 #endif
     int		sg_link;	/* link to this highlight group ID */
     int		sg_set;		/* combination of SG_* flags */
+#ifdef FEAT_EVAL
+    scid_T	sg_scriptID;	/* script in which the group was last set */
+#endif
 };
 
 #define SG_TERM		1	/* term has been set */
@@ -6352,6 +6355,9 @@
 		if (!init)
 		    HL_TABLE()[from_id - 1].sg_set |= SG_LINK;
 		HL_TABLE()[from_id - 1].sg_link = to_id;
+#ifdef FEAT_EVAL
+		HL_TABLE()[from_id - 1].sg_scriptID = current_SID;
+#endif
 		redraw_all_later(NOT_VALID);
 	    }
 	}
@@ -7101,6 +7107,9 @@
 #endif
 	else
 	    set_hl_attr(idx);
+#ifdef FEAT_EVAL
+	HL_TABLE()[idx].sg_scriptID = current_SID;
+#endif
 	redraw_all_later(NOT_VALID);
     }
     vim_free(key);
@@ -7201,6 +7210,12 @@
     HL_TABLE()[idx].sg_font_name = NULL;
     HL_TABLE()[idx].sg_gui_attr = 0;
 #endif
+#ifdef FEAT_EVAL
+    /* Clear the script ID only when there is no link, since that is not
+     * cleared. */
+    if (HL_TABLE()[idx].sg_link == 0)
+	HL_TABLE()[idx].sg_scriptID = 0;
+#endif
 }
 
 #if defined(FEAT_GUI) || defined(PROTO)
@@ -7868,13 +7883,19 @@
 				    0, sgp->sg_font_name, "font");
 #endif
 
-    if (sgp->sg_link)
+    if (sgp->sg_link && !got_int)
     {
 	(void)syn_list_header(didh, 9999, id);
+	didh = TRUE;
 	msg_puts_attr((char_u *)"links to", hl_attr(HLF_D));
 	msg_putchar(' ');
 	msg_outtrans(HL_TABLE()[HL_TABLE()[id - 1].sg_link - 1].sg_name);
     }
+
+#ifdef FEAT_EVAL
+    if (didh && p_verbose > 0)
+	last_set_msg(sgp->sg_scriptID);
+#endif
 }
 
     static int
@@ -7890,6 +7911,8 @@
     char_u	*ts;
     int		i;
 
+    if (got_int)
+	return FALSE;
     if (type == LIST_STRING ? (sarg != NULL) : (iarg != 0))
     {
 	ts = buf;
@@ -7915,10 +7938,12 @@
 	(void)syn_list_header(didh,
 			       (int)(vim_strsize(ts) + STRLEN(name) + 1), id);
 	didh = TRUE;
-
-	MSG_PUTS_ATTR(name, hl_attr(HLF_D));
-	MSG_PUTS_ATTR("=", hl_attr(HLF_D));
-	msg_outtrans(ts);
+	if (!got_int)
+	{
+	    MSG_PUTS_ATTR(name, hl_attr(HLF_D));
+	    MSG_PUTS_ATTR("=", hl_attr(HLF_D));
+	    msg_outtrans(ts);
+	}
     }
     return didh;
 }
@@ -8068,11 +8093,17 @@
     if (!did_header)
     {
 	msg_putchar('\n');
+	if (got_int)
+	    return TRUE;
 	msg_outtrans(HL_TABLE()[id - 1].sg_name);
 	endcol = 15;
     }
     else if (msg_col + outlen + 1 >= Columns)
+    {
 	msg_putchar('\n');
+	if (got_int)
+	    return TRUE;
+    }
     else
     {
 	if (msg_col >= endcol)	/* wrap around is like starting a new line */
diff --git a/src/version.h b/src/version.h
index 03557c2..4d4421a 100644
--- a/src/version.h
+++ b/src/version.h
@@ -36,5 +36,5 @@
 #define VIM_VERSION_NODOT	"vim70aa"
 #define VIM_VERSION_SHORT	"7.0aa"
 #define VIM_VERSION_MEDIUM	"7.0aa ALPHA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 27)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 27, compiled "
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 28)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0aa ALPHA (2005 Jul 28, compiled "