From a5fe91e6dc610bc823bc3201e2c88179989b13fb Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 27 Sep 2020 16:03:15 +0200 Subject: [PATCH] patch 8.2.1757: Mac: default locale is lacking the encoding Problem: Mac: default locale is lacking the encoding. Solution: Add ".UTF-8 to the locale. (Yee Cheng Chin, closes #7022) --- src/os_mac_conv.c | 9 +++++++-- src/testdir/test_environ.vim | 21 +++++++++++++++++++++ src/version.c | 2 ++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/os_mac_conv.c b/src/os_mac_conv.c index fd6212464..734f8f6c9 100644 --- a/src/os_mac_conv.c +++ b/src/os_mac_conv.c @@ -570,12 +570,17 @@ mac_lang_init(void) { if (mch_getenv((char_u *)"LANG") == NULL) { - char buf[20]; + char buf[50]; + + // $LANG is not set, either because it was unset or Vim was started + // from the Dock. Query the system locale. if (LocaleRefGetPartString(NULL, kLocaleLanguageMask | kLocaleLanguageVariantMask | kLocaleRegionMask | kLocaleRegionVariantMask, - sizeof buf, buf) == noErr && *buf) + sizeof(buf) - 10, buf) == noErr && *buf) { + if (strcasestr(buf, "utf-8") == NULL) + strcat(buf, ".UTF-8"); vim_setenv((char_u *)"LANG", (char_u *)buf); # ifdef HAVE_LOCALE_H setlocale(LC_ALL, ""); diff --git a/src/testdir/test_environ.vim b/src/testdir/test_environ.vim index d9f99f057..dd34983ee 100644 --- a/src/testdir/test_environ.vim +++ b/src/testdir/test_environ.vim @@ -2,6 +2,8 @@ scriptencoding utf-8 +source check.vim + func Test_environ() unlet! $TESTENV call assert_equal(0, has_key(environ(), 'TESTENV')) @@ -45,4 +47,23 @@ func Test_external_env() call assert_equal('', result) endfunc +func Test_mac_locale() + CheckFeature osxdarwin + + " If $LANG is not set then the system locale will be used. + " Run Vim after unsetting all the locale environmental vars, and capture the + " output of :lang. + let lang_results = system("unset LANG; unset LC_MESSAGES; " .. + \ shellescape(v:progpath) .. + \ " --clean -esX -c 'redir @a' -c 'lang' -c 'put a' -c 'print' -c 'qa!' ") + + " Check that: + " 1. The locale is the form of .UTF-8. + " 2. Check that fourth item (LC_NUMERIC) is properly set to "C". + " Example match: "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8" + call assert_match('"\([a-zA-Z_]\+\.UTF-8/\)\{3}C\(/[a-zA-Z_]\+\.UTF-8\)\{2}"', + \ lang_results, + \ "Default locale should have UTF-8 encoding set, and LC_NUMERIC set to 'C'") +endfunc + " vim: shiftwidth=2 sts=2 expandtab diff --git a/src/version.c b/src/version.c index a0bea6ff5..9ef77d87a 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1757, /**/ 1756, /**/ -- 2.40.0