Skip to content

Commit 4e76524

Browse files
committed
Merge remote-tracking branch 'vim/master'
2 parents f539a14 + 9987fb0 commit 4e76524

37 files changed

Lines changed: 551 additions & 175 deletions

runtime/doc/autocmd.txt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,9 @@ Name triggered by ~
308308
|VimLeavePre| before exiting Vim, before writing the viminfo file
309309
|VimLeave| before exiting Vim, after writing the viminfo file
310310

311+
|VimSuspend| when suspending Vim
312+
|VimResume| when Vim is resumed after being suspended
313+
311314
Terminal
312315
|TerminalOpen| after a terminal buffer was created
313316
|TerminalWinOpen| after a terminal buffer was created in a new window
@@ -1238,6 +1241,17 @@ VimLeavePre Before exiting Vim, just before writing the
12381241
VimResized After the Vim window was resized, thus 'lines'
12391242
and/or 'columns' changed. Not when starting
12401243
up though.
1244+
*VimResume*
1245+
VimResume When the Vim instance is resumed after being
1246+
suspended and |VimSuspend| was triggered.
1247+
Useful for triggering |:checktime| and ensure
1248+
the buffers content did not change while Vim
1249+
was suspended: >
1250+
:autocmd VimResume * checktime
1251+
< *VimSuspend*
1252+
VimSuspend When the Vim instance is suspended. Only when
1253+
CTRL-Z was typed inside Vim, not when the
1254+
SIGSTOP or SIGTSTP signal was sent to Vim.
12411255
*WinEnter*
12421256
WinEnter After entering another window. Not done for
12431257
the first window, when Vim has just started.

src/autocmd.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ static struct event_name
192192
{"WinLeave", EVENT_WINLEAVE},
193193
{"VimResized", EVENT_VIMRESIZED},
194194
{"TextYankPost", EVENT_TEXTYANKPOST},
195+
{"VimSuspend", EVENT_VIMSUSPEND},
196+
{"VimResume", EVENT_VIMRESUME},
195197
{NULL, (event_T)0}
196198
};
197199

src/dict.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,11 @@ eval_dict(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int literal)
951951
}
952952
if (evaluate)
953953
{
954+
if (vim9script && check_for_string(&tvkey) == FAIL)
955+
{
956+
clear_tv(&tvkey);
957+
goto failret;
958+
}
954959
key = tv_get_string_buf_chk(&tvkey, buf);
955960
if (key == NULL)
956961
{

src/errors.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ EXTERN char e_argument_nr_type_mismatch_expected_str_but_got_str[]
6161
INIT(= N_("E1013: Argument %d: type mismatch, expected %s but got %s"));
6262
EXTERN char e_invalid_key_str[]
6363
INIT(= N_("E1014: Invalid key: %s"));
64-
EXTERN char e_name_expected[]
64+
EXTERN char e_name_expected_str[]
6565
INIT(= N_("E1015: Name expected: %s"));
6666
EXTERN char e_cannot_declare_a_scope_variable[]
6767
INIT(= N_("E1016: Cannot declare a %s variable: %s"));
@@ -313,3 +313,11 @@ EXTERN char e_for_argument_must_be_sequence_of_lists[]
313313
INIT(= N_("E1140: For argument must be a sequence of lists"));
314314
EXTERN char e_indexable_type_required[]
315315
INIT(= N_("E1141: Indexable type required"));
316+
EXTERN char e_non_empty_string_required[]
317+
INIT(= N_("E1142: Non-empty string required"));
318+
EXTERN char e_empty_expression_str[]
319+
INIT(= N_("E1143: Empty expression: \"%s\""));
320+
EXTERN char e_command_not_followed_by_white_space_str[]
321+
INIT(= N_("E1144: Command is not followed by white space: %s"));
322+
EXTERN char e_missing_heredoc_end_marker_str[]
323+
INIT(= N_("E1145: Missing heredoc end marker: %s"));

src/eval.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2158,7 +2158,10 @@ eval0(
21582158
semsg(_(e_invexpr2), arg);
21592159

21602160
// Some of the expression may not have been consumed. Do not check for
2161-
// a next command to avoid more errors.
2161+
// a next command to avoid more errors, unless "|" is following, which
2162+
// could only be a command separator.
2163+
if (eap != NULL && skipwhite(p)[0] == '|' && skipwhite(p)[1] != '|')
2164+
eap->nextcmd = check_nextcmd(p);
21622165
return FAIL;
21632166
}
21642167

src/evalvars.c

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2723,19 +2723,23 @@ get_script_local_ht(void)
27232723

27242724
/*
27252725
* Look for "name[len]" in script-local variables.
2726-
* Return a non-NULL pointer when found, NULL when not found.
2726+
* Return OK when found, FAIL when not found.
27272727
*/
2728-
void *
2729-
lookup_scriptvar(char_u *name, size_t len, cctx_T *dummy UNUSED)
2728+
int
2729+
lookup_scriptvar(
2730+
char_u *name,
2731+
size_t len,
2732+
void *lvar UNUSED,
2733+
cctx_T *dummy UNUSED)
27302734
{
27312735
hashtab_T *ht = get_script_local_ht();
27322736
char_u buffer[30];
27332737
char_u *p;
2734-
void *res;
2738+
int res;
27352739
hashitem_T *hi;
27362740

27372741
if (ht == NULL)
2738-
return NULL;
2742+
return FAIL;
27392743
if (len < sizeof(buffer) - 1)
27402744
{
27412745
// avoid an alloc/free for short names
@@ -2746,20 +2750,19 @@ lookup_scriptvar(char_u *name, size_t len, cctx_T *dummy UNUSED)
27462750
{
27472751
p = vim_strnsave(name, len);
27482752
if (p == NULL)
2749-
return NULL;
2753+
return FAIL;
27502754
}
27512755

27522756
hi = hash_find(ht, p);
2753-
res = HASHITEM_EMPTY(hi) ? NULL : hi;
2757+
res = HASHITEM_EMPTY(hi) ? FAIL : OK;
27542758

27552759
// if not script-local, then perhaps imported
2756-
if (res == NULL && find_imported(p, 0, NULL) != NULL)
2757-
res = p;
2760+
if (res == FAIL && find_imported(p, 0, NULL) != NULL)
2761+
res = OK;
27582762

27592763
if (p != buffer)
27602764
vim_free(p);
2761-
// Don't return "buffer", gcc complains.
2762-
return res == NULL ? NULL : IObuff;
2765+
return res;
27632766
}
27642767

27652768
/*

src/ex_cmds.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
#define EX_LOCK_OK 0x1000000 // command can be executed when textlock is
5656
// set; when missing disallows editing another
5757
// buffer when curbuf_lock is set
58+
#define EX_NONWHITE_OK 0x2000000 // command can be followed by non-white
5859

5960
#define EX_FILES (EX_XFILE | EX_EXTRA) // multiple extra files allowed
6061
#define EX_FILE1 (EX_FILES | EX_NOSPC) // 1 file, defaults to current file
@@ -632,7 +633,7 @@ EXCMD(CMD_function, "function", ex_function,
632633
EX_EXTRA|EX_BANG|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
633634
ADDR_NONE),
634635
EXCMD(CMD_global, "global", ex_global,
635-
EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_EXTRA|EX_DFLALL|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
636+
EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_EXTRA|EX_DFLALL|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK,
636637
ADDR_LINES),
637638
EXCMD(CMD_goto, "goto", ex_goto,
638639
EX_RANGE|EX_COUNT|EX_TRLBAR|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
@@ -1283,7 +1284,7 @@ EXCMD(CMD_rviminfo, "rviminfo", ex_viminfo,
12831284
EX_BANG|EX_FILE1|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
12841285
ADDR_NONE),
12851286
EXCMD(CMD_substitute, "substitute", ex_substitute,
1286-
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK,
1287+
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK,
12871288
ADDR_LINES),
12881289
EXCMD(CMD_sNext, "sNext", ex_previous,
12891290
EX_EXTRA|EX_RANGE|EX_COUNT|EX_BANG|EX_CMDARG|EX_ARGOPT|EX_TRLBAR,
@@ -1658,7 +1659,7 @@ EXCMD(CMD_update, "update", ex_update,
16581659
EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_FILE1|EX_ARGOPT|EX_DFLALL|EX_TRLBAR,
16591660
ADDR_LINES),
16601661
EXCMD(CMD_vglobal, "vglobal", ex_global,
1661-
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_DFLALL|EX_CMDWIN|EX_LOCK_OK,
1662+
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_DFLALL|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK,
16621663
ADDR_LINES),
16631664
EXCMD(CMD_var, "var", ex_var,
16641665
EX_EXTRA|EX_NOTRLCOM|EX_SBOXOK|EX_CMDWIN|EX_LOCK_OK,
@@ -1798,16 +1799,16 @@ EXCMD(CMD_z, "z", ex_z,
17981799

17991800
// commands that don't start with a letter
18001801
EXCMD(CMD_bang, "!", ex_bang,
1801-
EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_FILES|EX_CMDWIN|EX_LOCK_OK,
1802+
EX_RANGE|EX_WHOLEFOLD|EX_BANG|EX_FILES|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK,
18021803
ADDR_LINES),
18031804
EXCMD(CMD_pound, "#", ex_print,
18041805
EX_RANGE|EX_WHOLEFOLD|EX_COUNT|EX_FLAGS|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
18051806
ADDR_LINES),
18061807
EXCMD(CMD_and, "&", ex_substitute,
1807-
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY,
1808+
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY|EX_NONWHITE_OK,
18081809
ADDR_LINES),
18091810
EXCMD(CMD_star, "*", ex_at,
1810-
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
1811+
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK,
18111812
ADDR_LINES),
18121813
EXCMD(CMD_lshift, "<", ex_operators,
18131814
EX_RANGE|EX_WHOLEFOLD|EX_COUNT|EX_FLAGS|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY,
@@ -1819,7 +1820,7 @@ EXCMD(CMD_rshift, ">", ex_operators,
18191820
EX_RANGE|EX_WHOLEFOLD|EX_COUNT|EX_FLAGS|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY,
18201821
ADDR_LINES),
18211822
EXCMD(CMD_at, "@", ex_at,
1822-
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
1823+
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK|EX_NONWHITE_OK,
18231824
ADDR_LINES),
18241825
EXCMD(CMD_block, "{{{{{{{{", ex_block, // not found normally
18251826
0,
@@ -1828,7 +1829,7 @@ EXCMD(CMD_endblock, "}", ex_endblock,
18281829
EX_TRLBAR|EX_CMDWIN|EX_LOCK_OK,
18291830
ADDR_NONE),
18301831
EXCMD(CMD_tilde, "~", ex_substitute,
1831-
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY,
1832+
EX_RANGE|EX_WHOLEFOLD|EX_EXTRA|EX_CMDWIN|EX_LOCK_OK|EX_MODIFY|EX_NONWHITE_OK,
18321833
ADDR_LINES),
18331834

18341835
// commands that start with an uppercase letter

src/ex_docmd.c

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,7 +1689,7 @@ comment_start(char_u *p, int starts_with_colon UNUSED)
16891689
{
16901690
#ifdef FEAT_EVAL
16911691
if (in_vim9script())
1692-
return p[0] == '#' && p[1] != '{' && !starts_with_colon;
1692+
return p[0] == '#' && !starts_with_colon;
16931693
#endif
16941694
return *p == '"';
16951695
}
@@ -3277,7 +3277,7 @@ skip_option_env_lead(char_u *start)
32773277
find_ex_command(
32783278
exarg_T *eap,
32793279
int *full UNUSED,
3280-
void *(*lookup)(char_u *, size_t, cctx_T *) UNUSED,
3280+
int (*lookup)(char_u *, size_t, void *, cctx_T *) UNUSED,
32813281
cctx_T *cctx UNUSED)
32823282
{
32833283
int len;
@@ -3393,7 +3393,7 @@ find_ex_command(
33933393
|| *eap->cmd == '&'
33943394
|| *eap->cmd == '$'
33953395
|| *eap->cmd == '@'
3396-
|| lookup(eap->cmd, p - eap->cmd, cctx) != NULL)
3396+
|| lookup(eap->cmd, p - eap->cmd, NULL, cctx) == OK)
33973397
{
33983398
eap->cmdidx = CMD_var;
33993399
return eap->cmd;
@@ -3534,6 +3534,16 @@ find_ex_command(
35343534
if (eap->cmdidx == CMD_final && p - eap->cmd == 4)
35353535
eap->cmdidx = CMD_finally;
35363536

3537+
#ifdef FEAT_EVAL
3538+
if (eap->cmdidx != CMD_SIZE && in_vim9script()
3539+
&& !IS_WHITE_OR_NUL(*p) && !ends_excmd(*p) && *p != '!'
3540+
&& (cmdnames[eap->cmdidx].cmd_argt & EX_NONWHITE_OK) == 0)
3541+
{
3542+
semsg(_(e_command_not_followed_by_white_space_str), eap->cmd);
3543+
eap->cmdidx = CMD_SIZE;
3544+
}
3545+
#endif
3546+
35373547
return p;
35383548
}
35393549

@@ -4786,7 +4796,6 @@ separate_nextcmd(exarg_T *eap)
47864796
|| (*p == '#'
47874797
&& in_vim9script()
47884798
&& !(eap->argt & EX_NOTRLCOM)
4789-
&& p[1] != '{'
47904799
&& p > eap->cmd && VIM_ISWHITE(p[-1]))
47914800
#endif
47924801
|| *p == '|' || *p == '\n')
@@ -5121,7 +5130,7 @@ ex_blast(exarg_T *eap)
51215130

51225131
/*
51235132
* Check if "c" ends an Ex command.
5124-
* In Vim9 script does not check for white space before # or #{.
5133+
* In Vim9 script does not check for white space before #.
51255134
*/
51265135
int
51275136
ends_excmd(int c)
@@ -5870,6 +5879,7 @@ ex_stop(exarg_T *eap)
58705879
{
58715880
if (!eap->forceit)
58725881
autowrite_all();
5882+
apply_autocmds(EVENT_VIMSUSPEND, NULL, NULL, FALSE, NULL);
58735883
windgoto((int)Rows - 1, 0);
58745884
out_char('\n');
58755885
out_flush();
@@ -5887,6 +5897,7 @@ ex_stop(exarg_T *eap)
58875897
scroll_start(); // scroll screen before redrawing
58885898
redraw_later_clear();
58895899
shell_resized(); // may have resized window
5900+
apply_autocmds(EVENT_VIMRESUME, NULL, NULL, FALSE, NULL);
58905901
}
58915902
}
58925903

src/filepath.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -876,7 +876,7 @@ f_exepath(typval_T *argvars, typval_T *rettv)
876876
{
877877
char_u *p = NULL;
878878

879-
if (in_vim9script() && check_for_string(&argvars[0]) == FAIL)
879+
if (in_vim9script() && check_for_nonempty_string(&argvars[0]) == FAIL)
880880
return;
881881
(void)mch_can_exe(tv_get_string(&argvars[0]), &p, TRUE);
882882
rettv->v_type = VAR_STRING;
@@ -942,7 +942,7 @@ findfilendir(
942942

943943
rettv->vval.v_string = NULL;
944944
rettv->v_type = VAR_STRING;
945-
if (in_vim9script() && check_for_string(&argvars[0]) == FAIL)
945+
if (in_vim9script() && check_for_nonempty_string(&argvars[0]) == FAIL)
946946
return;
947947

948948
#ifdef FEAT_SEARCHPATH
@@ -1019,7 +1019,7 @@ f_fnamemodify(typval_T *argvars, typval_T *rettv)
10191019
char_u *fname;
10201020
char_u *mods;
10211021
int usedlen = 0;
1022-
int len;
1022+
int len = 0;
10231023
char_u *fbuf = NULL;
10241024
char_u buf[NUMBUFLEN];
10251025

@@ -1028,12 +1028,13 @@ f_fnamemodify(typval_T *argvars, typval_T *rettv)
10281028
return;
10291029
fname = tv_get_string_chk(&argvars[0]);
10301030
mods = tv_get_string_buf_chk(&argvars[1], buf);
1031-
if (fname == NULL || mods == NULL)
1031+
if (mods == NULL || fname == NULL)
10321032
fname = NULL;
10331033
else
10341034
{
10351035
len = (int)STRLEN(fname);
1036-
(void)modify_fname(mods, FALSE, &usedlen, &fname, &fbuf, &len);
1036+
if (mods != NULL && *mods != NUL)
1037+
(void)modify_fname(mods, FALSE, &usedlen, &fname, &fbuf, &len);
10371038
}
10381039

10391040
rettv->v_type = VAR_STRING;

src/insexpand.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1298,6 +1298,7 @@ ins_compl_files(
12981298
fp = mch_fopen((char *)files[i], "r"); // open dictionary file
12991299
if (flags != DICT_EXACT)
13001300
{
1301+
msg_hist_off = TRUE; // reset in msg_trunc_attr()
13011302
vim_snprintf((char *)IObuff, IOSIZE,
13021303
_("Scanning dictionary: %s"), (char *)files[i]);
13031304
(void)msg_trunc_attr((char *)IObuff, TRUE, HL_ATTR(HLF_R));
@@ -2783,6 +2784,7 @@ ins_compl_get_exp(pos_T *ini)
27832784
dict = ins_buf->b_fname;
27842785
dict_f = DICT_EXACT;
27852786
}
2787+
msg_hist_off = TRUE; // reset in msg_trunc_attr()
27862788
vim_snprintf((char *)IObuff, IOSIZE, _("Scanning: %s"),
27872789
ins_buf->b_fname == NULL
27882790
? buf_spname(ins_buf)
@@ -2817,6 +2819,7 @@ ins_compl_get_exp(pos_T *ini)
28172819
#endif
28182820
else if (*e_cpt == ']' || *e_cpt == 't')
28192821
{
2822+
msg_hist_off = TRUE; // reset in msg_trunc_attr()
28202823
type = CTRL_X_TAGS;
28212824
vim_snprintf((char *)IObuff, IOSIZE, _("Scanning tags."));
28222825
(void)msg_trunc_attr((char *)IObuff, TRUE, HL_ATTR(HLF_R));
@@ -3428,9 +3431,11 @@ ins_compl_next(
34283431
MB_PTR_ADV(s);
34293432
}
34303433
}
3434+
msg_hist_off = TRUE;
34313435
vim_snprintf((char *)IObuff, IOSIZE, "%s %s%s", lead,
34323436
s > compl_shown_match->cp_fname ? "<" : "", s);
34333437
msg((char *)IObuff);
3438+
msg_hist_off = FALSE;
34343439
redraw_cmdline = FALSE; // don't overwrite!
34353440
}
34363441
}
@@ -4110,9 +4115,13 @@ ins_complete(int c, int enable_pum)
41104115
if (edit_submode_extra != NULL)
41114116
{
41124117
if (!p_smd)
4118+
{
4119+
msg_hist_off = TRUE;
41134120
msg_attr((char *)edit_submode_extra,
41144121
edit_submode_highl < HLF_COUNT
41154122
? HL_ATTR(edit_submode_highl) : 0);
4123+
msg_hist_off = FALSE;
4124+
}
41164125
}
41174126
else
41184127
msg_clr_cmdline(); // necessary for "noshowmode"

0 commit comments

Comments
 (0)