mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 8.1.0918: MS-Windows: startup messages are not converted
Problem: MS-Windows: startup messages are not converted. Solution: Convert messages when the current codepage differs from 'encoding'. (Yasuhiro Matsumoto, closes #3914)
This commit is contained in:
149
src/message.c
149
src/message.c
@@ -2570,57 +2570,45 @@ msg_use_printf(void)
|
|||||||
msg_puts_printf(char_u *str, int maxlen)
|
msg_puts_printf(char_u *str, int maxlen)
|
||||||
{
|
{
|
||||||
char_u *s = str;
|
char_u *s = str;
|
||||||
char_u buf[4];
|
char_u *buf = NULL;
|
||||||
char_u *p;
|
char_u *p = s;
|
||||||
|
|
||||||
#ifdef WIN3264
|
#ifdef WIN3264
|
||||||
# if !defined(FEAT_GUI_MSWIN)
|
|
||||||
char_u *ccp = NULL;
|
|
||||||
|
|
||||||
# endif
|
|
||||||
if (!(silent_mode && p_verbose == 0))
|
if (!(silent_mode && p_verbose == 0))
|
||||||
mch_settmode(TMODE_COOK); /* handle '\r' and '\n' correctly */
|
mch_settmode(TMODE_COOK); /* handle CR and NL correctly */
|
||||||
|
|
||||||
# if !defined(FEAT_GUI_MSWIN)
|
|
||||||
if (enc_codepage >= 0 && (int)GetConsoleCP() != enc_codepage)
|
|
||||||
{
|
|
||||||
int inlen = (int)STRLEN(str);
|
|
||||||
int outlen;
|
|
||||||
WCHAR *widestr = (WCHAR *)enc_to_utf16(str, &inlen);
|
|
||||||
|
|
||||||
if (widestr != NULL)
|
|
||||||
{
|
|
||||||
WideCharToMultiByte_alloc(GetConsoleCP(), 0, widestr, inlen,
|
|
||||||
(LPSTR *)&ccp, &outlen, 0, 0);
|
|
||||||
vim_free(widestr);
|
|
||||||
s = str = ccp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
#endif
|
#endif
|
||||||
while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL)
|
while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL)
|
||||||
{
|
{
|
||||||
if (!(silent_mode && p_verbose == 0))
|
if (!(silent_mode && p_verbose == 0))
|
||||||
{
|
{
|
||||||
/* NL --> CR NL translation (for Unix, not for "--version") */
|
// NL --> CR NL translation (for Unix, not for "--version")
|
||||||
p = &buf[0];
|
if (*s == NL)
|
||||||
if (*s == '\n' && !info_message)
|
{
|
||||||
*p++ = '\r';
|
int n = (int)(s - p);
|
||||||
#if defined(USE_CR)
|
|
||||||
else
|
buf = alloc(n + 3);
|
||||||
|
memcpy(buf, p, n);
|
||||||
|
if (!info_message)
|
||||||
|
buf[n++] = CAR;
|
||||||
|
#ifdef USE_CR
|
||||||
|
else
|
||||||
#endif
|
#endif
|
||||||
*p++ = *s;
|
buf[n++] = NL;
|
||||||
*p = '\0';
|
buf[n++] = NUL;
|
||||||
if (info_message) /* informative message, not an error */
|
if (info_message) // informative message, not an error
|
||||||
mch_msg((char *)buf);
|
mch_msg((char *)buf);
|
||||||
else
|
else
|
||||||
mch_errmsg((char *)buf);
|
mch_errmsg((char *)buf);
|
||||||
|
vim_free(buf);
|
||||||
|
p = s + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* primitive way to compute the current column */
|
// primitive way to compute the current column
|
||||||
#ifdef FEAT_RIGHTLEFT
|
#ifdef FEAT_RIGHTLEFT
|
||||||
if (cmdmsg_rl)
|
if (cmdmsg_rl)
|
||||||
{
|
{
|
||||||
if (*s == '\r' || *s == '\n')
|
if (*s == CAR || *s == NL)
|
||||||
msg_col = Columns - 1;
|
msg_col = Columns - 1;
|
||||||
else
|
else
|
||||||
--msg_col;
|
--msg_col;
|
||||||
@@ -2628,19 +2616,27 @@ msg_puts_printf(char_u *str, int maxlen)
|
|||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (*s == '\r' || *s == '\n')
|
if (*s == CAR || *s == NL)
|
||||||
msg_col = 0;
|
msg_col = 0;
|
||||||
else
|
else
|
||||||
++msg_col;
|
++msg_col;
|
||||||
}
|
}
|
||||||
++s;
|
++s;
|
||||||
}
|
}
|
||||||
msg_didout = TRUE; /* assume that line is not empty */
|
|
||||||
|
if (*p != NUL && !(silent_mode && p_verbose == 0))
|
||||||
|
{
|
||||||
|
if (maxlen > 0 && STRLEN(p) > (size_t)maxlen)
|
||||||
|
p[maxlen] = 0;
|
||||||
|
if (info_message)
|
||||||
|
mch_msg((char *)p);
|
||||||
|
else
|
||||||
|
mch_errmsg((char *)p);
|
||||||
|
}
|
||||||
|
|
||||||
|
msg_didout = TRUE; // assume that line is not empty
|
||||||
|
|
||||||
#ifdef WIN3264
|
#ifdef WIN3264
|
||||||
# if !defined(FEAT_GUI_MSWIN)
|
|
||||||
vim_free(ccp);
|
|
||||||
# endif
|
|
||||||
if (!(silent_mode && p_verbose == 0))
|
if (!(silent_mode && p_verbose == 0))
|
||||||
mch_settmode(TMODE_RAW);
|
mch_settmode(TMODE_RAW);
|
||||||
#endif
|
#endif
|
||||||
@@ -2941,32 +2937,51 @@ do_more_prompt(int typed_char)
|
|||||||
void
|
void
|
||||||
mch_errmsg(char *str)
|
mch_errmsg(char *str)
|
||||||
{
|
{
|
||||||
|
#if defined(WIN3264) && !defined(FEAT_GUI_MSWIN)
|
||||||
|
int len = STRLEN(str);
|
||||||
|
DWORD nwrite = 0;
|
||||||
|
DWORD mode = 0;
|
||||||
|
HANDLE h = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
|
|
||||||
|
if (GetConsoleMode(h, &mode) && enc_codepage >= 0
|
||||||
|
&& (int)GetConsoleCP() != enc_codepage)
|
||||||
|
{
|
||||||
|
WCHAR *w = enc_to_utf16((char_u *)str, &len);
|
||||||
|
|
||||||
|
WriteConsoleW(h, w, len, &nwrite, NULL);
|
||||||
|
vim_free(w);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s", str);
|
||||||
|
}
|
||||||
|
#else
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
#if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
|
# if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
|
||||||
/* On Unix use stderr if it's a tty.
|
/* On Unix use stderr if it's a tty.
|
||||||
* When not going to start the GUI also use stderr.
|
* When not going to start the GUI also use stderr.
|
||||||
* On Mac, when started from Finder, stderr is the console. */
|
* On Mac, when started from Finder, stderr is the console. */
|
||||||
if (
|
if (
|
||||||
# ifdef UNIX
|
# ifdef UNIX
|
||||||
# ifdef MACOS_X
|
# ifdef MACOS_X
|
||||||
(isatty(2) && strcmp("/dev/console", ttyname(2)) != 0)
|
(isatty(2) && strcmp("/dev/console", ttyname(2)) != 0)
|
||||||
# else
|
# else
|
||||||
isatty(2)
|
isatty(2)
|
||||||
|
# endif
|
||||||
|
# ifdef FEAT_GUI
|
||||||
|
||
|
||||||
|
# endif
|
||||||
# endif
|
# endif
|
||||||
# ifdef FEAT_GUI
|
# ifdef FEAT_GUI
|
||||||
||
|
|
||||||
# endif
|
|
||||||
# endif
|
|
||||||
# ifdef FEAT_GUI
|
|
||||||
!(gui.in_use || gui.starting)
|
!(gui.in_use || gui.starting)
|
||||||
# endif
|
# endif
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "%s", str);
|
fprintf(stderr, "%s", str);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
/* avoid a delay for a message that isn't there */
|
/* avoid a delay for a message that isn't there */
|
||||||
emsg_on_display = FALSE;
|
emsg_on_display = FALSE;
|
||||||
@@ -2981,7 +2996,7 @@ mch_errmsg(char *str)
|
|||||||
{
|
{
|
||||||
mch_memmove((char_u *)error_ga.ga_data + error_ga.ga_len,
|
mch_memmove((char_u *)error_ga.ga_data + error_ga.ga_len,
|
||||||
(char_u *)str, len);
|
(char_u *)str, len);
|
||||||
#ifdef UNIX
|
# ifdef UNIX
|
||||||
/* remove CR characters, they are displayed */
|
/* remove CR characters, they are displayed */
|
||||||
{
|
{
|
||||||
char_u *p;
|
char_u *p;
|
||||||
@@ -2995,10 +3010,11 @@ mch_errmsg(char *str)
|
|||||||
*p = ' ';
|
*p = ' ';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
--len; /* don't count the NUL at the end */
|
--len; /* don't count the NUL at the end */
|
||||||
error_ga.ga_len += len;
|
error_ga.ga_len += len;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -3009,7 +3025,27 @@ mch_errmsg(char *str)
|
|||||||
void
|
void
|
||||||
mch_msg(char *str)
|
mch_msg(char *str)
|
||||||
{
|
{
|
||||||
#if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
|
#if defined(WIN3264) && !defined(FEAT_GUI_MSWIN)
|
||||||
|
int len = STRLEN(str);
|
||||||
|
DWORD nwrite = 0;
|
||||||
|
DWORD mode;
|
||||||
|
HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
|
||||||
|
|
||||||
|
if (GetConsoleMode(h, &mode) && enc_codepage >= 0
|
||||||
|
&& (int)GetConsoleCP() != enc_codepage)
|
||||||
|
{
|
||||||
|
WCHAR *w = enc_to_utf16((char_u *)str, &len);
|
||||||
|
|
||||||
|
WriteConsoleW(h, w, len, &nwrite, NULL);
|
||||||
|
vim_free(w);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf("%s", str);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI)
|
||||||
/* On Unix use stdout if we have a tty. This allows "vim -h | more" and
|
/* On Unix use stdout if we have a tty. This allows "vim -h | more" and
|
||||||
* uses mch_errmsg() when started from the desktop.
|
* uses mch_errmsg() when started from the desktop.
|
||||||
* When not going to start the GUI also use stdout.
|
* When not going to start the GUI also use stdout.
|
||||||
@@ -3035,6 +3071,7 @@ mch_msg(char *str)
|
|||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
mch_errmsg(str);
|
mch_errmsg(str);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif /* USE_MCH_ERRMSG */
|
#endif /* USE_MCH_ERRMSG */
|
||||||
|
|
||||||
|
@@ -675,6 +675,7 @@ mch_suspend(void)
|
|||||||
# undef display_errors
|
# undef display_errors
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef FEAT_GUI
|
||||||
/*
|
/*
|
||||||
* Display the saved error message(s).
|
* Display the saved error message(s).
|
||||||
*/
|
*/
|
||||||
@@ -690,13 +691,9 @@ display_errors(void)
|
|||||||
if (!isspace(*p))
|
if (!isspace(*p))
|
||||||
{
|
{
|
||||||
(void)gui_mch_dialog(
|
(void)gui_mch_dialog(
|
||||||
#ifdef FEAT_GUI
|
|
||||||
gui.starting ? VIM_INFO :
|
gui.starting ? VIM_INFO :
|
||||||
#endif
|
|
||||||
VIM_ERROR,
|
VIM_ERROR,
|
||||||
#ifdef FEAT_GUI
|
|
||||||
gui.starting ? (char_u *)_("Message") :
|
gui.starting ? (char_u *)_("Message") :
|
||||||
#endif
|
|
||||||
(char_u *)_("Error"),
|
(char_u *)_("Error"),
|
||||||
(char_u *)p, (char_u *)_("&Ok"),
|
(char_u *)p, (char_u *)_("&Ok"),
|
||||||
1, NULL, FALSE);
|
1, NULL, FALSE);
|
||||||
@@ -705,6 +702,13 @@ display_errors(void)
|
|||||||
ga_clear(&error_ga);
|
ga_clear(&error_ga);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
void
|
||||||
|
display_errors(void)
|
||||||
|
{
|
||||||
|
FlushFileBuffers(GetStdHandle(STD_ERROR_HANDLE));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@@ -783,6 +783,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 */
|
||||||
|
/**/
|
||||||
|
918,
|
||||||
/**/
|
/**/
|
||||||
917,
|
917,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -2093,7 +2093,7 @@ typedef enum {
|
|||||||
* functions of these names. The declarations would break if the defines had
|
* functions of these names. The declarations would break if the defines had
|
||||||
* been seen at that stage. But it must be before globals.h, where error_ga
|
* been seen at that stage. But it must be before globals.h, where error_ga
|
||||||
* is declared. */
|
* is declared. */
|
||||||
#if !defined(FEAT_GUI_W32) && !defined(FEAT_GUI_X11) \
|
#if !defined(MSWIN) && !defined(FEAT_GUI_X11) \
|
||||||
&& !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MAC) && !defined(PROTO)
|
&& !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_MAC) && !defined(PROTO)
|
||||||
# define mch_errmsg(str) fprintf(stderr, "%s", (str))
|
# define mch_errmsg(str) fprintf(stderr, "%s", (str))
|
||||||
# define display_errors() fflush(stderr)
|
# define display_errors() fflush(stderr)
|
||||||
|
Reference in New Issue
Block a user