diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-04-19 17:24:53 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-04-19 17:24:53 +0200 |
commit | 7e0868efcf094f2cc59fa4e18af3a8dc7aedd64f (patch) | |
tree | 65eace45242072f64ef6a2431a9363ac8a4a2953 /src/evalvars.c | |
parent | d72c1bf0a6784afdc8d8ceab4a007cd76d5b81e1 (diff) | |
download | vim-git-7e0868efcf094f2cc59fa4e18af3a8dc7aedd64f.tar.gz |
patch 8.2.0602: :unlet $VAR does not work properlyv8.2.0602
Problem: :unlet $VAR does not work properly.
Solution: Make ":lockvar $VAR" fail. Check the "skip" flag.
Diffstat (limited to 'src/evalvars.c')
-rw-r--r-- | src/evalvars.c | 55 |
1 files changed, 35 insertions, 20 deletions
diff --git a/src/evalvars.c b/src/evalvars.c index 1952eb88f..12bd42fa6 100644 --- a/src/evalvars.c +++ b/src/evalvars.c @@ -1417,14 +1417,17 @@ ex_unletlock( { if (*arg == '$') { - char_u *name = ++arg; - + lv.ll_name = arg; + lv.ll_tv = NULL; + ++arg; if (get_env_len(&arg) == 0) { - semsg(_(e_invarg2), name - 1); + semsg(_(e_invarg2), arg - 1); return; } - vim_unsetenv(name); + if (!error && !eap->skip + && callback(&lv, arg, eap, deep, cookie) == FAIL) + error = TRUE; arg = skipwhite(arg); continue; } @@ -1477,8 +1480,10 @@ do_unlet_var( cc = *name_end; *name_end = NUL; - // Normal name or expanded name. - if (do_unlet(lp->ll_name, forceit) == FAIL) + // Environment variable, normal name or expanded name. + if (*lp->ll_name == '$') + vim_unsetenv(lp->ll_name + 1); + else if (do_unlet(lp->ll_name, forceit) == FAIL) ret = FAIL; *name_end = cc; } @@ -1608,24 +1613,34 @@ do_lock_var( { cc = *name_end; *name_end = NUL; - - // Normal name or expanded name. - di = find_var(lp->ll_name, NULL, TRUE); - if (di == NULL) + if (*lp->ll_name == '$') + { + semsg(_(e_lock_unlock), lp->ll_name); ret = FAIL; - else if ((di->di_flags & DI_FLAGS_FIX) - && di->di_tv.v_type != VAR_DICT - && di->di_tv.v_type != VAR_LIST) - // For historic reasons this error is not given for a list or dict. - // E.g., the b: dict could be locked/unlocked. - semsg(_("E940: Cannot lock or unlock variable %s"), lp->ll_name); + } else { - if (lock) - di->di_flags |= DI_FLAGS_LOCK; + // Normal name or expanded name. + di = find_var(lp->ll_name, NULL, TRUE); + if (di == NULL) + ret = FAIL; + else if ((di->di_flags & DI_FLAGS_FIX) + && di->di_tv.v_type != VAR_DICT + && di->di_tv.v_type != VAR_LIST) + { + // For historic reasons this error is not given for a list or + // dict. E.g., the b: dict could be locked/unlocked. + semsg(_(e_lock_unlock), lp->ll_name); + ret = FAIL; + } else - di->di_flags &= ~DI_FLAGS_LOCK; - item_lock(&di->di_tv, deep, lock); + { + if (lock) + di->di_flags |= DI_FLAGS_LOCK; + else + di->di_flags &= ~DI_FLAGS_LOCK; + item_lock(&di->di_tv, deep, lock); + } } *name_end = cc; } |