Problem: Ex command error cannot contain an argument.
Solution: Add ex_errmsg() and translate earlier. Use e_trailing_arg where
possible.
if (addr_count == 2)
{
if (*arg) // both range and argument is not allowed
- return _(e_trailing);
+ return ex_errmsg(e_trailing_arg, arg);
bnr = start_bnr;
}
else // addr_count == 1
ea.errmsg = NULL;
(cmdnames[ea.cmdidx].cmd_func)(&ea);
if (ea.errmsg != NULL)
- errormsg = _(ea.errmsg);
+ errormsg = ea.errmsg;
}
#ifdef FEAT_EVAL
#pragma optimize( "", on )
#endif
+static char ex_error_buf[MSG_BUF_LEN];
+
+/*
+ * Return an error message with argument included.
+ * Uses a static buffer, only the last error will be kept.
+ * "msg" will be translated, caller should use N_().
+ */
+ char *
+ex_errmsg(char *msg, char_u *arg)
+{
+ vim_snprintf(ex_error_buf, MSG_BUF_LEN, _(msg), arg);
+ return ex_error_buf;
+}
+
/*
* Parse and skip over command modifiers:
* - update eap->cmd
ex_ni(exarg_T *eap)
{
if (!eap->skip)
- eap->errmsg = N_("E319: Sorry, the command is not available in this version");
+ eap->errmsg =
+ _("E319: Sorry, the command is not available in this version");
}
#ifdef HAVE_EX_SCRIPT_NI
if (secure)
{
secure = 2;
- eap->errmsg = e_curdir;
+ eap->errmsg = _(e_curdir);
}
else if (eap->cmdidx == CMD_autocmd)
do_autocmd(eap->arg, eap->forceit);
if (ERROR_IF_ANY_POPUP_WINDOW)
return;
if (*eap->arg)
- eap->errmsg = e_trailing;
+ eap->errmsg = ex_errmsg(e_trailing_arg, eap->arg);
else
{
if (eap->addr_count == 0) // default is current buffer
|| tab_number > LAST_TAB_NR)
{
// No numbers as argument.
- eap->errmsg = e_invarg;
+ eap->errmsg = ex_errmsg(e_invarg2, eap->arg);
goto theend;
}
}
|| tab_number == 0)
{
// No numbers as argument.
- eap->errmsg = e_invarg;
+ eap->errmsg = ex_errmsg(e_invarg2, eap->arg);
goto theend;
}
tab_number = tab_number * relative + tabpage_index(curtab);
--tab_number;
}
if (tab_number < unaccept_arg0 || tab_number > LAST_TAB_NR)
- eap->errmsg = e_invarg;
+ eap->errmsg = ex_errmsg(e_invarg2, eap->arg);
}
else if (eap->addr_count > 0)
{
if (unaccept_arg0 && eap->line2 == 0)
{
- eap->errmsg = e_invrange;
+ eap->errmsg = _(e_invrange);
tab_number = 0;
}
else
{
--tab_number;
if (tab_number < unaccept_arg0)
- eap->errmsg = e_invarg;
+ eap->errmsg = _(e_invrange);
}
}
}
static void
ex_wrongmodifier(exarg_T *eap)
{
- eap->errmsg = e_invcmd;
+ eap->errmsg = _(e_invcmd);
}
/*
|| tab_number == 0)
{
// No numbers as argument.
- eap->errmsg = e_invarg;
+ eap->errmsg = ex_errmsg(e_invarg2, eap->arg);
return;
}
}
tab_number = eap->line2;
if (tab_number < 1)
{
- eap->errmsg = e_invrange;
+ eap->errmsg = _(e_invrange);
return;
}
}
static void
ex_nogui(exarg_T *eap)
{
- eap->errmsg = e_nogvim;
+ eap->errmsg = _(e_nogvim);
}
#endif
// Check for trailing illegal characters
if (!ends_excmd2(eap->arg, p))
- eap->errmsg = e_trailing;
+ eap->errmsg = ex_errmsg(e_trailing_arg, p);
else
eap->nextcmd = check_nextcmd(p);
}
cstack_T *cstack = eap->cstack;
if (cstack->cs_idx == CSTACK_LEN - 1)
- eap->errmsg = N_("E579: :if nesting too deep");
+ eap->errmsg = _("E579: :if nesting too deep");
else
{
++cstack->cs_idx;
if (eap->cstack->cs_idx < 0
|| (eap->cstack->cs_flags[eap->cstack->cs_idx]
& (CSF_WHILE | CSF_FOR | CSF_TRY)))
- eap->errmsg = N_(e_endif_without_if);
+ eap->errmsg = _(e_endif_without_if);
else
{
/*
{
if (eap->cmdidx == CMD_else)
{
- eap->errmsg = N_(e_else_without_if);
+ eap->errmsg = _(e_else_without_if);
return;
}
- eap->errmsg = N_(e_elseif_without_if);
+ eap->errmsg = _(e_elseif_without_if);
skip = TRUE;
}
else if (cstack->cs_flags[cstack->cs_idx] & CSF_ELSE)
{
if (eap->cmdidx == CMD_else)
{
- eap->errmsg = N_("E583: multiple :else");
+ eap->errmsg = _("E583: multiple :else");
return;
}
- eap->errmsg = N_("E584: :elseif after :else");
+ eap->errmsg = _("E584: :elseif after :else");
skip = TRUE;
}
cstack_T *cstack = eap->cstack;
if (cstack->cs_idx == CSTACK_LEN - 1)
- eap->errmsg = N_("E585: :while/:for nesting too deep");
+ eap->errmsg = _("E585: :while/:for nesting too deep");
else
{
/*
cstack_T *cstack = eap->cstack;
if (cstack->cs_looplevel <= 0 || cstack->cs_idx < 0)
- eap->errmsg = N_(e_continue);
+ eap->errmsg = _(e_continue);
else
{
// Try to find the matching ":while". This might stop at a try
cstack_T *cstack = eap->cstack;
if (cstack->cs_looplevel <= 0 || cstack->cs_idx < 0)
- eap->errmsg = N_(e_break);
+ eap->errmsg = _(e_break);
else
{
// Inactivate conditionals until the matching ":while" or a try
}
if (cstack->cs_looplevel <= 0 || cstack->cs_idx < 0)
- eap->errmsg = err;
+ eap->errmsg = _(err);
else
{
fl = cstack->cs_flags[cstack->cs_idx];
if (!(fl & (CSF_WHILE | CSF_FOR)))
{
if (!(fl & CSF_TRY))
- eap->errmsg = e_endif;
+ eap->errmsg = _(e_endif);
else if (fl & CSF_FINALLY)
- eap->errmsg = e_endtry;
+ eap->errmsg = _(e_endtry);
// Try to find the matching ":while" and report what's missing.
for (idx = cstack->cs_idx; idx > 0; --idx)
{
{
// Give up at a try conditional not in its finally clause.
// Ignore the ":endwhile"/":endfor".
- eap->errmsg = err;
+ eap->errmsg = _(err);
return;
}
if (fl & csf)
cstack_T *cstack = eap->cstack;
if (cstack->cs_idx == CSTACK_LEN - 1)
- eap->errmsg = N_("E601: :try nesting too deep");
+ eap->errmsg = _("E601: :try nesting too deep");
else
{
++cstack->cs_idx;
if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0)
{
- eap->errmsg = e_catch;
+ eap->errmsg = _(e_catch);
give_up = TRUE;
}
else
{
// Give up for a ":catch" after ":finally" and ignore it.
// Just parse.
- eap->errmsg = N_("E604: :catch after :finally");
+ eap->errmsg = _("E604: :catch after :finally");
give_up = TRUE;
}
else
cstack_T *cstack = eap->cstack;
if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0)
- eap->errmsg = e_finally;
+ eap->errmsg = _(e_finally);
else
{
if (!(cstack->cs_flags[cstack->cs_idx] & CSF_TRY))
if (cstack->cs_flags[idx] & CSF_FINALLY)
{
// Give up for a multiple ":finally" and ignore it.
- eap->errmsg = e_finally_dup;
+ eap->errmsg = _(e_finally_dup);
return;
}
rewind_conditionals(cstack, idx, CSF_WHILE | CSF_FOR,
cstack_T *cstack = eap->cstack;
if (cstack->cs_trylevel <= 0 || cstack->cs_idx < 0)
- eap->errmsg = e_no_endtry;
+ eap->errmsg = _(e_no_endtry);
else
{
/*
get_end_emsg(cstack_T *cstack)
{
if (cstack->cs_flags[cstack->cs_idx] & CSF_WHILE)
- return e_endwhile;
+ return _(e_endwhile);
if (cstack->cs_flags[cstack->cs_idx] & CSF_FOR)
- return e_endfor;
- return e_endif;
+ return _(e_endfor);
+ return _(e_endif);
}
if (*end != NUL && !ends_excmd2(end, skipwhite(end + 1)))
{
vim_free(g);
- eap->errmsg = e_trailing;
+ eap->errmsg = ex_errmsg(e_trailing_arg, end);
return;
}
if (*end != *p)
int getline_equal(char_u *(*fgetline)(int, void *, int, int), void *cookie, char_u *(*func)(int, void *, int, int));
void *getline_cookie(char_u *(*fgetline)(int, void *, int, int), void *cookie);
char_u *getline_peek(char_u *(*fgetline)(int, void *, int, int), void *cookie);
+char *ex_errmsg(char *msg, char_u *arg);
int parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only);
void undo_cmdmod(exarg_T *eap, int save_msg_scroll);
int parse_cmd_address(exarg_T *eap, char **errormsg, int silent);
call assert_fails("99tabmove", 'E16:')
call assert_fails("+99tabmove", 'E16:')
call assert_fails("-99tabmove", 'E16:')
- call assert_fails("tabmove foo", 'E474:')
- call assert_fails("tabmove 99", 'E474:')
- call assert_fails("tabmove +99", 'E474:')
- call assert_fails("tabmove -99", 'E474:')
- call assert_fails("tabmove -3+", 'E474:')
- call assert_fails("tabmove $3", 'E474:')
+ call assert_fails("tabmove foo", 'E475:')
+ call assert_fails("tabmove 99", 'E475:')
+ call assert_fails("tabmove +99", 'E475:')
+ call assert_fails("tabmove -99", 'E475:')
+ call assert_fails("tabmove -3+", 'E475:')
+ call assert_fails("tabmove $3", 'E475:')
call assert_fails("%tabonly", 'E16:')
1tabonly!
tabmove 1
call assert_equal(1, tabpagenr())
tabnew
- call assert_fails("-2tabmove", 'E474:')
+ call assert_fails("-2tabmove", 'E16:')
tabonly!
endfunc
call Check_tab_count(4, 'tabnext -', 3)
call Check_tab_count(4, 'tabnext -2', 2)
call Check_tab_count(3, 'tabnext $', 5)
- call assert_fails('tabnext 0', 'E474:')
- call assert_fails('tabnext .', 'E474:')
- call assert_fails('tabnext -+', 'E474:')
- call assert_fails('tabnext +2-', 'E474:')
- call assert_fails('tabnext $3', 'E474:')
- call assert_fails('tabnext 99', 'E474:')
- call assert_fails('tabnext +99', 'E474:')
- call assert_fails('tabnext -99', 'E474:')
+ call assert_fails('tabnext 0', 'E475:')
+ call assert_fails('tabnext .', 'E475:')
+ call assert_fails('tabnext -+', 'E475:')
+ call assert_fails('tabnext +2-', 'E475:')
+ call assert_fails('tabnext $3', 'E475:')
+ call assert_fails('tabnext 99', 'E475:')
+ call assert_fails('tabnext +99', 'E475:')
+ call assert_fails('tabnext -99', 'E475:')
1tabonly!
endfunction
let err_code = 'E16:'
else
let entire_cmd = cmd . ' ' . c
- let err_code = 'E474:'
+ let err_code = 'E475:'
endif
call assert_fails(entire_cmd, err_code)
endfor
let err_code = 'E16:'
else
let entire_cmd = 'tabclose ' . c
- let err_code = 'E474:'
+ let err_code = 'E475:'
endif
call assert_fails(entire_cmd, err_code)
call assert_equal(6, tabpagenr('$'))
call assert_fails('3tabclose', 'E37:')
call assert_fails('tabclose 3', 'E37:')
- call assert_fails('tabclose -+', 'E474:')
- call assert_fails('tabclose +2-', 'E474:')
+ call assert_fails('tabclose -+', 'E475:')
+ call assert_fails('tabclose +2-', 'E475:')
call assert_equal(6, tabpagenr('$'))
1tabonly!
let err_code = 'E16:'
else
let entire_cmd = 'tabonly ' . c
- let err_code = 'E474:'
+ let err_code = 'E475:'
endif
call assert_fails(entire_cmd, err_code)
call assert_equal(6, tabpagenr('$'))
for c in tc
call s:reconstruct_tabpage_for_test(6)
let entire_cmd = 'tabonly' . c[2] . ' ' . c[1]
- let err_code = 'E474:'
+ let err_code = 'E475:'
call assert_fails(entire_cmd, err_code)
call assert_equal(6, tabpagenr('$'))
endfor
- call assert_fails('tabonly -+', 'E474:')
- call assert_fails('tabonly +2-', 'E474:')
+ call assert_fails('tabonly -+', 'E475:')
+ call assert_fails('tabonly +2-', 'E475:')
call assert_equal(6, tabpagenr('$'))
1tabonly!
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1280,
/**/
1279,
/**/