diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c
index 81f2c8f5b..c83dd3f71 100644
--- a/src/ex_cmds2.c
+++ b/src/ex_cmds2.c
@@ -944,6 +944,7 @@ ex_listdo(exarg_T *eap)
     tabpage_T	*tp;
     buf_T	*buf = curbuf;
     int		next_fnum = 0;
+    int		save_did_emsg;
 #if defined(FEAT_SYN_HL)
     char_u	*save_ei = NULL;
 #endif
@@ -1042,6 +1043,8 @@ ex_listdo(exarg_T *eap)
 	    setpcmark();
 	listcmd_busy = TRUE;	    /* avoids setting pcmark below */
 
+	save_did_emsg = did_emsg;
+	did_emsg = FALSE;
 	while (!got_int && buf != NULL)
 	{
 	    if (eap->cmdidx == CMD_argdo)
@@ -1130,7 +1133,7 @@ ex_listdo(exarg_T *eap)
 	    if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
 		    || eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
 	    {
-		if (i >= qf_size || i >= eap->line2)
+		if (did_emsg || i >= qf_size || i >= eap->line2)
 		    break;
 
 		qf_idx = qf_get_cur_idx(eap);
@@ -1159,6 +1162,7 @@ ex_listdo(exarg_T *eap)
 		break;
 	}
 	listcmd_busy = FALSE;
+	did_emsg = save_did_emsg;
     }
 
 #if defined(FEAT_SYN_HL)
