Patch 8.1.1261
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.
Files: src/ex_cmds.h, src/ex_docmd.c, src/testdir/test_quickfix.vim,
runtime/doc/quickfix.txt, src/eval.c, src/quickfix.c,
src/proto/quickfix.pro, src/ex_cmds2.c
*** ../vim-8.1.1260/src/ex_cmds.h 2019-05-03 21:56:31.363540578 +0200
--- src/ex_cmds.h 2019-05-04 14:45:32.177702667 +0200
***************
*** 73,80 ****
ADDR_BUFFERS, // buffer number
ADDR_TABS, // tab page number
ADDR_TABS_RELATIVE, // Tab page that only relative
ADDR_QUICKFIX, // quickfix list entry number
! ADDR_OTHER, // something else
ADDR_NONE // no range used
} cmd_addr_T;
#endif
--- 73,82 ----
ADDR_BUFFERS, // buffer number
ADDR_TABS, // tab page number
ADDR_TABS_RELATIVE, // Tab page that only relative
+ ADDR_QUICKFIX_VALID, // quickfix list valid entry number
ADDR_QUICKFIX, // quickfix list entry number
! ADDR_UNSIGNED, // positive count or zero, defaults to 1
! ADDR_OTHER, // something else, use line number for '$',
'%', etc.
ADDR_NONE // no range used
} cmd_addr_T;
#endif
***************
*** 92,98 ****
* Not supported commands are included to avoid ambiguities.
*/
#ifdef EX
! # undef EX /* just in case */
#endif
#ifdef DO_DECLARE_EXCMD
# define EX(a, b, c, d, e) {(char_u *)b, c, (long_u)(d), e}
--- 94,100 ----
* Not supported commands are included to avoid ambiguities.
*/
#ifdef EX
! # undef EX // just in case
#endif
#ifdef DO_DECLARE_EXCMD
# define EX(a, b, c, d, e) {(char_u *)b, c, (long_u)(d), e}
***************
*** 242,251 ****
ADDR_LINES),
EX(CMD_cNext, "cNext", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_cNfile, "cNfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_cabbrev, "cabbrev", ex_abbreviate,
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
ADDR_NONE),
--- 244,253 ----
ADDR_LINES),
EX(CMD_cNext, "cNext", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_cNfile, "cNfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_cabbrev, "cabbrev", ex_abbreviate,
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
ADDR_NONE),
***************
*** 253,260 ****
EXTRA|TRLBAR|CMDWIN,
ADDR_NONE),
EX(CMD_cabove, "cabove", ex_cbelow,
! RANGE|TRLBAR,
! ADDR_OTHER),
EX(CMD_caddbuffer, "caddbuffer", ex_cbuffer,
RANGE|WORD1|TRLBAR,
ADDR_OTHER),
--- 255,262 ----
EXTRA|TRLBAR|CMDWIN,
ADDR_NONE),
EX(CMD_cabove, "cabove", ex_cbelow,
! RANGE|COUNT|TRLBAR,
! ADDR_UNSIGNED),
EX(CMD_caddbuffer, "caddbuffer", ex_cbuffer,
RANGE|WORD1|TRLBAR,
ADDR_OTHER),
***************
*** 274,287 ****
BANG|RANGE|WORD1|TRLBAR,
ADDR_OTHER),
EX(CMD_cbelow, "cbelow", ex_cbelow,
! RANGE|TRLBAR,
! ADDR_OTHER),
EX(CMD_cbottom, "cbottom", ex_cbottom,
TRLBAR,
ADDR_NONE),
EX(CMD_cc, "cc", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_cclose, "cclose", ex_cclose,
TRLBAR,
ADDR_NONE),
--- 276,289 ----
BANG|RANGE|WORD1|TRLBAR,
ADDR_OTHER),
EX(CMD_cbelow, "cbelow", ex_cbelow,
! RANGE|COUNT|TRLBAR,
! ADDR_UNSIGNED),
EX(CMD_cbottom, "cbottom", ex_cbottom,
TRLBAR,
ADDR_NONE),
EX(CMD_cc, "cc", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_QUICKFIX),
EX(CMD_cclose, "cclose", ex_cclose,
TRLBAR,
ADDR_NONE),
***************
*** 290,296 ****
ADDR_NONE),
EX(CMD_cdo, "cdo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|DFLALL,
! ADDR_QUICKFIX),
EX(CMD_center, "center", ex_align,
TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
ADDR_LINES),
--- 292,298 ----
ADDR_NONE),
EX(CMD_cdo, "cdo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|DFLALL,
! ADDR_QUICKFIX_VALID),
EX(CMD_center, "center", ex_align,
TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
ADDR_LINES),
***************
*** 302,311 ****
ADDR_NONE),
EX(CMD_cfdo, "cfdo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|DFLALL,
! ADDR_QUICKFIX),
EX(CMD_cfirst, "cfirst", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_cgetfile, "cgetfile", ex_cfile,
TRLBAR|FILE1,
ADDR_NONE),
--- 304,313 ----
ADDR_NONE),
EX(CMD_cfdo, "cfdo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|DFLALL,
! ADDR_QUICKFIX_VALID),
EX(CMD_cfirst, "cfirst", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_cgetfile, "cgetfile", ex_cfile,
TRLBAR|FILE1,
ADDR_NONE),
***************
*** 335,341 ****
ADDR_NONE),
EX(CMD_clast, "clast", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_close, "close", ex_close,
BANG|RANGE|COUNT|TRLBAR|CMDWIN,
ADDR_WINDOWS),
--- 337,343 ----
ADDR_NONE),
EX(CMD_clast, "clast", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_close, "close", ex_close,
BANG|RANGE|COUNT|TRLBAR|CMDWIN,
ADDR_WINDOWS),
***************
*** 353,365 ****
ADDR_OTHER),
EX(CMD_cnext, "cnext", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_cnewer, "cnewer", qf_age,
RANGE|COUNT|TRLBAR,
! ADDR_OTHER),
EX(CMD_cnfile, "cnfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_cnoremap, "cnoremap", ex_map,
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
ADDR_NONE),
--- 355,367 ----
ADDR_OTHER),
EX(CMD_cnext, "cnext", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_cnewer, "cnewer", qf_age,
RANGE|COUNT|TRLBAR,
! ADDR_UNSIGNED),
EX(CMD_cnfile, "cnfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_cnoremap, "cnoremap", ex_map,
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN,
ADDR_NONE),
***************
*** 374,380 ****
ADDR_LINES),
EX(CMD_colder, "colder", qf_age,
RANGE|COUNT|TRLBAR,
! ADDR_OTHER),
EX(CMD_colorscheme, "colorscheme", ex_colorscheme,
WORD1|TRLBAR|CMDWIN,
ADDR_NONE),
--- 376,382 ----
ADDR_LINES),
EX(CMD_colder, "colder", qf_age,
RANGE|COUNT|TRLBAR,
! ADDR_UNSIGNED),
EX(CMD_colorscheme, "colorscheme", ex_colorscheme,
WORD1|TRLBAR|CMDWIN,
ADDR_NONE),
***************
*** 398,404 ****
ADDR_OTHER),
EX(CMD_cprevious, "cprevious", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_cpfile, "cpfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
ADDR_OTHER),
--- 400,406 ----
ADDR_OTHER),
EX(CMD_cprevious, "cprevious", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_cpfile, "cpfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
ADDR_OTHER),
***************
*** 407,413 ****
ADDR_NONE),
EX(CMD_crewind, "crewind", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_cscope, "cscope", ex_cscope,
EXTRA|NOTRLCOM|XFILE,
ADDR_NONE),
--- 409,415 ----
ADDR_NONE),
EX(CMD_crewind, "crewind", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_cscope, "cscope", ex_cscope,
EXTRA|NOTRLCOM|XFILE,
ADDR_NONE),
***************
*** 725,740 ****
ADDR_LINES),
EX(CMD_lNext, "lNext", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_lNfile, "lNfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_last, "last", ex_last,
EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR,
ADDR_NONE),
EX(CMD_labove, "labove", ex_cbelow,
! RANGE|TRLBAR,
! ADDR_OTHER),
EX(CMD_language, "language", ex_language,
EXTRA|TRLBAR|CMDWIN,
ADDR_NONE),
--- 727,742 ----
ADDR_LINES),
EX(CMD_lNext, "lNext", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_lNfile, "lNfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_last, "last", ex_last,
EXTRA|BANG|EDITCMD|ARGOPT|TRLBAR,
ADDR_NONE),
EX(CMD_labove, "labove", ex_cbelow,
! RANGE|COUNT|TRLBAR,
! ADDR_UNSIGNED),
EX(CMD_language, "language", ex_language,
EXTRA|TRLBAR|CMDWIN,
ADDR_NONE),
***************
*** 754,761 ****
BANG|RANGE|WORD1|TRLBAR,
ADDR_OTHER),
EX(CMD_lbelow, "lbelow", ex_cbelow,
! RANGE|TRLBAR,
! ADDR_OTHER),
EX(CMD_lbottom, "lbottom", ex_cbottom,
TRLBAR,
ADDR_NONE),
--- 756,763 ----
BANG|RANGE|WORD1|TRLBAR,
ADDR_OTHER),
EX(CMD_lbelow, "lbelow", ex_cbelow,
! RANGE|COUNT|TRLBAR,
! ADDR_UNSIGNED),
EX(CMD_lbottom, "lbottom", ex_cbottom,
TRLBAR,
ADDR_NONE),
***************
*** 773,779 ****
ADDR_NONE),
EX(CMD_ldo, "ldo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|DFLALL,
! ADDR_QUICKFIX),
EX(CMD_left, "left", ex_align,
TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
ADDR_LINES),
--- 775,781 ----
ADDR_NONE),
EX(CMD_ldo, "ldo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|DFLALL,
! ADDR_QUICKFIX_VALID),
EX(CMD_left, "left", ex_align,
TRLBAR|RANGE|WHOLEFOLD|EXTRA|CMDWIN|MODIFY,
ADDR_LINES),
***************
*** 791,800 ****
ADDR_NONE),
EX(CMD_lfdo, "lfdo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|DFLALL,
! ADDR_QUICKFIX),
EX(CMD_lfirst, "lfirst", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_lgetfile, "lgetfile", ex_cfile,
TRLBAR|FILE1,
ADDR_NONE),
--- 793,802 ----
ADDR_NONE),
EX(CMD_lfdo, "lfdo", ex_listdo,
BANG|NEEDARG|EXTRA|NOTRLCOM|RANGE|DFLALL,
! ADDR_QUICKFIX_VALID),
EX(CMD_lfirst, "lfirst", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_lgetfile, "lgetfile", ex_cfile,
TRLBAR|FILE1,
ADDR_NONE),
***************
*** 818,827 ****
ADDR_NONE),
EX(CMD_ll, "ll", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_llast, "llast", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_llist, "llist", qf_list,
BANG|EXTRA|TRLBAR|CMDWIN,
ADDR_NONE),
--- 820,829 ----
ADDR_NONE),
EX(CMD_ll, "ll", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_QUICKFIX),
EX(CMD_llast, "llast", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_llist, "llist", qf_list,
BANG|EXTRA|TRLBAR|CMDWIN,
ADDR_NONE),
***************
*** 839,851 ****
ADDR_NONE),
EX(CMD_lnext, "lnext", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_lnewer, "lnewer", qf_age,
RANGE|COUNT|TRLBAR,
! ADDR_OTHER),
EX(CMD_lnfile, "lnfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_loadview, "loadview", ex_loadview,
FILE1|TRLBAR,
ADDR_NONE),
--- 841,853 ----
ADDR_NONE),
EX(CMD_lnext, "lnext", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_lnewer, "lnewer", qf_age,
RANGE|COUNT|TRLBAR,
! ADDR_UNSIGNED),
EX(CMD_lnfile, "lnfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_loadview, "loadview", ex_loadview,
FILE1|TRLBAR,
ADDR_NONE),
***************
*** 860,878 ****
ADDR_NONE),
EX(CMD_lolder, "lolder", qf_age,
RANGE|COUNT|TRLBAR,
! ADDR_OTHER),
EX(CMD_lopen, "lopen", ex_copen,
RANGE|COUNT|TRLBAR,
ADDR_OTHER),
EX(CMD_lprevious, "lprevious", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_lpfile, "lpfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
ADDR_OTHER),
EX(CMD_lrewind, "lrewind", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_OTHER),
EX(CMD_ltag, "ltag", ex_tag,
TRLBAR|BANG|WORD1,
ADDR_NONE),
--- 862,880 ----
ADDR_NONE),
EX(CMD_lolder, "lolder", qf_age,
RANGE|COUNT|TRLBAR,
! ADDR_UNSIGNED),
EX(CMD_lopen, "lopen", ex_copen,
RANGE|COUNT|TRLBAR,
ADDR_OTHER),
EX(CMD_lprevious, "lprevious", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_lpfile, "lpfile", ex_cnext,
RANGE|COUNT|TRLBAR|BANG,
ADDR_OTHER),
EX(CMD_lrewind, "lrewind", ex_cc,
RANGE|COUNT|TRLBAR|BANG,
! ADDR_UNSIGNED),
EX(CMD_ltag, "ltag", ex_tag,
TRLBAR|BANG|WORD1,
ADDR_NONE),
*** ../vim-8.1.1260/src/ex_docmd.c 2019-05-03 21:56:31.363540578 +0200
--- src/ex_docmd.c 2019-05-04 14:56:42.118125419 +0200
***************
*** 1786,1792 ****
* is equal to the lower.
*/
! /* ea.addr_type for user commands is set by find_ucmd */
if (!IS_USER_CMDIDX(ea.cmdidx))
{
if (ea.cmdidx != CMD_SIZE)
--- 1786,1792 ----
* is equal to the lower.
*/
! // ea.addr_type for user commands is set by find_ucmd
if (!IS_USER_CMDIDX(ea.cmdidx))
{
if (ea.cmdidx != CMD_SIZE)
***************
*** 1794,1802 ****
else
ea.addr_type = ADDR_LINES;
! /* :wincmd range depends on the argument. */
if (ea.cmdidx == CMD_wincmd && p != NULL)
get_wincmd_addr_type(skipwhite(p), &ea);
}
ea.cmd = cmd;
--- 1794,1807 ----
else
ea.addr_type = ADDR_LINES;
! // :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,2243 ****
else
ea.line2 = ARGCOUNT;
break;
! case ADDR_QUICKFIX:
#ifdef FEAT_QUICKFIX
! ea.line2 = qf_get_size(&ea);
if (ea.line2 == 0)
ea.line2 = 1;
#endif
break;
case ADDR_NONE:
! iemsg(_("INTERNAL: Cannot use DFLALL with ADDR_NONE"));
break;
}
}
--- 2234,2250 ----
else
ea.line2 = ARGCOUNT;
break;
! case ADDR_QUICKFIX_VALID:
#ifdef FEAT_QUICKFIX
! ea.line2 = qf_get_valid_size(&ea);
if (ea.line2 == 0)
ea.line2 = 1;
#endif
break;
case ADDR_NONE:
! case ADDR_UNSIGNED:
! case ADDR_QUICKFIX:
! iemsg(_("INTERNAL: Cannot use DFLALL with ADDR_NONE,
ADDR_UNSIGNED or ADDR_QUICKFIX"));
break;
}
}
***************
*** 2905,2914 ****
--- 2912,2927 ----
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,2974 ****
--- 2982,2989 ----
}
break;
case ADDR_TABS_RELATIVE:
+ case ADDR_UNSIGNED:
+ case ADDR_QUICKFIX:
*errormsg = _(e_invrange);
return FAIL;
case ADDR_ARGUMENTS:
***************
*** 2980,2989 ****
eap->line2 = ARGCOUNT;
}
break;
! case ADDR_QUICKFIX:
#ifdef FEAT_QUICKFIX
eap->line1 = 1;
! eap->line2 = qf_get_size(eap);
if (eap->line2 == 0)
eap->line2 = 1;
#endif
--- 2995,3004 ----
eap->line2 = ARGCOUNT;
}
break;
! case ADDR_QUICKFIX_VALID:
#ifdef FEAT_QUICKFIX
eap->line1 = 1;
! eap->line2 = qf_get_valid_size(eap);
if (eap->line2 == 0)
eap->line2 = 1;
#endif
***************
*** 3102,3108 ****
/*
* 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.
* "full" is set to TRUE if the whole command name matched.
* Returns NULL for an ambiguous user command.
*/
--- 3117,3123 ----
/*
* Find an Ex command by its name, either built-in or user.
* Start of the name can be found at eap->cmd.
! * 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,4279 ****
--- 4283,4300 ----
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,4317 ****
--- 4333,4339 ----
break;
case ADDR_TABS_RELATIVE:
case ADDR_NONE:
+ case ADDR_UNSIGNED:
emsg(_(e_invrange));
cmd = NULL;
goto error;
***************
*** 4323,4328 ****
--- 4345,4357 ----
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,4512 ****
--- 4532,4548 ----
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,4608 ****
--- 4639,4645 ----
invalid_range(exarg_T *eap)
{
buf_T *buf;
+
if ( eap->line1 < 0
|| eap->line2 < 0
|| eap->line1 > eap->line2)
***************
*** 4664,4673 ****
break;
case ADDR_QUICKFIX:
#ifdef FEAT_QUICKFIX
! if (eap->line2 != 1 && eap->line2 > qf_get_size(eap))
return _(e_invrange);
#endif
break;
case ADDR_NONE:
// Will give an error elsewhere.
break;
--- 4701,4722 ----
break;
case ADDR_QUICKFIX:
#ifdef FEAT_QUICKFIX
! // 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;
*** ../vim-8.1.1260/src/testdir/test_quickfix.vim 2019-05-03
21:56:31.367540560 +0200
--- src/testdir/test_quickfix.vim 2019-05-04 14:33:20.713745971 +0200
***************
*** 28,34 ****
command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
command! -nargs=* -bang Xlast <mods>clast<bang> <args>
! command! -nargs=* -bang -range Xnfile <mods><count>cnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
command! -nargs=* Xexpr <mods>cexpr <args>
command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args>
--- 28,34 ----
command! -count -nargs=* -bang Xprev <mods><count>cprev<bang> <args>
command! -nargs=* -bang Xfirst <mods>cfirst<bang> <args>
command! -nargs=* -bang Xlast <mods>clast<bang> <args>
! command! -count -nargs=* -bang Xnfile <mods><count>cnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>cpfile<bang> <args>
command! -nargs=* Xexpr <mods>cexpr <args>
command! -range -nargs=* Xvimgrep <mods><count>vimgrep <args>
***************
*** 63,69 ****
command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
command! -nargs=* -bang Xlast <mods>llast<bang> <args>
! command! -nargs=* -bang -range Xnfile <mods><count>lnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
command! -nargs=* Xexpr <mods>lexpr <args>
command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
--- 63,69 ----
command! -count -nargs=* -bang Xprev <mods><count>lprev<bang> <args>
command! -nargs=* -bang Xfirst <mods>lfirst<bang> <args>
command! -nargs=* -bang Xlast <mods>llast<bang> <args>
! command! -count -nargs=* -bang Xnfile <mods><count>lnfile<bang> <args>
command! -nargs=* -bang Xpfile <mods>lpfile<bang> <args>
command! -nargs=* Xexpr <mods>lexpr <args>
command! -range -nargs=* Xvimgrep <mods><count>lvimgrep <args>
***************
*** 4126,4138 ****
" Invalid range
if a:cchar == 'c'
! call assert_fails('-2cbelow', 'E553:')
! " TODO: should go to first error in the current line?
! 0cabove
else
! call assert_fails('-2lbelow', 'E553:')
! " TODO: should go to first error in the current line?
! 0labove
endif
call delete('X1')
--- 4126,4134 ----
" Invalid range
if a:cchar == 'c'
! call assert_fails('-2cbelow', 'E16:')
else
! call assert_fails('-2lbelow', 'E16:')
endif
call delete('X1')
***************
*** 4145,4147 ****
--- 4141,4179 ----
call Xtest_below('c')
call Xtest_below('l')
endfunc
+
+ func Test_quickfix_count()
+ let commands = [
+ \ 'cNext',
+ \ 'cNfile',
+ \ 'cabove',
+ \ 'cbelow',
+ \ 'cfirst',
+ \ 'clast',
+ \ 'cnewer',
+ \ 'cnext',
+ \ 'cnfile',
+ \ 'colder',
+ \ 'cprevious',
+ \ 'crewind',
+ \
+ \ 'lNext',
+ \ 'lNfile',
+ \ 'labove',
+ \ 'lbelow',
+ \ 'lfirst',
+ \ 'llast',
+ \ 'lnewer',
+ \ 'lnext',
+ \ 'lnfile',
+ \ 'lolder',
+ \ 'lprevious',
+ \ 'lrewind',
+ \ ]
+ for cmd in commands
+ call assert_fails('-1' .. cmd, 'E16:')
+ call assert_fails('.' .. cmd, 'E16:')
+ call assert_fails('%' .. cmd, 'E16:')
+ call assert_fails('$' .. cmd, 'E16:')
+ endfor
+ endfunc
*** ../vim-8.1.1260/runtime/doc/quickfix.txt 2019-05-03 21:56:31.363540578
+0200
--- runtime/doc/quickfix.txt 2019-05-04 14:13:00.932098180 +0200
***************
*** 87,93 ****
*:cc*
:cc[!] [nr] Display error [nr]. If [nr] is omitted, the same
! error is displayed again. Without [!] this doesn't
work when jumping to another buffer, the current buffer
has been changed, there is the only window for the
buffer and both 'hidden' and 'autowrite' are off.
--- 87,93 ----
*:cc*
:cc[!] [nr] Display error [nr]. If [nr] is omitted, the same
! :[nr]cc[!] error is displayed again. Without [!] this doesn't
work when jumping to another buffer, the current buffer
has been changed, there is the only window for the
buffer and both 'hidden' and 'autowrite' are off.
***************
*** 96,105 ****
there is another window for this buffer.
The 'switchbuf' settings are respected when jumping
to a buffer.
*:ll*
:ll[!] [nr] Same as ":cc", except the location list for the
! current window is used instead of the quickfix list.
*:cn* *:cnext* *E553*
:[count]cn[ext][!] Display the [count] next error in the list that
--- 96,108 ----
there is another window for this buffer.
The 'switchbuf' settings are respected when jumping
to a buffer.
+ When used in the quickfix window the line number can
+ be used, including "." for the current line and "$"
+ for the last line.
*:ll*
:ll[!] [nr] Same as ":cc", except the location list for the
! :[nr]ll[!] current window is used instead of the quickfix list.
*:cn* *:cnext* *E553*
:[count]cn[ext][!] Display the [count] next error in the list that
*** ../vim-8.1.1260/src/eval.c 2019-04-27 20:36:52.530303581 +0200
--- src/eval.c 2019-05-04 14:31:49.086276905 +0200
***************
*** 9595,9608 ****
return ret;
}
int
assert_fails(typval_T *argvars)
{
char_u *cmd = tv_get_string_chk(&argvars[0]);
garray_T ga;
int ret = 0;
- char_u numbuf[NUMBUFLEN];
- char_u *tofree;
called_emsg = FALSE;
suppress_errthrow = TRUE;
--- 9595,9621 ----
return ret;
}
+ static void
+ assert_append_cmd_or_arg(garray_T *gap, typval_T *argvars, char_u *cmd)
+ {
+ char_u *tofree;
+ char_u numbuf[NUMBUFLEN];
+
+ if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN)
+ {
+ ga_concat(gap, echo_string(&argvars[2], &tofree, numbuf, 0));
+ vim_free(tofree);
+ }
+ else
+ ga_concat(gap, cmd);
+ }
+
int
assert_fails(typval_T *argvars)
{
char_u *cmd = tv_get_string_chk(&argvars[0]);
garray_T ga;
int ret = 0;
called_emsg = FALSE;
suppress_errthrow = TRUE;
***************
*** 9612,9625 ****
{
prepare_assert_error(&ga);
ga_concat(&ga, (char_u *)"command did not fail: ");
! if (argvars[1].v_type != VAR_UNKNOWN
! && argvars[2].v_type != VAR_UNKNOWN)
! {
! ga_concat(&ga, echo_string(&argvars[2], &tofree, numbuf, 0));
! vim_free(tofree);
! }
! else
! ga_concat(&ga, cmd);
assert_error(&ga);
ga_clear(&ga);
ret = 1;
--- 9625,9631 ----
{
prepare_assert_error(&ga);
ga_concat(&ga, (char_u *)"command did not fail: ");
! assert_append_cmd_or_arg(&ga, argvars, cmd);
assert_error(&ga);
ga_clear(&ga);
ret = 1;
***************
*** 9635,9640 ****
--- 9641,9648 ----
prepare_assert_error(&ga);
fill_assert_error(&ga, &argvars[2], NULL, &argvars[1],
&vimvars[VV_ERRMSG].vv_tv, ASSERT_OTHER);
+ ga_concat(&ga, (char_u *)": ");
+ assert_append_cmd_or_arg(&ga, argvars, cmd);
assert_error(&ga);
ga_clear(&ga);
ret = 1;
*** ../vim-8.1.1260/src/quickfix.c 2019-05-03 21:56:31.367540560 +0200
--- src/quickfix.c 2019-05-04 14:50:58.215954924 +0200
***************
*** 4828,4839 ****
}
/*
! * Returns the number of valid entries in the current quickfix/location list.
*/
int
qf_get_size(exarg_T *eap)
{
qf_info_T *qi;
qf_list_T *qfl;
qfline_T *qfp;
int i, sz = 0;
--- 4828,4852 ----
}
/*
! * Returns the number of entries in the current quickfix/location list.
*/
int
qf_get_size(exarg_T *eap)
{
qf_info_T *qi;
+
+ if ((qi = qf_cmd_get_stack(eap, FALSE)) == NULL)
+ return 0;
+ return qf_get_curlist(qi)->qf_count;
+ }
+
+ /*
+ * Returns the number of valid entries in the current quickfix/location list.
+ */
+ int
+ qf_get_valid_size(exarg_T *eap)
+ {
+ qf_info_T *qi;
qf_list_T *qfl;
qfline_T *qfp;
int i, sz = 0;
*** ../vim-8.1.1260/src/proto/quickfix.pro 2019-05-03 21:56:31.363540578
+0200
--- src/proto/quickfix.pro 2019-05-04 14:48:27.644759952 +0200
***************
*** 19,24 ****
--- 19,25 ----
int grep_internal(cmdidx_T cmdidx);
void ex_make(exarg_T *eap);
int qf_get_size(exarg_T *eap);
+ int qf_get_valid_size(exarg_T *eap);
int qf_get_cur_idx(exarg_T *eap);
int qf_get_cur_valid_idx(exarg_T *eap);
void ex_cc(exarg_T *eap);
*** ../vim-8.1.1260/src/ex_cmds2.c 2019-04-21 11:34:36.335256531 +0200
--- src/ex_cmds2.c 2019-05-04 14:46:24.961418476 +0200
***************
*** 2132,2138 ****
else if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
|| eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
{
! qf_size = qf_get_size(eap);
if (qf_size <= 0 || eap->line1 > qf_size)
buf = NULL;
else
--- 2132,2138 ----
else if (eap->cmdidx == CMD_cdo || eap->cmdidx == CMD_ldo
|| eap->cmdidx == CMD_cfdo || eap->cmdidx == CMD_lfdo)
{
! qf_size = qf_get_valid_size(eap);
if (qf_size <= 0 || eap->line1 > qf_size)
buf = NULL;
else
*** ../vim-8.1.1260/src/version.c 2019-05-04 14:05:05.210240329 +0200
--- src/version.c 2019-05-04 14:05:40.050094734 +0200
***************
*** 769,770 ****
--- 769,772 ----
{ /* Add new patch number below this line */
+ /**/
+ 1261,
/**/
--
I just planted an Algebra tree. It has square roots.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.