# HG changeset patch # User Christian Brabandt # Date 1506446105 -7200 # Node ID aa3f6d093f4b89f84e4a31f3febb6481c4229580 # Parent 088dd3306316ad18af439dc3cb1bbc1a05cf08cd patch 8.0.1152: encoding of error message wrong in Cygwin terminal commit https://github.com/vim/vim/commit/2a02745709127bd56ccdbac8c568b3c25f3072a7 Author: Bram Moolenaar Date: Tue Sep 26 19:10:37 2017 +0200 patch 8.0.1152: encoding of error message wrong in Cygwin terminal Problem: Encoding of error message wrong in Cygwin terminal. Solution: Get locale from environment variables. (Ken Takata) diff --git a/src/main.c b/src/main.c --- a/src/main.c +++ b/src/main.c @@ -2564,6 +2564,21 @@ check_tty(mparm_T *parmp) #if defined(WIN3264) && !defined(FEAT_GUI_W32) if (is_cygpty_used()) { +# if defined(FEAT_MBYTE) && defined(HAVE_BIND_TEXTDOMAIN_CODESET) \ + && defined(FEAT_GETTEXT) + char *s, *tofree = NULL; + + /* Set the encoding of the error message based on $LC_ALL or + * other environment variables instead of 'encoding'. + * Note that the message is shown on a Cygwin terminal (e.g. + * mintty) which encoding is based on $LC_ALL or etc., not the + * current codepage used by normal Win32 console programs. */ + tofree = s = enc_locale_env(NULL); + if (s == NULL) + s = "utf-8"; /* Use "utf-8" by default. */ + (void)bind_textdomain_codeset(VIMPACKAGE, s); + vim_free(tofree); +# endif mch_errmsg(_("Vim: Error: This version of Vim does not run in a Cygwin terminal\n")); exit(1); } diff --git a/src/mbyte.c b/src/mbyte.c --- a/src/mbyte.c +++ b/src/mbyte.c @@ -4385,45 +4385,31 @@ enc_alias_search(char_u *name) #if defined(FEAT_MBYTE) || defined(PROTO) -#ifdef HAVE_LANGINFO_H -# include -#endif - +# ifdef HAVE_LANGINFO_H +# include +# endif + +# ifndef FEAT_GUI_W32 /* - * Get the canonicalized encoding of the current locale. + * Get the canonicalized encoding from the specified locale string "locale" + * or from the environment variables LC_ALL, LC_CTYPE and LANG. * Returns an allocated string when successful, NULL when not. */ char_u * -enc_locale(void) -{ -#ifndef WIN3264 - char *s; +enc_locale_env(char *locale) +{ + char *s = locale; char *p; int i; -#endif char buf[50]; -#ifdef WIN3264 - long acp = GetACP(); - - if (acp == 1200) - STRCPY(buf, "ucs-2le"); - else if (acp == 1252) /* cp1252 is used as latin1 */ - STRCPY(buf, "latin1"); - else - sprintf(buf, "cp%ld", acp); -#else -# ifdef HAVE_NL_LANGINFO_CODESET - if ((s = nl_langinfo(CODESET)) == NULL || *s == NUL) -# endif -# if defined(HAVE_LOCALE_H) || defined(X_LOCALE) - if ((s = setlocale(LC_CTYPE, NULL)) == NULL || *s == NUL) -# endif - if ((s = getenv("LC_ALL")) == NULL || *s == NUL) - if ((s = getenv("LC_CTYPE")) == NULL || *s == NUL) - s = getenv("LANG"); if (s == NULL || *s == NUL) - return FAIL; + if ((s = getenv("LC_ALL")) == NULL || *s == NUL) + if ((s = getenv("LC_CTYPE")) == NULL || *s == NUL) + s = getenv("LANG"); + + if (s == NULL || *s == NUL) + return NULL; /* The most generic locale format is: * language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]] @@ -4458,12 +4444,46 @@ enc_locale(void) break; } buf[i] = NUL; -#endif return enc_canonize((char_u *)buf); } - -#if defined(WIN3264) || defined(PROTO) || defined(FEAT_CYGWIN_WIN32_CLIPBOARD) +# endif + +/* + * Get the canonicalized encoding of the current locale. + * Returns an allocated string when successful, NULL when not. + */ + char_u * +enc_locale(void) +{ +# ifdef WIN3264 + char buf[50]; + long acp = GetACP(); + + if (acp == 1200) + STRCPY(buf, "ucs-2le"); + else if (acp == 1252) /* cp1252 is used as latin1 */ + STRCPY(buf, "latin1"); + else + sprintf(buf, "cp%ld", acp); + + return enc_canonize((char_u *)buf); +# else + char *s; + +# ifdef HAVE_NL_LANGINFO_CODESET + if ((s = nl_langinfo(CODESET)) == NULL || *s == NUL) +# endif +# if defined(HAVE_LOCALE_H) || defined(X_LOCALE) + if ((s = setlocale(LC_CTYPE, NULL)) == NULL || *s == NUL) +# endif + s = NULL; + + return enc_locale_env(s); +# endif +} + +# if defined(WIN3264) || defined(PROTO) || defined(FEAT_CYGWIN_WIN32_CLIPBOARD) /* * Convert an encoding name to an MS-Windows codepage. * Returns zero if no codepage can be figured out. @@ -4490,7 +4510,7 @@ encname2codepage(char_u *name) return cp; return 0; } -#endif +# endif # if defined(USE_ICONV) || defined(PROTO) diff --git a/src/proto/mbyte.pro b/src/proto/mbyte.pro --- a/src/proto/mbyte.pro +++ b/src/proto/mbyte.pro @@ -71,6 +71,7 @@ int mb_lefthalve(int row, int col); int mb_fix_col(int col, int row); char_u *enc_skip(char_u *p); char_u *enc_canonize(char_u *enc); +char_u *enc_locale_env(char *locale); char_u *enc_locale(void); int encname2codepage(char_u *name); void *my_iconv_open(char_u *to, char_u *from); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1152, +/**/ 1151, /**/ 1150,