@@ -1655,6 +1655,16 @@ current_tab_nr(tabpage_T *tab)
16551655 return nr ;
16561656}
16571657
1658+ static int
1659+ comment_start (char_u * p , int starts_with_colon UNUSED )
1660+ {
1661+ #ifdef FEAT_EVAL
1662+ if (in_vim9script ())
1663+ return p [0 ] == '#' && p [1 ] != '{' && !starts_with_colon ;
1664+ #endif
1665+ return * p == '"' ;
1666+ }
1667+
16581668# define CURRENT_WIN_NR current_win_nr(curwin)
16591669# define LAST_WIN_NR current_win_nr(NULL)
16601670# define CURRENT_TAB_NR current_tab_nr(curtab)
@@ -1704,8 +1714,8 @@ do_one_cmd(
17041714 int save_reg_executing = reg_executing ;
17051715 int ni ; // set when Not Implemented
17061716 char_u * cmd ;
1717+ int starts_with_colon = FALSE;
17071718#ifdef FEAT_EVAL
1708- int starts_with_colon ;
17091719 int starts_with_quote ;
17101720 int vim9script = in_vim9script ();
17111721#endif
@@ -1892,12 +1902,8 @@ do_one_cmd(
18921902 * If we got a line, but no command, then go to the line.
18931903 * If we find a '|' or '\n' we set ea.nextcmd.
18941904 */
1895- if (* ea .cmd == NUL || * ea .cmd == '"'
1896- #ifdef FEAT_EVAL
1897- || (* ea .cmd == '#' && ea .cmd [1 ] != '{'
1898- && !starts_with_colon && vim9script )
1899- #endif
1900- || (ea .nextcmd = check_nextcmd (ea .cmd )) != NULL )
1905+ if (* ea .cmd == NUL || comment_start (ea .cmd , starts_with_colon )
1906+ || (ea .nextcmd = check_nextcmd (ea .cmd )) != NULL )
19011907 {
19021908 /*
19031909 * strange vi behaviour:
@@ -2231,7 +2237,7 @@ do_one_cmd(
22312237 ea .do_ecmd_cmd = getargcmd (& ea .arg );
22322238
22332239 /*
2234- * Check for '|' to separate commands and '"' to start comments.
2240+ * Check for '|' to separate commands and '"' or '#' to start comments.
22352241 * Don't do this for ":read !cmd" and ":write !cmd".
22362242 */
22372243 if ((ea .argt & EX_TRLBAR ) && !ea .usefilter )
@@ -2665,7 +2671,8 @@ do_one_cmd(
26652671 int
26662672parse_command_modifiers (exarg_T * eap , char * * errormsg , int skip_only )
26672673{
2668- char_u * p ;
2674+ char_u * p ;
2675+ int starts_with_colon = FALSE;
26692676
26702677 CLEAR_FIELD (cmdmod );
26712678 eap -> verbose_save = -1 ;
@@ -2675,7 +2682,11 @@ parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only)
26752682 for (;;)
26762683 {
26772684 while (* eap -> cmd == ' ' || * eap -> cmd == '\t' || * eap -> cmd == ':' )
2685+ {
2686+ if (* eap -> cmd == ':' )
2687+ starts_with_colon = TRUE;
26782688 ++ eap -> cmd ;
2689+ }
26792690
26802691 // in ex mode, an empty line works like :+
26812692 if (* eap -> cmd == NUL && exmode_active
@@ -2689,7 +2700,7 @@ parse_command_modifiers(exarg_T *eap, char **errormsg, int skip_only)
26892700 }
26902701
26912702 // ignore comment and empty lines
2692- if (* eap -> cmd == '"' )
2703+ if (comment_start ( eap -> cmd , starts_with_colon ) )
26932704 return FAIL ;
26942705 if (* eap -> cmd == NUL )
26952706 {
@@ -4527,14 +4538,20 @@ separate_nextcmd(exarg_T *eap)
45274538 // Check for '"': start of comment or '|': next command
45284539 // :@" and :*" do not start a comment!
45294540 // :redir @" doesn't either.
4530- else if ( (* p == '"' && !(eap -> argt & EX_NOTRLCOM )
4541+ else if ( (* p == '"'
4542+ #ifdef FEAT_EVAL
4543+ && !in_vim9script ()
4544+ #endif
4545+ && !(eap -> argt & EX_NOTRLCOM )
45314546 && ((eap -> cmdidx != CMD_at && eap -> cmdidx != CMD_star )
4532- || p != eap -> arg )
4547+ || p != eap -> arg )
45334548 && (eap -> cmdidx != CMD_redir
4534- || p != eap -> arg + 1 || p [-1 ] != '@' ))
4549+ || p != eap -> arg + 1 || p [-1 ] != '@'))
45354550#ifdef FEAT_EVAL
4536- || (* p == '#' && in_vim9script ()
4537- && p [1 ] != '{' && p > eap -> cmd && VIM_ISWHITE (p [-1 ]))
4551+ || (* p == '#'
4552+ && in_vim9script ()
4553+ && p [1 ] != '{'
4554+ && p > eap -> cmd && VIM_ISWHITE (p [-1 ]))
45384555#endif
45394556 || * p == '|' || * p == '\n' )
45404557 {
@@ -4873,11 +4890,13 @@ ex_blast(exarg_T *eap)
48734890 int
48744891ends_excmd (int c )
48754892{
4893+ int comment_char = '"' ;
4894+
48764895#ifdef FEAT_EVAL
4877- if (c == '#' )
4878- return in_vim9script () ;
4896+ if (in_vim9script () )
4897+ comment_char = '#' ;
48794898#endif
4880- return (c == NUL || c == '|' || c == '"' || c == '\n' );
4899+ return (c == NUL || c == '|' || c == comment_char || c == '\n' );
48814900}
48824901
48834902/*
@@ -4889,11 +4908,14 @@ ends_excmd2(char_u *cmd_start UNUSED, char_u *cmd)
48894908{
48904909 int c = * cmd ;
48914910
4911+ if (c == NUL || c == '|' || c == '\n' )
4912+ return TRUE;
48924913#ifdef FEAT_EVAL
4893- if (c == '#' && cmd [1 ] != '{' && (cmd == cmd_start || VIM_ISWHITE (cmd [-1 ])))
4894- return in_vim9script ();
4914+ if (in_vim9script ())
4915+ return c == '#' && cmd [1 ] != '{'
4916+ && (cmd == cmd_start || VIM_ISWHITE (cmd [-1 ]));
48954917#endif
4896- return ( c == NUL || c == '|' || c == '"' || c == '\n' ) ;
4918+ return c == '"' ;
48974919}
48984920
48994921#if defined(FEAT_SYN_HL ) || defined(FEAT_SEARCH_EXTRA ) || defined(FEAT_EVAL ) \
@@ -7037,7 +7059,12 @@ ex_wincmd(exarg_T *eap)
70377059
70387060 eap -> nextcmd = check_nextcmd (p );
70397061 p = skipwhite (p );
7040- if (* p != NUL && * p != '"' && eap -> nextcmd == NULL )
7062+ if (* p != NUL && * p != (
7063+ #ifdef FEAT_EVAL
7064+ in_vim9script () ? '#' :
7065+ #endif
7066+ '"' )
7067+ && eap -> nextcmd == NULL )
70417068 emsg (_ (e_invarg ));
70427069 else if (!eap -> skip )
70437070 {
0 commit comments