From 6616d1d3e5c98f3be78379829027adee3da67570 Mon Sep 17 00:00:00 2001 From: erw7 Date: Sun, 11 Aug 2019 22:32:07 +0900 Subject: [PATCH] win/env: Vim-compat: Empty string deletes env var #10743 - Windows: `set FOO=` deletes environment variable FOO, and there is no way to set empty string expect by calling the API. - Vim-compatible: `:let $FOO=""` deletes the environment variable. - See also Test_WindowsHome(). ref: https://github.com/neovim/neovim/pull/10657#issuecomment-516368089 --- src/nvim/os/env.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 915c0a1f9f..33b67a8116 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -111,6 +111,8 @@ bool os_env_exists(const char *name) /// Sets an environment variable. /// +/// Windows (Vim-compat): Empty string (:let $FOO="") undefines the env var. +/// /// @warning Existing pointers to the result of os_getenv("foo") are /// INVALID after os_setenv("foo", …). int os_setenv(const char *name, const char *value, int overwrite) @@ -123,6 +125,10 @@ int os_setenv(const char *name, const char *value, int overwrite) if (!overwrite && os_getenv(name) != NULL) { return 0; } + if (value[0] == '\0') { + // Windows (Vim-compat): Empty string undefines the env var. + return os_unsetenv(name); + } #else if (!overwrite && os_env_exists(name)) { return 0;