diff src/ex_docmd.c @ 16515:6e87a69b8e0c v8.1.1261

patch 8.1.1261: no error for quickfix commands with negative range commit https://github.com/vim/vim/commit/25190db225d63e185e77e043e694ef455b3cf304 Author: Bram Moolenaar <Bram@vim.org> Date: Sat May 4 15:05:28 2019 +0200 patch 8.1.1261: no error for quickfix commands with negative range Problem: No error for quickfix commands with negative range. Solution: Add ADDR_UNSIGNED and use it for quickfix commands. Make assert_fails() show the command if the error doesn't match.
author Bram Moolenaar <Bram@vim.org>
date Sat, 04 May 2019 15:15:05 +0200
parents 28e3ba82d8c8
children bcc343175103
line wrap: on
line diff
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -1786,7 +1786,7 @@ do_one_cmd(
  * is equal to the lower.
  */
 
-    /* ea.addr_type for user commands is set by find_ucmd */
+    // ea.addr_type for user commands is set by find_ucmd
     if (!IS_USER_CMDIDX(ea.cmdidx))
     {
 	if (ea.cmdidx != CMD_SIZE)
@@ -1794,9 +1794,14 @@ do_one_cmd(
 	else
 	    ea.addr_type = ADDR_LINES;
 
-	/* :wincmd range depends on the argument. */
+	// :wincmd range depends on the argument.
 	if (ea.cmdidx == CMD_wincmd && p != NULL)
 	    get_wincmd_addr_type(skipwhite(p), &ea);
+#ifdef FEAT_QUICKFIX
+	// :.cc in quickfix window uses line number
+	if ((ea.cmdidx == CMD_cc || ea.cmdidx == CMD_ll) && bt_quickfix(curbuf))
+	    ea.addr_type = ADDR_OTHER;
+#endif
     }
 
     ea.cmd = cmd;
@@ -2229,15 +2234,17 @@ do_one_cmd(
 		else
 		    ea.line2 = ARGCOUNT;
 		break;
-	    case ADDR_QUICKFIX:
+	    case ADDR_QUICKFIX_VALID:
 #ifdef FEAT_QUICKFIX
-		ea.line2 = qf_get_size(&ea);
+		ea.line2 = qf_get_valid_size(&ea);
 		if (ea.line2 == 0)
 		    ea.line2 = 1;
 #endif
 		break;
 	    case ADDR_NONE:
-		iemsg(_("INTERNAL: Cannot use DFLALL with ADDR_NONE"));
+	    case ADDR_UNSIGNED:
+	    case ADDR_QUICKFIX:
+		iemsg(_("INTERNAL: Cannot use DFLALL with ADDR_NONE, ADDR_UNSIGNED or ADDR_QUICKFIX"));
 		break;
 	}
     }
@@ -2905,10 +2912,16 @@ parse_cmd_address(exarg_T *eap, char **e
 		eap->line2 = CURRENT_TAB_NR;
 		break;
 	    case ADDR_TABS_RELATIVE:
+	    case ADDR_UNSIGNED:
 		eap->line2 = 1;
 		break;
 	    case ADDR_QUICKFIX:
 #ifdef FEAT_QUICKFIX
+		eap->line2 = qf_get_cur_idx(eap);
+#endif
+		break;
+	    case ADDR_QUICKFIX_VALID:
+#ifdef FEAT_QUICKFIX
 		eap->line2 = qf_get_cur_valid_idx(eap);
 #endif
 		break;
@@ -2969,6 +2982,8 @@ parse_cmd_address(exarg_T *eap, char **e
 			}
 			break;
 		    case ADDR_TABS_RELATIVE:
+		    case ADDR_UNSIGNED:
+		    case ADDR_QUICKFIX:
 			*errormsg = _(e_invrange);
 			return FAIL;
 		    case ADDR_ARGUMENTS:
@@ -2980,10 +2995,10 @@ parse_cmd_address(exarg_T *eap, char **e
 			    eap->line2 = ARGCOUNT;
 			}
 			break;
-		    case ADDR_QUICKFIX:
+		    case ADDR_QUICKFIX_VALID:
 #ifdef FEAT_QUICKFIX
 			eap->line1 = 1;
-			eap->line2 = qf_get_size(eap);
+			eap->line2 = qf_get_valid_size(eap);
 			if (eap->line2 == 0)
 			    eap->line2 = 1;
 #endif
@@ -3102,7 +3117,7 @@ append_command(char_u *cmd)
 /*
  * Find an Ex command by its name, either built-in or user.
  * Start of the name can be found at eap->cmd.
- * Returns pointer to char after the command name.
+ * Sets eap->cmdidx and returns a pointer to char after the command name.
  * "full" is set to TRUE if the whole command name matched.
  * Returns NULL for an ambiguous user command.
  */
@@ -4268,12 +4283,18 @@ get_address(
 			break;
 		    case ADDR_TABS_RELATIVE:
 		    case ADDR_NONE:
+		    case ADDR_UNSIGNED:
 			emsg(_(e_invrange));
 			cmd = NULL;
 			goto error;
 			break;
 		    case ADDR_QUICKFIX:
 #ifdef FEAT_QUICKFIX
+			lnum = qf_get_cur_idx(eap);
+#endif
+			break;
+		    case ADDR_QUICKFIX_VALID:
+#ifdef FEAT_QUICKFIX
 			lnum = qf_get_cur_valid_idx(eap);
 #endif
 			break;
@@ -4312,6 +4333,7 @@ get_address(
 			break;
 		    case ADDR_TABS_RELATIVE:
 		    case ADDR_NONE:
+		    case ADDR_UNSIGNED:
 			emsg(_(e_invrange));
 			cmd = NULL;
 			goto error;
@@ -4323,6 +4345,13 @@ get_address(
 			    lnum = 1;
 #endif
 			break;
+		    case ADDR_QUICKFIX_VALID:
+#ifdef FEAT_QUICKFIX
+			lnum = qf_get_valid_size(eap);
+			if (lnum == 0)
+			    lnum = 1;
+#endif
+			break;
 		}
 		break;
 
@@ -4503,10 +4532,17 @@ get_address(
 			break;
 		    case ADDR_QUICKFIX:
 #ifdef FEAT_QUICKFIX
+			lnum = qf_get_cur_idx(eap);
+#endif
+			break;
+		    case ADDR_QUICKFIX_VALID:
+#ifdef FEAT_QUICKFIX
 			lnum = qf_get_cur_valid_idx(eap);
 #endif
 			break;
 		    case ADDR_NONE:
+		    case ADDR_UNSIGNED:
+			lnum = 0;
 			break;
 		}
 	    }
@@ -4603,6 +4639,7 @@ ex_script_ni(exarg_T *eap)
 invalid_range(exarg_T *eap)
 {
     buf_T	*buf;
+
     if (       eap->line1 < 0
 	    || eap->line2 < 0
 	    || eap->line1 > eap->line2)
@@ -4664,10 +4701,22 @@ invalid_range(exarg_T *eap)
 		break;
 	    case ADDR_QUICKFIX:
 #ifdef FEAT_QUICKFIX
-		if (eap->line2 != 1 && eap->line2 > qf_get_size(eap))
+		// No error for value that is too big, will use the last entry.
+		if (eap->line2 <= 0)
 		    return _(e_invrange);
 #endif
 		break;
+	    case ADDR_QUICKFIX_VALID:
+#ifdef FEAT_QUICKFIX
+		if ((eap->line2 != 1 && eap->line2 > qf_get_valid_size(eap))
+			|| eap->line2 < 0)
+		    return _(e_invrange);
+#endif
+		break;
+	    case ADDR_UNSIGNED:
+		if (eap->line2 < 0)
+		    return _(e_invrange);
+		break;
 	    case ADDR_NONE:
 		// Will give an error elsewhere.
 		break;