0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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)
This commit is contained in:
Bram Moolenaar
2017-09-26 19:10:37 +02:00
parent 09ca932f8e
commit 2a02745709
4 changed files with 69 additions and 31 deletions

View File

@@ -2564,6 +2564,21 @@ check_tty(mparm_T *parmp)
#if defined(WIN3264) && !defined(FEAT_GUI_W32) #if defined(WIN3264) && !defined(FEAT_GUI_W32)
if (is_cygpty_used()) 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")); mch_errmsg(_("Vim: Error: This version of Vim does not run in a Cygwin terminal\n"));
exit(1); exit(1);
} }

View File

@@ -4389,41 +4389,27 @@ enc_alias_search(char_u *name)
# include <langinfo.h> # include <langinfo.h>
# endif # 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. * Returns an allocated string when successful, NULL when not.
*/ */
char_u * char_u *
enc_locale(void) enc_locale_env(char *locale)
{ {
#ifndef WIN3264 char *s = locale;
char *s;
char *p; char *p;
int i; int i;
#endif
char buf[50]; char buf[50];
#ifdef WIN3264
long acp = GetACP();
if (acp == 1200) if (s == NULL || *s == NUL)
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_ALL")) == NULL || *s == NUL)
if ((s = getenv("LC_CTYPE")) == NULL || *s == NUL) if ((s = getenv("LC_CTYPE")) == NULL || *s == NUL)
s = getenv("LANG"); s = getenv("LANG");
if (s == NULL || *s == NUL) if (s == NULL || *s == NUL)
return FAIL; return NULL;
/* The most generic locale format is: /* The most generic locale format is:
* language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]] * language[_territory][.codeset][@modifier][+special][,[sponsor][_revision]]
@@ -4458,10 +4444,44 @@ enc_locale(void)
break; break;
} }
buf[i] = NUL; buf[i] = NUL;
#endif
return enc_canonize((char_u *)buf); return enc_canonize((char_u *)buf);
} }
# 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) # if defined(WIN3264) || defined(PROTO) || defined(FEAT_CYGWIN_WIN32_CLIPBOARD)
/* /*

View File

@@ -71,6 +71,7 @@ int mb_lefthalve(int row, int col);
int mb_fix_col(int col, int row); int mb_fix_col(int col, int row);
char_u *enc_skip(char_u *p); char_u *enc_skip(char_u *p);
char_u *enc_canonize(char_u *enc); char_u *enc_canonize(char_u *enc);
char_u *enc_locale_env(char *locale);
char_u *enc_locale(void); char_u *enc_locale(void);
int encname2codepage(char_u *name); int encname2codepage(char_u *name);
void *my_iconv_open(char_u *to, char_u *from); void *my_iconv_open(char_u *to, char_u *from);

View File

@@ -761,6 +761,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1152,
/**/ /**/
1151, 1151,
/**/ /**/