updated for version 7.0209
diff --git a/src/eval.c b/src/eval.c
index 9f79560..ee5f0c9 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -11731,6 +11731,7 @@
     char_u	*save_cpo;
     long	start = 0;
     long	nth = 1;
+    colnr_T	startcol = 0;
     int		match = 0;
     list_T	*l = NULL;
     listitem_T	*li = NULL;
@@ -11811,12 +11812,12 @@
 		    break;
 		}
 		vim_free(tofree);
-		str = echo_string(&li->li_tv, &tofree, strbuf,0);
+		str = echo_string(&li->li_tv, &tofree, strbuf, 0);
 		if (str == NULL)
 		    break;
 	    }
 
-	    match = vim_regexec_nl(&regmatch, str, (colnr_T)0);
+	    match = vim_regexec_nl(&regmatch, str, (colnr_T)startcol);
 
 	    if (match && --nth <= 0)
 		break;
@@ -11832,9 +11833,10 @@
 	    else
 	    {
 #ifdef FEAT_MBYTE
-		str = regmatch.startp[0] + (*mb_ptr2len)(regmatch.startp[0]);
+		startcol = regmatch.startp[0]
+				    + (*mb_ptr2len)(regmatch.startp[0]) - str;
 #else
-		str = regmatch.startp[0] + 1;
+		startcol = regmatch.startp[0] + 1 - str;
 #endif
 	    }
 	}
@@ -17400,6 +17402,7 @@
     hashtab_T	*ht;
     int		todo;
     hashitem_T	*hi;
+    int		sourcing_lnum_off;
 
     /*
      * ":function" without argument: list functions.
@@ -17522,6 +17525,8 @@
 		list_func_head(fp, TRUE);
 		for (j = 0; j < fp->uf_lines.ga_len && !got_int; ++j)
 		{
+		    if (FUNCLINE(fp, j) == NULL)
+			continue;
 		    msg_putchar('\n');
 		    msg_outnum((long)(j + 1));
 		    if (j < 9)
@@ -17693,6 +17698,8 @@
     {
 	msg_scroll = TRUE;
 	need_wait_return = FALSE;
+	sourcing_lnum_off = sourcing_lnum;
+
 	if (line_arg != NULL)
 	{
 	    /* Use eap->arg, split up in parts by line breaks. */
@@ -17718,6 +17725,12 @@
 	    goto erret;
 	}
 
+	/* Detect line continuation: sourcing_lnum increased more than one. */
+	if (sourcing_lnum > sourcing_lnum_off + 1)
+	    sourcing_lnum_off = sourcing_lnum - sourcing_lnum_off - 1;
+	else
+	    sourcing_lnum_off = 0;
+
 	if (skip_until != NULL)
 	{
 	    /* between ":append" and "." and between ":python <<EOF" and "EOF"
@@ -17802,7 +17815,7 @@
 	}
 
 	/* Add the line to the function. */
-	if (ga_grow(&newlines, 1) == FAIL)
+	if (ga_grow(&newlines, 1 + sourcing_lnum_off) == FAIL)
 	{
 	    if (line_arg == NULL)
 		vim_free(theline);
@@ -17820,8 +17833,12 @@
 	    theline = p;
 	}
 
-	((char_u **)(newlines.ga_data))[newlines.ga_len] = theline;
-	newlines.ga_len++;
+	((char_u **)(newlines.ga_data))[newlines.ga_len++] = theline;
+
+	/* Add NULL lines for continuation lines, so that the line count is
+	 * equal to the index in the growarray.   */
+	while (sourcing_lnum_off-- > 0)
+	    ((char_u **)(newlines.ga_data))[newlines.ga_len++] = NULL;
 
 	/* Check for end of eap->arg. */
 	if (line_arg != NULL && *line_arg == NUL)
@@ -18362,6 +18379,8 @@
 
 		for (i = 0; i < fp->uf_lines.ga_len; ++i)
 		{
+		    if (FUNCLINE(fp, i) == NULL)
+			continue;
 		    prof_func_line(fd, fp->uf_tml_count[i],
 			     &fp->uf_tml_total[i], &fp->uf_tml_self[i], TRUE);
 		    fprintf(fd, "%s\n", FUNCLINE(fp, i));
@@ -19270,18 +19289,26 @@
 #endif
 
     gap = &fp->uf_lines;
-    if ((fp->uf_flags & FC_ABORT) && did_emsg && !aborted_in_try())
-	retval = NULL;
-    else if (fcp->returned || fcp->linenr >= gap->ga_len)
+    if (((fp->uf_flags & FC_ABORT) && did_emsg && !aborted_in_try())
+	    || fcp->returned)
 	retval = NULL;
     else
     {
-	retval = vim_strsave(((char_u **)(gap->ga_data))[fcp->linenr++]);
-	sourcing_lnum = fcp->linenr;
+	/* Skip NULL lines (continuation lines). */
+	while (fcp->linenr < gap->ga_len
+			  && ((char_u **)(gap->ga_data))[fcp->linenr] == NULL)
+	    ++fcp->linenr;
+	if (fcp->linenr >= gap->ga_len)
+	    retval = NULL;
+	else
+	{
+	    retval = vim_strsave(((char_u **)(gap->ga_data))[fcp->linenr++]);
+	    sourcing_lnum = fcp->linenr;
 #ifdef FEAT_PROFILE
-	if (do_profiling)
-	    func_line_start(cookie);
+	    if (do_profiling)
+		func_line_start(cookie);
 #endif
+	}
     }
 
     /* Did we encounter a breakpoint? */
@@ -19315,6 +19342,9 @@
 				      && sourcing_lnum <= fp->uf_lines.ga_len)
     {
 	fp->uf_tml_idx = sourcing_lnum - 1;
+	/* Skip continuation lines. */
+	while (fp->uf_tml_idx > 0 && FUNCLINE(fp, fp->uf_tml_idx) == NULL)
+	    --fp->uf_tml_idx;
 	fp->uf_tml_execed = FALSE;
 	profile_start(&fp->uf_tml_start);
 	profile_zero(&fp->uf_tml_children);