diff --git a/src/quickfix.c b/src/quickfix.c
index d465787..5847ae1 100644
--- a/src/quickfix.c
+++ b/src/quickfix.c
@@ -88,7 +88,7 @@
 				/*   '-' do not include this line */
 };
 
-static int qf_init_ext __ARGS((char_u *efile, buf_T *buf, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast));
+static int	qf_init_ext __ARGS((char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast));
 static void	qf_new_list __ARGS((void));
 static int	qf_add_entry __ARGS((qfline_T **prevp, char_u *dir, char_u *fname, char_u *mesg, long lnum, int col, int vis_col, char_u *pattern, int nr, int type, int valid));
 static void	qf_msg __ARGS((void));
@@ -124,7 +124,7 @@
 {
     if (efile == NULL)
 	return FAIL;
-    return qf_init_ext(efile, curbuf, errorformat, newlist,
+    return qf_init_ext(efile, curbuf, NULL, errorformat, newlist,
 						    (linenr_T)0, (linenr_T)0);
 }
 
@@ -137,9 +137,10 @@
  * Return -1 for error, number of errors for success.
  */
     static int
-qf_init_ext(efile, buf, errorformat, newlist, lnumfirst, lnumlast)
+qf_init_ext(efile, buf, tv, errorformat, newlist, lnumfirst, lnumlast)
     char_u	    *efile;
     buf_T	    *buf;
+    typval_T	    *tv;
     char_u	    *errorformat;
     int		    newlist;		/* TRUE: start a new error list */
     linenr_T	    lnumfirst;		/* first line number to use */
@@ -176,6 +177,8 @@
     char_u	    *directory = NULL;
     char_u	    *currfile = NULL;
     char_u	    *tail = NULL;
+    char_u	    *p_str = NULL;
+    listitem_T	    *p_li = NULL;
     struct dir_stack_T  *file_stack = NULL;
     regmatch_T	    regmatch;
     static struct fmtpattern
@@ -222,7 +225,7 @@
  * regex prog.  Only a few % characters are allowed.
  */
     /* Use the local value of 'errorformat' if it's set. */
-    if (errorformat == p_efm && *buf->b_p_efm != NUL)
+    if (errorformat == p_efm && tv == NULL && *buf->b_p_efm != NUL)
 	efm = buf->b_p_efm;
     else
 	efm = errorformat;
@@ -432,6 +435,14 @@
     /* Always ignore case when looking for a matching error. */
     regmatch.rm_ic = TRUE;
 
+    if (tv != NULL)
+    {
+	if (tv->v_type == VAR_STRING)
+	    p_str = tv->vval.v_string;
+	else if (tv->v_type == VAR_LIST)
+	    p_li = tv->vval.v_list->lv_first;
+    }
+
     /*
      * Read the lines in the error file one by one.
      * Try to recognize one of the error formats in each line.
@@ -441,10 +452,57 @@
 	/* Get the next line. */
 	if (fd == NULL)
 	{
-	    if (buflnum > lnumlast)
-		break;
-	    vim_strncpy(IObuff, ml_get_buf(buf, buflnum++, FALSE),
-							     CMDBUFFSIZE - 2);
+	    if (tv != NULL)
+	    {
+		int len;
+
+		if (tv->v_type == VAR_STRING)
+		{
+		    /* Get the next line from the supplied string */
+		    char_u *p;
+
+		    if (!*p_str) /* Reached the end of the string */
+			break;
+
+		    p = vim_strchr(p_str, '\n');
+		    if (p)
+			len = p - p_str + 1;
+		    else
+			len = STRLEN(p_str);
+
+		    if (len > CMDBUFFSIZE - 2)
+			vim_strncpy(IObuff, p_str, CMDBUFFSIZE - 2);
+		    else
+			vim_strncpy(IObuff, p_str, len);
+
+		    p_str += len;
+		}
+		else if (tv->v_type == VAR_LIST)
+		{
+		    /* Get the next line from the supplied list */
+		    while (p_li && p_li->li_tv.v_type != VAR_STRING)
+			p_li = p_li->li_next;	/* Skip non-string items */
+
+		    if (!p_li)			/* End of the list */
+			break;
+
+		    len = STRLEN(p_li->li_tv.vval.v_string);
+		    if (len > CMDBUFFSIZE - 2)
+			len = CMDBUFFSIZE - 2;
+
+		    vim_strncpy(IObuff, p_li->li_tv.vval.v_string, len);
+
+		    p_li = p_li->li_next;	/* next item */
+		}
+	    }
+	    else
+	    {
+		/* Get the next line from the supplied buffer */
+		if (buflnum > lnumlast)
+		    break;
+		vim_strncpy(IObuff, ml_get_buf(buf, buflnum++, FALSE),
+			    CMDBUFFSIZE - 2);
+	    }
 	}
 	else if (fgets((char *)IObuff, CMDBUFFSIZE - 2, fd) == NULL)
 	    break;
@@ -1446,7 +1504,6 @@
     int		idx1 = 1;
     int		idx2 = -1;
     int		need_return = TRUE;
-    int		last_printed = 1;
     char_u	*arg = eap->arg;
     int		all = eap->forceit;	/* if not :cl!, only show
 						   recognised errors */
@@ -1467,7 +1524,6 @@
     if (idx2 < 0)
 	idx2 = (-idx2 > i) ? 0 : idx2 + i + 1;
 
-    more_back_used = TRUE;
     if (qf_lists[qf_curlist].qf_nonevalid)
 	all = TRUE;
     qfp = qf_lists[qf_curlist].qf_start;
@@ -1478,79 +1534,59 @@
 	    if (need_return)
 	    {
 		msg_putchar('\n');
+		if (got_int)
+		    break;
 		need_return = FALSE;
 	    }
-	    if (more_back == 0)
-	    {
-		fname = NULL;
-		if (qfp->qf_fnum != 0
-			      && (buf = buflist_findnr(qfp->qf_fnum)) != NULL)
-		{
-		    fname = buf->b_fname;
-		    if (qfp->qf_type == 1)	/* :helpgrep */
-			fname = gettail(fname);
-		}
-		if (fname == NULL)
-		    sprintf((char *)IObuff, "%2d", i);
-		else
-		    vim_snprintf((char *)IObuff, IOSIZE, "%2d %s",
-							    i, (char *)fname);
-		msg_outtrans_attr(IObuff, i == qf_lists[qf_curlist].qf_index
-			? hl_attr(HLF_L) : hl_attr(HLF_D));
-		if (qfp->qf_lnum == 0)
-		    IObuff[0] = NUL;
-		else if (qfp->qf_col == 0)
-		    sprintf((char *)IObuff, ":%ld", qfp->qf_lnum);
-		else
-		    sprintf((char *)IObuff, ":%ld col %d",
-						   qfp->qf_lnum, qfp->qf_col);
-		sprintf((char *)IObuff + STRLEN(IObuff), "%s:",
-				  (char *)qf_types(qfp->qf_type, qfp->qf_nr));
-		msg_puts_attr(IObuff, hl_attr(HLF_N));
-		if (qfp->qf_pattern != NULL)
-		{
-		    qf_fmt_text(qfp->qf_pattern, IObuff, IOSIZE);
-		    STRCAT(IObuff, ":");
-		    msg_puts(IObuff);
-		}
-		msg_puts((char_u *)" ");
 
-		/* Remove newlines and leading whitespace from the text.
-		 * For an unrecognized line keep the indent, the compiler may
-		 * mark a word with ^^^^. */
-		qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
+	    fname = NULL;
+	    if (qfp->qf_fnum != 0
+			      && (buf = buflist_findnr(qfp->qf_fnum)) != NULL)
+	    {
+		fname = buf->b_fname;
+		if (qfp->qf_type == 1)	/* :helpgrep */
+		    fname = gettail(fname);
+	    }
+	    if (fname == NULL)
+		sprintf((char *)IObuff, "%2d", i);
+	    else
+		vim_snprintf((char *)IObuff, IOSIZE, "%2d %s",
+							    i, (char *)fname);
+	    msg_outtrans_attr(IObuff, i == qf_lists[qf_curlist].qf_index
+					   ? hl_attr(HLF_L) : hl_attr(HLF_D));
+	    if (qfp->qf_lnum == 0)
+		IObuff[0] = NUL;
+	    else if (qfp->qf_col == 0)
+		sprintf((char *)IObuff, ":%ld", qfp->qf_lnum);
+	    else
+		sprintf((char *)IObuff, ":%ld col %d",
+						   qfp->qf_lnum, qfp->qf_col);
+	    sprintf((char *)IObuff + STRLEN(IObuff), "%s:",
+				  (char *)qf_types(qfp->qf_type, qfp->qf_nr));
+	    msg_puts_attr(IObuff, hl_attr(HLF_N));
+	    if (qfp->qf_pattern != NULL)
+	    {
+		qf_fmt_text(qfp->qf_pattern, IObuff, IOSIZE);
+		STRCAT(IObuff, ":");
+		msg_puts(IObuff);
+	    }
+	    msg_puts((char_u *)" ");
+
+	    /* Remove newlines and leading whitespace from the text.  For an
+	     * unrecognized line keep the indent, the compiler may mark a word
+	     * with ^^^^. */
+	    qf_fmt_text((fname != NULL || qfp->qf_lnum != 0)
 				     ? skipwhite(qfp->qf_text) : qfp->qf_text,
 							      IObuff, IOSIZE);
-		msg_prt_line(IObuff, FALSE);
-		out_flush();		/* show one line at a time */
-		need_return = TRUE;
-		last_printed = i;
-	    }
+	    msg_prt_line(IObuff, FALSE);
+	    out_flush();		/* show one line at a time */
+	    need_return = TRUE;
 	}
-	if (more_back)
-	{
-	    /* scrolling backwards from the more-prompt */
-	    /* TODO: compute the number of items from the screen lines */
-	    more_back = more_back * 2 - 1;
-	    while (i > last_printed - more_back && i > idx1)
-	    {
-		do
-		{
-		    qfp = qfp->qf_prev;
-		    --i;
-		}
-		while (i > idx1 && !qfp->qf_valid && !all);
-	    }
-	    more_back = 0;
-	}
-	else
-	{
-	    qfp = qfp->qf_next;
-	    ++i;
-	}
+
+	qfp = qfp->qf_next;
+	++i;
 	ui_breakcheck();
     }
-    more_back_used = FALSE;
 }
 
 /*
@@ -2330,7 +2366,7 @@
 }
 
 /*
- * ":cfile" command.
+ * ":cfile"/":cgetfile"/":caddfile" commands.
  */
     void
 ex_cfile(eap)
@@ -2338,7 +2374,19 @@
 {
     if (*eap->arg != NUL)
 	set_string_option_direct((char_u *)"ef", -1, eap->arg, OPT_FREE);
-    if (qf_init(p_ef, p_efm, TRUE) > 0 && eap->cmdidx == CMD_cfile)
+
+    /*
+     * This function is used by the :cfile, :cgetfile and :caddfile
+     * commands.
+     * :cfile always creates a new quickfix list and jumps to the
+     * first error.
+     * :cgetfile creates a new quickfix list but doesn't jump to the
+     * first error.
+     * :caddfile adds to an existing quickfix list. If there is no
+     * quickfix list then a new list is created.
+     */
+    if (qf_init(p_ef, p_efm, eap->cmdidx != CMD_caddfile) > 0
+						  && eap->cmdidx == CMD_cfile)
 	qf_jump(0, 0, eap->forceit);		/* display first error */
 }
 
@@ -2917,11 +2965,32 @@
 		|| eap->line2 < 1 || eap->line2 > buf->b_ml.ml_line_count)
 	    EMSG(_(e_invrange));
 	else
-	    qf_init_ext(NULL, buf, p_efm, TRUE, eap->line1, eap->line2);
+	    qf_init_ext(NULL, buf, NULL, p_efm, TRUE, eap->line1, eap->line2);
     }
 }
 
 /*
+ * ":cexpr {expr}" command.
+ */
+    void
+ex_cexpr(eap)
+    exarg_T	*eap;
+{
+    typval_T	*tv;
+
+    tv = eval_expr(eap->arg, NULL);
+    if (!tv || (tv->v_type != VAR_STRING && tv->v_type != VAR_LIST) ||
+	(tv->v_type == VAR_STRING && !tv->vval.v_string) ||
+	(tv->v_type == VAR_LIST && !tv->vval.v_list))
+	return;
+
+    if (qf_init_ext(NULL, NULL, tv, p_efm, TRUE, (linenr_T)0, (linenr_T)0) > 0)
+	qf_jump(0, 0, eap->forceit);		/* display first error */
+
+    clear_tv(tv);
+}
+
+/*
  * ":helpgrep {pattern}"
  */
     void
