summaryrefslogtreecommitdiffstats
path: root/src/evalvars.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-04-19 17:24:53 +0200
committerBram Moolenaar <Bram@vim.org>2020-04-19 17:24:53 +0200
commit7e0868efcf094f2cc59fa4e18af3a8dc7aedd64f (patch)
tree65eace45242072f64ef6a2431a9363ac8a4a2953 /src/evalvars.c
parentd72c1bf0a6784afdc8d8ceab4a007cd76d5b81e1 (diff)
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.c55
1 files changed, 35 insertions, 20 deletions
diff --git a/src/evalvars.c b/src/evalvars.c
index 1952eb88f4..12bd42fa66 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;
}