Mercurial > vim
diff src/eval.c @ 7615:228ff048db20 v7.4.1107
commit https://github.com/vim/vim/commit/da440d21a6b94d7f525fa7be9b1417c78dd9aa4c
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Jan 16 21:27:23 2016 +0100
patch 7.4.1107
Problem: Vim can create a directory but not delete it.
Solution: Add an argument to delete() to make it possible to delete a
directory, also recursively.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 16 Jan 2016 21:30:05 +0100 |
parents | 9c420b8db435 |
children | d9ec7d22494d |
line wrap: on
line diff
--- a/src/eval.c +++ b/src/eval.c @@ -8131,7 +8131,7 @@ static struct fst {"cscope_connection",0,3, f_cscope_connection}, {"cursor", 1, 3, f_cursor}, {"deepcopy", 1, 2, f_deepcopy}, - {"delete", 1, 1, f_delete}, + {"delete", 1, 2, f_delete}, {"did_filetype", 0, 0, f_did_filetype}, {"diff_filler", 1, 1, f_diff_filler}, {"diff_hlID", 2, 2, f_diff_hlID}, @@ -10391,10 +10391,37 @@ f_delete(argvars, rettv) typval_T *argvars; typval_T *rettv; { + char_u nbuf[NUMBUFLEN]; + char_u *name; + char_u *flags; + + rettv->vval.v_number = -1; if (check_restricted() || check_secure()) - rettv->vval.v_number = -1; - else - rettv->vval.v_number = mch_remove(get_tv_string(&argvars[0])); + return; + + name = get_tv_string(&argvars[0]); + if (name == NULL || *name == NUL) + { + EMSG(_(e_invarg)); + return; + } + + if (argvars[1].v_type != VAR_UNKNOWN) + flags = get_tv_string_buf(&argvars[1], nbuf); + else + flags = (char_u *)""; + + if (*flags == NUL) + /* delete a file */ + rettv->vval.v_number = mch_remove(name) == 0 ? 0 : -1; + else if (STRCMP(flags, "d") == 0) + /* delete an empty directory */ + rettv->vval.v_number = mch_rmdir(name) == 0 ? 0 : -1; + else if (STRCMP(flags, "rf") == 0) + /* delete an directory recursively */ + rettv->vval.v_number = delete_recursive(name); + else + EMSG2(_(e_invexpr2), flags); } /*