diff options
-rw-r--r-- | src/nvim/os/env.c | 35 | ||||
-rw-r--r-- | src/nvim/os/fs.c | 2 | ||||
-rw-r--r-- | src/nvim/search.c | 2 | ||||
-rw-r--r-- | test/functional/ui/wildmode_spec.lua | 30 |
4 files changed, 54 insertions, 15 deletions
diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 8a8220b6e7..e7bfbc8240 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -150,28 +150,47 @@ int os_unsetenv(const char *name) char *os_getenvname_at_index(size_t index) { +#ifdef _WIN32 + // Check if index is inside the environ array and is not the last element. + for (size_t i = 0; i <= index; i++) { + if (_wenviron[i] == NULL) { + return NULL; + } + } + wchar_t *utf16_str = _wenviron[index]; + char *utf8_str; + int conversion_result = utf16_to_utf8(utf16_str, &utf8_str); + if (conversion_result != 0) { + EMSG2("utf16_to_utf8 failed: %d", conversion_result); + return NULL; + } + size_t namesize = 0; + while (utf8_str[namesize] != '=' && utf8_str[namesize] != NUL) { + namesize++; + } + char *name = (char *)vim_strnsave((char_u *)utf8_str, namesize); + xfree(utf8_str); + return name; +#else # if defined(HAVE__NSGETENVIRON) char **environ = *_NSGetEnviron(); -# elif !defined(__WIN32__) - // Borland C++ 5.2 has this in a header file. +# else extern char **environ; # endif - // check if index is inside the environ array - for (size_t i = 0; i < index; i++) { + // Check if index is inside the environ array and is not the last element. + for (size_t i = 0; i <= index; i++) { if (environ[i] == NULL) { return NULL; } } char *str = environ[index]; - if (str == NULL) { - return NULL; - } size_t namesize = 0; while (str[namesize] != '=' && str[namesize] != NUL) { namesize++; } char *name = (char *)vim_strnsave((char_u *)str, namesize); return name; +#endif } /// Get the process ID of the Neovim process. @@ -404,7 +423,7 @@ void expand_env_esc(char_u *restrict srcp, var = NULL; } else { if (src[1] == '{') { - ++tail; + tail++; } #endif *var = NUL; diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c index 109ea6c487..7f2ebeec2f 100644 --- a/src/nvim/os/fs.c +++ b/src/nvim/os/fs.c @@ -1104,7 +1104,7 @@ char *os_resolve_shortcut(const char *fname) if (hr == S_OK && wsz[0] != NUL) { const int conversion_result = utf16_to_utf8(wsz, &rfname); if (conversion_result != 0) { - EMSG2("utf16_to_utf8 failed: %s", uv_strerror(conversion_result)); + EMSG2("utf16_to_utf8 failed: %d", conversion_result); } } diff --git a/src/nvim/search.c b/src/nvim/search.c index 6f0479cc39..f6b80d1b79 100644 --- a/src/nvim/search.c +++ b/src/nvim/search.c @@ -3913,7 +3913,7 @@ abort_search: VIsual = t; } } - return FALSE; + return false; } diff --git a/test/functional/ui/wildmode_spec.lua b/test/functional/ui/wildmode_spec.lua index ffe71cfadf..7cd09fb222 100644 --- a/test/functional/ui/wildmode_spec.lua +++ b/test/functional/ui/wildmode_spec.lua @@ -171,19 +171,21 @@ end) describe('command line completion', function() local screen - before_each(function() - clear() screen = Screen.new(40, 5) - screen:attach() - screen:set_default_attr_ids({[1]={bold=true, foreground=Screen.colors.Blue}}) + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue1}, + [2] = {foreground = Screen.colors.Grey0, background = Screen.colors.Yellow}, + [3] = {bold = true, reverse = true}, + }) end) - after_each(function() os.remove('Xtest-functional-viml-compl-dir') end) it('lists directories with empty PATH', function() + clear() + screen:attach() local tmp = funcs.tempname() command('e '.. tmp) command('cd %:h') @@ -198,6 +200,24 @@ describe('command line completion', function() :!Xtest-functional-viml-compl-dir^ | ]]) end) + + it('completes (multibyte) env var names #9655', function() + clear({env={ + ['XTEST_1AaあB']='foo', + ['XTEST_2']='bar', + }}) + screen:attach() + command('set wildmode=full') + command('set wildmenu') + feed(':!echo $XTEST_<tab>') + screen:expect([[ + | + {1:~ }| + {1:~ }| + {2:XTEST_1AaあB}{3: XTEST_2 }| + :!echo $XTEST_1AaあB^ | + ]]) + end) end) describe('ui/ext_wildmenu', function() |