mirror of
https://github.com/vim/vim.git
synced 2025-09-04 21:33:48 -04:00
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)
This commit is contained in:
parent
214641f77d
commit
2c7292dc5b
@ -4994,6 +4994,25 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
This option cannot be set from a |modeline| or in the |sandbox|, for
|
This option cannot be set from a |modeline| or in the |sandbox|, for
|
||||||
security reasons.
|
security reasons.
|
||||||
|
|
||||||
|
*'makeencoding'* *'menc'*
|
||||||
|
'makeencoding' 'menc' string (default "")
|
||||||
|
global or local to buffer |global-local|
|
||||||
|
{only available when compiled with the |+multi_byte|
|
||||||
|
feature}
|
||||||
|
{not in Vi}
|
||||||
|
Encoding used for reading the output of external commands. When empty,
|
||||||
|
encoding is not converted.
|
||||||
|
This is used for `:make`, `:lmake`, `:grep`, `:lgrep`, `:grepadd`,
|
||||||
|
`:lgrepadd`, `:cfile`, `:cgetfile`, `:caddfile`, `:lfile`, `:lgetfile`,
|
||||||
|
and `:laddfile`.
|
||||||
|
|
||||||
|
This would be mostly useful when you use MS-Windows and set 'encoding'
|
||||||
|
to "utf-8". If |+iconv| is enabled and GNU libiconv is used, setting
|
||||||
|
'makeencoding' to "char" has the same effect as setting to the system
|
||||||
|
locale encoding. Example: >
|
||||||
|
:set encoding=utf-8
|
||||||
|
:set makeencoding=char " system locale is used
|
||||||
|
<
|
||||||
*'makeprg'* *'mp'*
|
*'makeprg'* *'mp'*
|
||||||
'makeprg' 'mp' string (default "make", VMS: "MMS")
|
'makeprg' 'mp' string (default "make", VMS: "MMS")
|
||||||
global or local to buffer |global-local|
|
global or local to buffer |global-local|
|
||||||
|
@ -164,6 +164,9 @@ processing a quickfix or location list command, it will be aborted.
|
|||||||
keep Vim running while compiling. If you give the
|
keep Vim running while compiling. If you give the
|
||||||
name of the errorfile, the 'errorfile' option will
|
name of the errorfile, the 'errorfile' option will
|
||||||
be set to [errorfile]. See |:cc| for [!].
|
be set to [errorfile]. See |:cc| for [!].
|
||||||
|
If the encoding of the error file differs from the
|
||||||
|
'encoding' option, you can use the 'makeencoding'
|
||||||
|
option to specify the encoding.
|
||||||
|
|
||||||
*:lf* *:lfile*
|
*:lf* *:lfile*
|
||||||
:lf[ile][!] [errorfile] Same as ":cfile", except the location list for the
|
:lf[ile][!] [errorfile] Same as ":cfile", except the location list for the
|
||||||
@ -175,6 +178,9 @@ processing a quickfix or location list command, it will be aborted.
|
|||||||
:cg[etfile] [errorfile] *:cg* *:cgetfile*
|
:cg[etfile] [errorfile] *:cg* *:cgetfile*
|
||||||
Read the error file. Just like ":cfile" but don't
|
Read the error file. Just like ":cfile" but don't
|
||||||
jump to the first error.
|
jump to the first error.
|
||||||
|
If the encoding of the error file differs from the
|
||||||
|
'encoding' option, you can use the 'makeencoding'
|
||||||
|
option to specify the encoding.
|
||||||
|
|
||||||
|
|
||||||
:lg[etfile] [errorfile] *:lg* *:lgetfile*
|
:lg[etfile] [errorfile] *:lg* *:lgetfile*
|
||||||
@ -185,6 +191,9 @@ processing a quickfix or location list command, it will be aborted.
|
|||||||
:caddf[ile] [errorfile] Read the error file and add the errors from the
|
:caddf[ile] [errorfile] Read the error file and add the errors from the
|
||||||
errorfile to the current quickfix list. If a quickfix
|
errorfile to the current quickfix list. If a quickfix
|
||||||
list is not present, then a new list is created.
|
list is not present, then a new list is created.
|
||||||
|
If the encoding of the error file differs from the
|
||||||
|
'encoding' option, you can use the 'makeencoding'
|
||||||
|
option to specify the encoding.
|
||||||
|
|
||||||
*:laddf* *:laddfile*
|
*:laddf* *:laddfile*
|
||||||
:laddf[ile] [errorfile] Same as ":caddfile", except the location list for the
|
:laddf[ile] [errorfile] Same as ":caddfile", except the location list for the
|
||||||
@ -320,6 +329,7 @@ use this code: >
|
|||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
au QuickfixCmdPost make call QfMakeConv()
|
au QuickfixCmdPost make call QfMakeConv()
|
||||||
|
Another option is using 'makeencoding'.
|
||||||
|
|
||||||
|
|
||||||
EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
|
EXECUTE A COMMAND IN ALL THE BUFFERS IN QUICKFIX OR LOCATION LIST:
|
||||||
@ -586,6 +596,9 @@ lists, use ":cnewer 99" first.
|
|||||||
like |:cnext| and |:cprevious|, see above.
|
like |:cnext| and |:cprevious|, see above.
|
||||||
This command does not accept a comment, any "
|
This command does not accept a comment, any "
|
||||||
characters are considered part of the arguments.
|
characters are considered part of the arguments.
|
||||||
|
If the encoding of the program output differs from the
|
||||||
|
'encoding' option, you can use the 'makeencoding'
|
||||||
|
option to specify the encoding.
|
||||||
|
|
||||||
*:lmak* *:lmake*
|
*:lmak* *:lmake*
|
||||||
:lmak[e][!] [arguments]
|
:lmak[e][!] [arguments]
|
||||||
@ -645,6 +658,7 @@ read the error messages: >
|
|||||||
au QuickfixCmdPost make call QfMakeConv()
|
au QuickfixCmdPost make call QfMakeConv()
|
||||||
|
|
||||||
(Example by Faque Cheng)
|
(Example by Faque Cheng)
|
||||||
|
Another option is using 'makeencoding'.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
5. Using :vimgrep and :grep *grep* *lid*
|
5. Using :vimgrep and :grep *grep* *lid*
|
||||||
@ -759,6 +773,9 @@ id-utils) in a similar way to its compiler integration (see |:make| above).
|
|||||||
When 'grepprg' is "internal" this works like
|
When 'grepprg' is "internal" this works like
|
||||||
|:vimgrep|. Note that the pattern needs to be
|
|:vimgrep|. Note that the pattern needs to be
|
||||||
enclosed in separator characters then.
|
enclosed in separator characters then.
|
||||||
|
If the encoding of the program output differs from the
|
||||||
|
'encoding' option, you can use the 'makeencoding'
|
||||||
|
option to specify the encoding.
|
||||||
|
|
||||||
*:lgr* *:lgrep*
|
*:lgr* *:lgrep*
|
||||||
:lgr[ep][!] [arguments] Same as ":grep", except the location list for the
|
:lgr[ep][!] [arguments] Same as ":grep", except the location list for the
|
||||||
@ -783,6 +800,10 @@ id-utils) in a similar way to its compiler integration (see |:make| above).
|
|||||||
\ | catch /E480:/
|
\ | catch /E480:/
|
||||||
\ | endtry"
|
\ | endtry"
|
||||||
<
|
<
|
||||||
|
If the encoding of the program output differs from the
|
||||||
|
'encoding' option, you can use the 'makeencoding'
|
||||||
|
option to specify the encoding.
|
||||||
|
|
||||||
*:lgrepa* *:lgrepadd*
|
*:lgrepa* *:lgrepadd*
|
||||||
:lgrepa[dd][!] [arguments]
|
:lgrepa[dd][!] [arguments]
|
||||||
Same as ":grepadd", except the location list for the
|
Same as ":grepadd", except the location list for the
|
||||||
|
@ -782,6 +782,7 @@ Short explanation of each option: *option-list*
|
|||||||
'macatsui' Mac GUI: use ATSUI text drawing
|
'macatsui' Mac GUI: use ATSUI text drawing
|
||||||
'magic' changes special characters in search patterns
|
'magic' changes special characters in search patterns
|
||||||
'makeef' 'mef' name of the errorfile for ":make"
|
'makeef' 'mef' name of the errorfile for ":make"
|
||||||
|
'makeencoding' 'menc' encoding of external make/grep commands
|
||||||
'makeprg' 'mp' program to use for the ":make" command
|
'makeprg' 'mp' program to use for the ":make" command
|
||||||
'matchpairs' 'mps' pairs of characters that "%" can match
|
'matchpairs' 'mps' pairs of characters that "%" can match
|
||||||
'matchtime' 'mat' tenths of a second to show matching paren
|
'matchtime' 'mat' tenths of a second to show matching paren
|
||||||
|
@ -2157,6 +2157,7 @@ test_arglist \
|
|||||||
test_listlbr \
|
test_listlbr \
|
||||||
test_listlbr_utf8 \
|
test_listlbr_utf8 \
|
||||||
test_lua \
|
test_lua \
|
||||||
|
test_makeencoding \
|
||||||
test_man \
|
test_man \
|
||||||
test_mapping \
|
test_mapping \
|
||||||
test_marks \
|
test_marks \
|
||||||
|
@ -2255,6 +2255,9 @@ free_buf_options(
|
|||||||
clear_string_option(&buf->b_p_lw);
|
clear_string_option(&buf->b_p_lw);
|
||||||
#endif
|
#endif
|
||||||
clear_string_option(&buf->b_p_bkc);
|
clear_string_option(&buf->b_p_bkc);
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
clear_string_option(&buf->b_p_menc);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1242,7 +1242,7 @@ cs_find_common(
|
|||||||
wp = curwin;
|
wp = curwin;
|
||||||
/* '-' starts a new error list */
|
/* '-' starts a new error list */
|
||||||
if (qf_init(wp, tmp, (char_u *)"%f%*\\t%l%*\\t%m",
|
if (qf_init(wp, tmp, (char_u *)"%f%*\\t%l%*\\t%m",
|
||||||
*qfpos == '-', cmdline) > 0)
|
*qfpos == '-', cmdline, NULL) > 0)
|
||||||
{
|
{
|
||||||
# ifdef FEAT_WINDOWS
|
# ifdef FEAT_WINDOWS
|
||||||
if (postponed_split != 0)
|
if (postponed_split != 0)
|
||||||
|
@ -559,11 +559,16 @@ vim_main2(void)
|
|||||||
*/
|
*/
|
||||||
if (params.edit_type == EDIT_QF)
|
if (params.edit_type == EDIT_QF)
|
||||||
{
|
{
|
||||||
|
char_u *enc = NULL;
|
||||||
|
|
||||||
|
# ifdef FEAT_MBYTE
|
||||||
|
enc = p_menc;
|
||||||
|
# endif
|
||||||
if (params.use_ef != NULL)
|
if (params.use_ef != NULL)
|
||||||
set_string_option_direct((char_u *)"ef", -1,
|
set_string_option_direct((char_u *)"ef", -1,
|
||||||
params.use_ef, OPT_FREE, SID_CARG);
|
params.use_ef, OPT_FREE, SID_CARG);
|
||||||
vim_snprintf((char *)IObuff, IOSIZE, "cfile %s", p_ef);
|
vim_snprintf((char *)IObuff, IOSIZE, "cfile %s", p_ef);
|
||||||
if (qf_init(NULL, p_ef, p_efm, TRUE, IObuff) < 0)
|
if (qf_init(NULL, p_ef, p_efm, TRUE, IObuff, enc) < 0)
|
||||||
{
|
{
|
||||||
out_char('\n');
|
out_char('\n');
|
||||||
mch_exit(3);
|
mch_exit(3);
|
||||||
|
35
src/option.c
35
src/option.c
@ -139,6 +139,9 @@
|
|||||||
# define PV_LISP OPT_BUF(BV_LISP)
|
# define PV_LISP OPT_BUF(BV_LISP)
|
||||||
# define PV_LW OPT_BOTH(OPT_BUF(BV_LW))
|
# define PV_LW OPT_BOTH(OPT_BUF(BV_LW))
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
# define PV_MENC OPT_BOTH(OPT_BUF(BV_MENC))
|
||||||
|
#endif
|
||||||
#define PV_MA OPT_BUF(BV_MA)
|
#define PV_MA OPT_BUF(BV_MA)
|
||||||
#define PV_ML OPT_BUF(BV_ML)
|
#define PV_ML OPT_BUF(BV_ML)
|
||||||
#define PV_MOD OPT_BUF(BV_MOD)
|
#define PV_MOD OPT_BUF(BV_MOD)
|
||||||
@ -1898,6 +1901,15 @@ static struct vimoption options[] =
|
|||||||
#else
|
#else
|
||||||
(char_u *)NULL, PV_NONE,
|
(char_u *)NULL, PV_NONE,
|
||||||
{(char_u *)NULL, (char_u *)0L}
|
{(char_u *)NULL, (char_u *)0L}
|
||||||
|
#endif
|
||||||
|
SCRIPTID_INIT},
|
||||||
|
{"makeencoding","menc", P_STRING|P_VI_DEF,
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
(char_u *)&p_menc, PV_MENC,
|
||||||
|
{(char_u *)"", (char_u *)0L}
|
||||||
|
#else
|
||||||
|
(char_u *)NULL, PV_NONE,
|
||||||
|
{(char_u *)0L, (char_u *)0L}
|
||||||
#endif
|
#endif
|
||||||
SCRIPTID_INIT},
|
SCRIPTID_INIT},
|
||||||
{"makeprg", "mp", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
|
{"makeprg", "mp", P_STRING|P_EXPAND|P_VI_DEF|P_SECURE,
|
||||||
@ -5686,6 +5698,9 @@ check_buf_options(buf_T *buf)
|
|||||||
check_string_option(&buf->b_p_lw);
|
check_string_option(&buf->b_p_lw);
|
||||||
#endif
|
#endif
|
||||||
check_string_option(&buf->b_p_bkc);
|
check_string_option(&buf->b_p_bkc);
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
check_string_option(&buf->b_p_menc);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -6289,8 +6304,9 @@ did_set_string_option(
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_MBYTE
|
#ifdef FEAT_MBYTE
|
||||||
/* 'encoding' and 'fileencoding' */
|
/* 'encoding', 'fileencoding', 'termencoding' and 'makeencoding' */
|
||||||
else if (varp == &p_enc || gvarp == &p_fenc || varp == &p_tenc)
|
else if (varp == &p_enc || gvarp == &p_fenc || varp == &p_tenc
|
||||||
|
|| gvarp == &p_menc)
|
||||||
{
|
{
|
||||||
if (gvarp == &p_fenc)
|
if (gvarp == &p_fenc)
|
||||||
{
|
{
|
||||||
@ -10424,6 +10440,11 @@ unset_global_local_option(char_u *name, void *from)
|
|||||||
case PV_LW:
|
case PV_LW:
|
||||||
clear_string_option(&buf->b_p_lw);
|
clear_string_option(&buf->b_p_lw);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
case PV_MENC:
|
||||||
|
clear_string_option(&buf->b_p_menc);
|
||||||
|
break;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -10478,6 +10499,9 @@ get_varp_scope(struct vimoption *p, int opt_flags)
|
|||||||
case PV_LW: return (char_u *)&(curbuf->b_p_lw);
|
case PV_LW: return (char_u *)&(curbuf->b_p_lw);
|
||||||
#endif
|
#endif
|
||||||
case PV_BKC: return (char_u *)&(curbuf->b_p_bkc);
|
case PV_BKC: return (char_u *)&(curbuf->b_p_bkc);
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
case PV_MENC: return (char_u *)&(curbuf->b_p_menc);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
return NULL; /* "cannot happen" */
|
return NULL; /* "cannot happen" */
|
||||||
}
|
}
|
||||||
@ -10553,6 +10577,10 @@ get_varp(struct vimoption *p)
|
|||||||
case PV_LW: return *curbuf->b_p_lw != NUL
|
case PV_LW: return *curbuf->b_p_lw != NUL
|
||||||
? (char_u *)&(curbuf->b_p_lw) : p->var;
|
? (char_u *)&(curbuf->b_p_lw) : p->var;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
case PV_MENC: return *curbuf->b_p_menc != NUL
|
||||||
|
? (char_u *)&(curbuf->b_p_menc) : p->var;
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef FEAT_ARABIC
|
#ifdef FEAT_ARABIC
|
||||||
case PV_ARAB: return (char_u *)&(curwin->w_p_arab);
|
case PV_ARAB: return (char_u *)&(curwin->w_p_arab);
|
||||||
@ -11154,6 +11182,9 @@ buf_copy_options(buf_T *buf, int flags)
|
|||||||
#ifdef FEAT_LISP
|
#ifdef FEAT_LISP
|
||||||
buf->b_p_lw = empty_option;
|
buf->b_p_lw = empty_option;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
buf->b_p_menc = empty_option;
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't copy the options set by ex_help(), use the saved values,
|
* Don't copy the options set by ex_help(), use the saved values,
|
||||||
|
@ -630,6 +630,9 @@ EXTERN char_u *p_luadll; /* 'luadll' */
|
|||||||
EXTERN int p_macatsui; /* 'macatsui' */
|
EXTERN int p_macatsui; /* 'macatsui' */
|
||||||
#endif
|
#endif
|
||||||
EXTERN int p_magic; /* 'magic' */
|
EXTERN int p_magic; /* 'magic' */
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
EXTERN char_u *p_menc; /* 'makeencoding' */
|
||||||
|
#endif
|
||||||
#ifdef FEAT_QUICKFIX
|
#ifdef FEAT_QUICKFIX
|
||||||
EXTERN char_u *p_mef; /* 'makeef' */
|
EXTERN char_u *p_mef; /* 'makeef' */
|
||||||
EXTERN char_u *p_mp; /* 'makeprg' */
|
EXTERN char_u *p_mp; /* 'makeprg' */
|
||||||
@ -1064,6 +1067,9 @@ enum
|
|||||||
#ifdef FEAT_LISP
|
#ifdef FEAT_LISP
|
||||||
, BV_LISP
|
, BV_LISP
|
||||||
, BV_LW
|
, BV_LW
|
||||||
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
, BV_MENC
|
||||||
#endif
|
#endif
|
||||||
, BV_MA
|
, BV_MA
|
||||||
, BV_ML
|
, BV_ML
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* quickfix.c */
|
/* quickfix.c */
|
||||||
int qf_init(win_T *wp, char_u *efile, char_u *errorformat, int newlist, char_u *qf_title);
|
int qf_init(win_T *wp, char_u *efile, char_u *errorformat, int newlist, char_u *qf_title, char_u *enc);
|
||||||
void qf_free_all(win_T *wp);
|
void qf_free_all(win_T *wp);
|
||||||
void copy_loclist(win_T *from, win_T *to);
|
void copy_loclist(win_T *from, win_T *to);
|
||||||
void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit);
|
void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit);
|
||||||
|
@ -116,7 +116,7 @@ struct efm_S
|
|||||||
|
|
||||||
static efm_T *fmt_start = NULL; /* cached across qf_parse_line() calls */
|
static efm_T *fmt_start = NULL; /* cached across qf_parse_line() calls */
|
||||||
|
|
||||||
static int qf_init_ext(qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title);
|
static int qf_init_ext(qf_info_T *qi, char_u *efile, buf_T *buf, typval_T *tv, char_u *errorformat, int newlist, linenr_T lnumfirst, linenr_T lnumlast, char_u *qf_title, char_u *enc);
|
||||||
static void qf_store_title(qf_info_T *qi, char_u *title);
|
static void qf_store_title(qf_info_T *qi, char_u *title);
|
||||||
static void qf_new_list(qf_info_T *qi, char_u *qf_title);
|
static void qf_new_list(qf_info_T *qi, char_u *qf_title);
|
||||||
static void ll_free_all(qf_info_T **pqi);
|
static void ll_free_all(qf_info_T **pqi);
|
||||||
@ -167,7 +167,8 @@ qf_init(
|
|||||||
char_u *efile,
|
char_u *efile,
|
||||||
char_u *errorformat,
|
char_u *errorformat,
|
||||||
int newlist, /* TRUE: start a new error list */
|
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;
|
qf_info_T *qi = &ql_info;
|
||||||
|
|
||||||
@ -180,7 +181,7 @@ qf_init(
|
|||||||
|
|
||||||
return qf_init_ext(qi, efile, curbuf, NULL, errorformat, newlist,
|
return qf_init_ext(qi, efile, curbuf, NULL, errorformat, newlist,
|
||||||
(linenr_T)0, (linenr_T)0,
|
(linenr_T)0, (linenr_T)0,
|
||||||
qf_title);
|
qf_title, enc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -498,6 +499,7 @@ typedef struct {
|
|||||||
buf_T *buf;
|
buf_T *buf;
|
||||||
linenr_T buflnum;
|
linenr_T buflnum;
|
||||||
linenr_T lnumlast;
|
linenr_T lnumlast;
|
||||||
|
vimconv_T vc;
|
||||||
} qfstate_T;
|
} qfstate_T;
|
||||||
|
|
||||||
static char_u *
|
static char_u *
|
||||||
@ -713,6 +715,30 @@ qf_get_next_file_line(qfstate_T *state)
|
|||||||
else
|
else
|
||||||
state->linebuf = IObuff;
|
state->linebuf = IObuff;
|
||||||
|
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
/* 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;
|
||||||
|
|
||||||
|
line = string_convert(&state->vc, state->linebuf, &state->linelen);
|
||||||
|
if (line != NULL)
|
||||||
|
{
|
||||||
|
if (state->linelen < IOSIZE)
|
||||||
|
{
|
||||||
|
STRCPY(state->linebuf, line);
|
||||||
|
vim_free(line);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vim_free(state->growbuf);
|
||||||
|
state->linebuf = state->growbuf = line;
|
||||||
|
state->growbufsiz = state->linelen < LINE_MAXLEN
|
||||||
|
? state->linelen : LINE_MAXLEN;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return QF_OK;
|
return QF_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1105,11 +1131,11 @@ qf_init_ext(
|
|||||||
int newlist, /* TRUE: start a new error list */
|
int newlist, /* TRUE: start a new error list */
|
||||||
linenr_T lnumfirst, /* first line number to use */
|
linenr_T lnumfirst, /* first line number to use */
|
||||||
linenr_T lnumlast, /* last 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,
|
qfstate_T state;
|
||||||
NULL, 0, 0};
|
qffields_T fields;
|
||||||
qffields_T fields = {NULL, NULL, 0, 0L, 0, FALSE, NULL, 0, 0, 0};
|
|
||||||
#ifdef FEAT_WINDOWS
|
#ifdef FEAT_WINDOWS
|
||||||
qfline_T *old_last = NULL;
|
qfline_T *old_last = NULL;
|
||||||
int adding = FALSE;
|
int adding = FALSE;
|
||||||
@ -1120,6 +1146,13 @@ qf_init_ext(
|
|||||||
int retval = -1; /* default: return error flag */
|
int retval = -1; /* default: return error flag */
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
vim_memset(&state, 0, sizeof(state));
|
||||||
|
vim_memset(&fields, 0, sizeof(fields));
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
state.vc.vc_type = CONV_NONE;
|
||||||
|
if (enc != NULL && *enc != NUL)
|
||||||
|
convert_setup(&state.vc, enc, p_enc);
|
||||||
|
#endif
|
||||||
fields.namebuf = alloc_id(CMDBUFFSIZE + 1, aid_qf_namebuf);
|
fields.namebuf = alloc_id(CMDBUFFSIZE + 1, aid_qf_namebuf);
|
||||||
fields.errmsglen = CMDBUFFSIZE + 1;
|
fields.errmsglen = CMDBUFFSIZE + 1;
|
||||||
fields.errmsg = alloc_id(fields.errmsglen, aid_qf_errmsg);
|
fields.errmsg = alloc_id(fields.errmsglen, aid_qf_errmsg);
|
||||||
@ -1286,6 +1319,10 @@ qf_init_end:
|
|||||||
#ifdef FEAT_WINDOWS
|
#ifdef FEAT_WINDOWS
|
||||||
qf_update_buffer(qi, old_last);
|
qf_update_buffer(qi, old_last);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
if (state.vc.vc_type != CONV_NONE)
|
||||||
|
convert_setup(&state.vc, NULL, NULL);
|
||||||
|
#endif
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
@ -3431,6 +3468,7 @@ ex_make(exarg_T *eap)
|
|||||||
{
|
{
|
||||||
char_u *fname;
|
char_u *fname;
|
||||||
char_u *cmd;
|
char_u *cmd;
|
||||||
|
char_u *enc = NULL;
|
||||||
unsigned len;
|
unsigned len;
|
||||||
win_T *wp = NULL;
|
win_T *wp = NULL;
|
||||||
qf_info_T *qi = &ql_info;
|
qf_info_T *qi = &ql_info;
|
||||||
@ -3464,6 +3502,9 @@ ex_make(exarg_T *eap)
|
|||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (eap->cmdidx == CMD_lmake || eap->cmdidx == CMD_lgrep
|
if (eap->cmdidx == CMD_lmake || eap->cmdidx == CMD_lgrep
|
||||||
|| eap->cmdidx == CMD_lgrepadd)
|
|| eap->cmdidx == CMD_lgrepadd)
|
||||||
@ -3511,7 +3552,7 @@ ex_make(exarg_T *eap)
|
|||||||
&& eap->cmdidx != CMD_lmake) ? p_gefm : p_efm,
|
&& eap->cmdidx != CMD_lmake) ? p_gefm : p_efm,
|
||||||
(eap->cmdidx != CMD_grepadd
|
(eap->cmdidx != CMD_grepadd
|
||||||
&& eap->cmdidx != CMD_lgrepadd),
|
&& eap->cmdidx != CMD_lgrepadd),
|
||||||
*eap->cmdlinep);
|
*eap->cmdlinep, enc);
|
||||||
if (wp != NULL)
|
if (wp != NULL)
|
||||||
qi = GET_LOC_LIST(wp);
|
qi = GET_LOC_LIST(wp);
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
@ -3850,6 +3891,7 @@ ex_cnext(exarg_T *eap)
|
|||||||
void
|
void
|
||||||
ex_cfile(exarg_T *eap)
|
ex_cfile(exarg_T *eap)
|
||||||
{
|
{
|
||||||
|
char_u *enc = NULL;
|
||||||
win_T *wp = NULL;
|
win_T *wp = NULL;
|
||||||
qf_info_T *qi = &ql_info;
|
qf_info_T *qi = &ql_info;
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
@ -3874,6 +3916,9 @@ ex_cfile(exarg_T *eap)
|
|||||||
if (au_name != NULL)
|
if (au_name != NULL)
|
||||||
apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, NULL, FALSE, curbuf);
|
apply_autocmds(EVENT_QUICKFIXCMDPRE, au_name, NULL, FALSE, curbuf);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
enc = (*curbuf->b_p_menc != NUL) ? curbuf->b_p_menc : p_menc;
|
||||||
|
#endif
|
||||||
#ifdef FEAT_BROWSE
|
#ifdef FEAT_BROWSE
|
||||||
if (cmdmod.browse)
|
if (cmdmod.browse)
|
||||||
{
|
{
|
||||||
@ -3901,7 +3946,7 @@ ex_cfile(exarg_T *eap)
|
|||||||
*/
|
*/
|
||||||
if (qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
|
if (qf_init(wp, p_ef, p_efm, (eap->cmdidx != CMD_caddfile
|
||||||
&& eap->cmdidx != CMD_laddfile),
|
&& eap->cmdidx != CMD_laddfile),
|
||||||
*eap->cmdlinep) > 0
|
*eap->cmdlinep, enc) > 0
|
||||||
&& (eap->cmdidx == CMD_cfile
|
&& (eap->cmdidx == CMD_cfile
|
||||||
|| eap->cmdidx == CMD_lfile))
|
|| eap->cmdidx == CMD_lfile))
|
||||||
{
|
{
|
||||||
@ -4927,7 +4972,7 @@ ex_cbuffer(exarg_T *eap)
|
|||||||
(eap->cmdidx != CMD_caddbuffer
|
(eap->cmdidx != CMD_caddbuffer
|
||||||
&& eap->cmdidx != CMD_laddbuffer),
|
&& eap->cmdidx != CMD_laddbuffer),
|
||||||
eap->line1, eap->line2,
|
eap->line1, eap->line2,
|
||||||
qf_title) > 0)
|
qf_title, NULL) > 0)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
if (au_name != NULL)
|
if (au_name != NULL)
|
||||||
@ -4995,7 +5040,8 @@ ex_cexpr(exarg_T *eap)
|
|||||||
if (qf_init_ext(qi, NULL, NULL, tv, p_efm,
|
if (qf_init_ext(qi, NULL, NULL, tv, p_efm,
|
||||||
(eap->cmdidx != CMD_caddexpr
|
(eap->cmdidx != CMD_caddexpr
|
||||||
&& eap->cmdidx != CMD_laddexpr),
|
&& eap->cmdidx != CMD_laddexpr),
|
||||||
(linenr_T)0, (linenr_T)0, *eap->cmdlinep) > 0)
|
(linenr_T)0, (linenr_T)0, *eap->cmdlinep,
|
||||||
|
NULL) > 0)
|
||||||
{
|
{
|
||||||
#ifdef FEAT_AUTOCMD
|
#ifdef FEAT_AUTOCMD
|
||||||
if (au_name != NULL)
|
if (au_name != NULL)
|
||||||
|
@ -2132,6 +2132,9 @@ struct file_buffer
|
|||||||
char_u *b_p_kp; /* 'keywordprg' */
|
char_u *b_p_kp; /* 'keywordprg' */
|
||||||
#ifdef FEAT_LISP
|
#ifdef FEAT_LISP
|
||||||
int b_p_lisp; /* 'lisp' */
|
int b_p_lisp; /* 'lisp' */
|
||||||
|
#endif
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
char_u *b_p_menc; /* 'makeencoding' */
|
||||||
#endif
|
#endif
|
||||||
char_u *b_p_mps; /* 'matchpairs' */
|
char_u *b_p_mps; /* 'matchpairs' */
|
||||||
int b_p_ml; /* 'modeline' */
|
int b_p_ml; /* 'modeline' */
|
||||||
|
@ -170,6 +170,7 @@ NEW_TESTS = test_arabic.res \
|
|||||||
test_listlbr.res \
|
test_listlbr.res \
|
||||||
test_listlbr_utf8.res \
|
test_listlbr_utf8.res \
|
||||||
test_lua.res \
|
test_lua.res \
|
||||||
|
test_makeencoding.res \
|
||||||
test_man.res \
|
test_man.res \
|
||||||
test_marks.res \
|
test_marks.res \
|
||||||
test_matchadd_conceal.res \
|
test_matchadd_conceal.res \
|
||||||
|
67
src/testdir/test_makeencoding.py
Normal file
67
src/testdir/test_makeencoding.py
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
#!/usr/bin/python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# Test program for :make, :grep and :cgetfile.
|
||||||
|
|
||||||
|
from __future__ import print_function, unicode_literals
|
||||||
|
import locale
|
||||||
|
import io
|
||||||
|
import sys
|
||||||
|
|
||||||
|
def set_output_encoding(enc=None):
|
||||||
|
"""Set the encoding of stdout and stderr
|
||||||
|
|
||||||
|
arguments:
|
||||||
|
enc -- Encoding name.
|
||||||
|
If omitted, locale.getpreferredencoding() is used.
|
||||||
|
"""
|
||||||
|
if enc is None:
|
||||||
|
enc = locale.getpreferredencoding()
|
||||||
|
|
||||||
|
def get_text_writer(fo, **kwargs):
|
||||||
|
kw = dict(kwargs)
|
||||||
|
kw.setdefault('errors', 'backslashreplace') # use \uXXXX style
|
||||||
|
kw.setdefault('closefd', False)
|
||||||
|
|
||||||
|
if sys.version_info[0] < 3:
|
||||||
|
# Work around for Python 2.x
|
||||||
|
# New line conversion isn't needed here. Done in somewhere else.
|
||||||
|
writer = io.open(fo.fileno(), mode='w', newline='', **kw)
|
||||||
|
write = writer.write # save the original write() function
|
||||||
|
enc = locale.getpreferredencoding()
|
||||||
|
def convwrite(s):
|
||||||
|
if isinstance(s, bytes):
|
||||||
|
write(s.decode(enc)) # convert to unistr
|
||||||
|
else:
|
||||||
|
write(s)
|
||||||
|
try:
|
||||||
|
writer.flush() # needed on Windows
|
||||||
|
except IOError:
|
||||||
|
pass
|
||||||
|
writer.write = convwrite
|
||||||
|
else:
|
||||||
|
writer = io.open(fo.fileno(), mode='w', **kw)
|
||||||
|
return writer
|
||||||
|
|
||||||
|
sys.stdout = get_text_writer(sys.stdout, encoding=enc)
|
||||||
|
sys.stderr = get_text_writer(sys.stderr, encoding=enc)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
enc = 'utf-8'
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
enc = sys.argv[1]
|
||||||
|
set_output_encoding(enc)
|
||||||
|
|
||||||
|
message_tbl = {
|
||||||
|
'utf-8': 'ÀÈÌÒÙ こんにちは 你好',
|
||||||
|
'latin1': 'ÀÈÌÒÙ',
|
||||||
|
'cp932': 'こんにちは',
|
||||||
|
'cp936': '你好',
|
||||||
|
}
|
||||||
|
|
||||||
|
print('Xfoobar.c(10) : %s (%s)' % (message_tbl[enc], enc))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
106
src/testdir/test_makeencoding.vim
Normal file
106
src/testdir/test_makeencoding.vim
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
" Tests for 'makeencoding'.
|
||||||
|
if !has('multi_byte')
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
source shared.vim
|
||||||
|
|
||||||
|
let s:python = PythonProg()
|
||||||
|
if s:python == ''
|
||||||
|
" Can't run this test.
|
||||||
|
finish
|
||||||
|
endif
|
||||||
|
|
||||||
|
let s:script = 'test_makeencoding.py'
|
||||||
|
|
||||||
|
let s:message_tbl = {
|
||||||
|
\ 'utf-8': 'ÀÈÌÒÙ こんにちは 你好',
|
||||||
|
\ 'latin1': 'ÀÈÌÒÙ',
|
||||||
|
\ 'cp932': 'こんにちは',
|
||||||
|
\ 'cp936': '你好',
|
||||||
|
\}
|
||||||
|
|
||||||
|
|
||||||
|
" Tests for :cgetfile and :lgetfile.
|
||||||
|
func Test_getfile()
|
||||||
|
set errorfile=Xerror.txt
|
||||||
|
set errorformat=%f(%l)\ :\ %m
|
||||||
|
|
||||||
|
" :cgetfile
|
||||||
|
for enc in keys(s:message_tbl)
|
||||||
|
let &makeencoding = enc
|
||||||
|
exec "silent !" . s:python . " " . s:script . " " . enc . " > " . &errorfile
|
||||||
|
cgetfile
|
||||||
|
copen
|
||||||
|
call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
|
||||||
|
\ getline('.'))
|
||||||
|
cclose
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" :lgetfile
|
||||||
|
for enc in keys(s:message_tbl)
|
||||||
|
let &makeencoding = enc
|
||||||
|
exec "silent !" . s:python . " " . s:script . " " . enc . " > " . &errorfile
|
||||||
|
lgetfile
|
||||||
|
lopen
|
||||||
|
call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
|
||||||
|
\ getline('.'))
|
||||||
|
lclose
|
||||||
|
endfor
|
||||||
|
|
||||||
|
call delete(&errorfile)
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
|
" Tests for :grep and :lgrep.
|
||||||
|
func Test_grep()
|
||||||
|
let &grepprg = s:python
|
||||||
|
set grepformat=%f(%l)\ :\ %m
|
||||||
|
|
||||||
|
" :grep
|
||||||
|
for enc in keys(s:message_tbl)
|
||||||
|
let &makeencoding = enc
|
||||||
|
exec "silent grep! " . s:script . " " . enc
|
||||||
|
copen
|
||||||
|
call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
|
||||||
|
\ getline('.'))
|
||||||
|
cclose
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" :lgrep
|
||||||
|
for enc in keys(s:message_tbl)
|
||||||
|
let &makeencoding = enc
|
||||||
|
exec "silent lgrep! " . s:script . " " . enc
|
||||||
|
lopen
|
||||||
|
call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
|
||||||
|
\ getline('.'))
|
||||||
|
lclose
|
||||||
|
endfor
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
|
" Tests for :make and :lmake.
|
||||||
|
func Test_make()
|
||||||
|
let &makeprg = s:python
|
||||||
|
set errorformat=%f(%l)\ :\ %m
|
||||||
|
|
||||||
|
" :make
|
||||||
|
for enc in keys(s:message_tbl)
|
||||||
|
let &makeencoding = enc
|
||||||
|
exec "silent make! " . s:script . " " . enc
|
||||||
|
copen
|
||||||
|
call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
|
||||||
|
\ getline('.'))
|
||||||
|
cclose
|
||||||
|
endfor
|
||||||
|
|
||||||
|
" :lmake
|
||||||
|
for enc in keys(s:message_tbl)
|
||||||
|
let &makeencoding = enc
|
||||||
|
exec "silent lmake! " . s:script . " " . enc
|
||||||
|
lopen
|
||||||
|
call assert_equal("Xfoobar.c|10| " . s:message_tbl[enc] . " (" . enc . ")",
|
||||||
|
\ getline('.'))
|
||||||
|
lclose
|
||||||
|
endfor
|
||||||
|
endfunc
|
@ -764,6 +764,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 */
|
||||||
|
/**/
|
||||||
|
420,
|
||||||
/**/
|
/**/
|
||||||
419,
|
419,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user