@@ -8132,7 +8132,7 @@ static struct fst
81328132 {"cscope_connection",0,3, f_cscope_connection},
81338133 {"cursor", 1, 3, f_cursor},
81348134 {"deepcopy", 1, 2, f_deepcopy},
8135- {"delete", 1, 1 , f_delete},
8135+ {"delete", 1, 2 , f_delete},
81368136 {"did_filetype", 0, 0, f_did_filetype},
81378137 {"diff_filler", 1, 1, f_diff_filler},
81388138 {"diff_hlID", 2, 2, f_diff_hlID},
@@ -10392,10 +10392,37 @@ f_delete(argvars, rettv)
1039210392 typval_T *argvars;
1039310393 typval_T *rettv;
1039410394{
10395+ char_u nbuf[NUMBUFLEN];
10396+ char_u *name;
10397+ char_u *flags;
10398+
10399+ rettv->vval.v_number = -1;
1039510400 if (check_restricted() || check_secure())
10396- rettv->vval.v_number = -1;
10401+ return;
10402+
10403+ name = get_tv_string(&argvars[0]);
10404+ if (name == NULL || *name == NUL)
10405+ {
10406+ EMSG(_(e_invarg));
10407+ return;
10408+ }
10409+
10410+ if (argvars[1].v_type != VAR_UNKNOWN)
10411+ flags = get_tv_string_buf(&argvars[1], nbuf);
1039710412 else
10398- rettv->vval.v_number = mch_remove(get_tv_string(&argvars[0]));
10413+ flags = (char_u *)"";
10414+
10415+ if (*flags == NUL)
10416+ /* delete a file */
10417+ rettv->vval.v_number = mch_remove(name) == 0 ? 0 : -1;
10418+ else if (STRCMP(flags, "d") == 0)
10419+ /* delete an empty directory */
10420+ rettv->vval.v_number = mch_rmdir(name) == 0 ? 0 : -1;
10421+ else if (STRCMP(flags, "rf") == 0)
10422+ /* delete a directory recursively */
10423+ rettv->vval.v_number = delete_recursive(name);
10424+ else
10425+ EMSG2(_(e_invexpr2), flags);
1039910426}
1040010427
1040110428/*
@@ -20845,10 +20872,10 @@ find_name_end(arg, expr_start, expr_end, flags)
2084520872 else if (br_nest == 0 && mb_nest == 0 && *p == ':')
2084620873 {
2084720874 /* "s:" is start of "s:var", but "n:" is not and can be used in
20848- * slice "[n:]". Also "xx:" is not a namespace. */
20875+ * slice "[n:]". Also "xx:" is not a namespace. But {ns}: is. */
2084920876 len = (int)(p - arg);
2085020877 if ((len == 1 && vim_strchr(NAMESPACE_CHAR, *arg) == NULL)
20851- || len > 1)
20878+ || ( len > 1 && p[-1] != '}') )
2085220879 break;
2085320880 }
2085420881
0 commit comments