mirror of
https://github.com/neovim/neovim.git
synced 2025-10-17 23:31:51 +00:00
vim-patch:8.0.0420: text garbled when the system encoding differs from 'encoding'
Problem: When running :make the output may be in the system encoding,
different from 'encoding'.
Solution: Add the 'makeencoding' option. (Ken Takata)
2c7292dc5b
This commit is contained in:
@@ -160,6 +160,7 @@ typedef struct {
|
||||
buf_T *buf;
|
||||
linenr_T buflnum;
|
||||
linenr_T lnumlast;
|
||||
vimconv_T vc;
|
||||
} qfstate_T;
|
||||
|
||||
typedef struct {
|
||||
@@ -204,7 +205,8 @@ qf_init (
|
||||
char_u *efile,
|
||||
char_u *errorformat,
|
||||
int newlist, /* TRUE: start a new error list */
|
||||
char_u *qf_title
|
||||
char_u *qf_title,
|
||||
char_u *enc
|
||||
)
|
||||
{
|
||||
qf_info_T *qi = &ql_info;
|
||||
@@ -214,8 +216,8 @@ qf_init (
|
||||
}
|
||||
|
||||
return qf_init_ext(qi, efile, curbuf, NULL, errorformat, newlist,
|
||||
(linenr_T)0, (linenr_T)0,
|
||||
qf_title);
|
||||
(linenr_T)0, (linenr_T)0,
|
||||
qf_title, enc);
|
||||
}
|
||||
|
||||
// Maximum number of bytes allowed per line while reading an errorfile.
|
||||
@@ -638,6 +640,22 @@ retry:
|
||||
} else {
|
||||
state->linebuf = IObuff;
|
||||
}
|
||||
|
||||
// Convert a line if it contains a non-ASCII character
|
||||
if (state->vc.vc_type != CONV_NONE && has_non_ascii(state->linebuf)) {
|
||||
char_u *line = string_convert(&state->vc, state->linebuf, &state->linelen);
|
||||
if (line != NULL) {
|
||||
if (state->linelen < IOSIZE) {
|
||||
STRLCPY(state->linebuf, line, state->linelen + 1);
|
||||
xfree(line);
|
||||
} else {
|
||||
xfree(state->growbuf);
|
||||
state->linebuf = state->growbuf = line;
|
||||
state->growbufsiz = state->linelen < LINE_MAXLEN
|
||||
? state->linelen : LINE_MAXLEN;
|
||||
}
|
||||
}
|
||||
}
|
||||
return QF_OK;
|
||||
}
|
||||
|
||||
@@ -979,12 +997,12 @@ qf_init_ext(
|
||||
int newlist, /* TRUE: start a new error list */
|
||||
linenr_T lnumfirst, /* first line number to use */
|
||||
linenr_T lnumlast, /* last line number to use */
|
||||
char_u *qf_title
|
||||
char_u *qf_title,
|
||||
char_u *enc
|
||||
)
|
||||
{
|
||||
qfstate_T state = { NULL, 0, NULL, 0, NULL, NULL, NULL, NULL,
|
||||
NULL, 0, 0 };
|
||||
qffields_T fields = { NULL, NULL, 0, 0L, 0, false, NULL, 0, 0, 0 };
|
||||
qfstate_T state;
|
||||
qffields_T fields;
|
||||
qfline_T *old_last = NULL;
|
||||
bool adding = false;
|
||||
static efm_T *fmt_first = NULL;
|
||||
@@ -997,6 +1015,13 @@ qf_init_ext(
|
||||
xfree(qf_last_bufname);
|
||||
qf_last_bufname = NULL;
|
||||
|
||||
memset(&state, 0, sizeof(state));
|
||||
memset(&fields, 0, sizeof(fields));
|
||||
state.vc.vc_type = CONV_NONE;
|
||||
if (enc != NULL && *enc != NUL) {
|
||||
convert_setup(&state.vc, enc, p_enc);
|
||||
}
|
||||
|
||||
fields.namebuf = xmalloc(CMDBUFFSIZE + 1);
|
||||
fields.errmsglen = CMDBUFFSIZE + 1;
|
||||
fields.errmsg = xmalloc(fields.errmsglen);
|
||||
@@ -1147,6 +1172,10 @@ qf_init_end:
|
||||
|
||||
qf_update_buffer(qi, old_last);
|
||||
|
||||
if (state.vc.vc_type != CONV_NONE) {
|
||||
convert_setup(&state.vc, NULL, NULL);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -3024,6 +3053,7 @@ void ex_make(exarg_T *eap)
|
||||
qf_info_T *qi = &ql_info;
|
||||
int res;
|
||||
char_u *au_name = NULL;
|
||||
char_u *enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
|
||||
|
||||
/* Redirect ":grep" to ":vimgrep" if 'grepprg' is "internal". */
|
||||
if (grep_internal(eap->cmdidx)) {
|
||||
@@ -3083,9 +3113,8 @@ void ex_make(exarg_T *eap)
|
||||
|
||||
res = qf_init(wp, fname, (eap->cmdidx != CMD_make
|
||||
&& eap->cmdidx != CMD_lmake) ? p_gefm : p_efm,
|
||||
(eap->cmdidx != CMD_grepadd
|
||||
&& eap->cmdidx != CMD_lgrepadd),
|
||||
*eap->cmdlinep);
|
||||
(eap->cmdidx != CMD_grepadd && eap->cmdidx != CMD_lgrepadd),
|
||||
*eap->cmdlinep, enc);
|
||||
if (wp != NULL)
|
||||
qi = GET_LOC_LIST(wp);
|
||||
if (au_name != NULL) {
|
||||
@@ -3429,6 +3458,7 @@ void ex_cfile(exarg_T *eap)
|
||||
if (*eap->arg != NUL)
|
||||
set_string_option_direct((char_u *)"ef", -1, eap->arg, OPT_FREE, 0);
|
||||
|
||||
char_u *enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
|
||||
/*
|
||||
* This function is used by the :cfile, :cgetfile and :caddfile
|
||||
* commands.
|
||||
@@ -3441,7 +3471,7 @@ void ex_cfile(exarg_T *eap)
|
||||
*/
|
||||
if (qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
|
||||
&& eap->cmdidx != CMD_laddfile),
|
||||
*eap->cmdlinep) > 0
|
||||
*eap->cmdlinep, enc) > 0
|
||||
&& (eap->cmdidx == CMD_cfile
|
||||
|| eap->cmdidx == CMD_lfile)) {
|
||||
if (au_name != NULL)
|
||||
@@ -4338,7 +4368,7 @@ void ex_cbuffer(exarg_T *eap)
|
||||
if (qf_init_ext(qi, NULL, buf, NULL, p_efm,
|
||||
(eap->cmdidx != CMD_caddbuffer
|
||||
&& eap->cmdidx != CMD_laddbuffer),
|
||||
eap->line1, eap->line2, qf_title) > 0) {
|
||||
eap->line1, eap->line2, qf_title, NULL) > 0) {
|
||||
if (au_name != NULL) {
|
||||
apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name,
|
||||
curbuf->b_fname, true, curbuf);
|
||||
@@ -4403,7 +4433,7 @@ void ex_cexpr(exarg_T *eap)
|
||||
if (qf_init_ext(qi, NULL, NULL, &tv, p_efm,
|
||||
(eap->cmdidx != CMD_caddexpr
|
||||
&& eap->cmdidx != CMD_laddexpr),
|
||||
(linenr_T)0, (linenr_T)0, *eap->cmdlinep) > 0) {
|
||||
(linenr_T)0, (linenr_T)0, *eap->cmdlinep, NULL) > 0) {
|
||||
if (au_name != NULL) {
|
||||
apply_autocmds(EVENT_QUICKFIXCMDPOST, (char_u *)au_name,
|
||||
curbuf->b_fname, true, curbuf);
|
||||
|
Reference in New Issue
Block a user