# HG changeset patch # User Bram Moolenaar # Date 1623609003 -7200 # Node ID 02fa8d72e4e3442e058a499d8251f01873ad2f50 # Parent fd37be6dc258c7eb9f7583ca63af5fe65457e3e0 patch 8.2.2993: 'fileencodings' default value should depend on 'encoding' Commit: https://github.com/vim/vim/commit/5ffefbb35aba2448099314a9e09714d2f3b2b1bd Author: Bram Moolenaar Date: Sun Jun 13 20:27:36 2021 +0200 patch 8.2.2993: 'fileencodings' default value should depend on 'encoding' Problem: 'fileencodings' default value should depend on 'encoding'. (Gary Johnson) Solution: When 'encoding' is "utf-8" use a different default value for 'fileencodings'. diff --git a/src/mbyte.c b/src/mbyte.c --- a/src/mbyte.c +++ b/src/mbyte.c @@ -733,8 +733,7 @@ codepage_invalid: // When using Unicode, set default for 'fileencodings'. if (enc_utf8 && !option_was_set((char_u *)"fencs")) - set_string_option_direct((char_u *)"fencs", -1, - (char_u *)"ucs-bom,utf-8,default,latin1", OPT_FREE, 0); + set_fencs_unicode(); #if defined(HAVE_BIND_TEXTDOMAIN_CODESET) && defined(FEAT_GETTEXT) // GNU gettext 0.10.37 supports this feature: set the codeset used for diff --git a/src/option.c b/src/option.c --- a/src/option.c +++ b/src/option.c @@ -535,6 +535,19 @@ set_init_1(int clean_arg) #endif } +static char_u *fencs_utf8_default = (char_u *)"ucs-bom,utf-8,default,latin1"; + +/* + * Set the "fileencodings" option to the default value for when 'encoding' is + * utf-8. + */ + void +set_fencs_unicode() +{ + set_string_option_direct((char_u *)"fencs", -1, fencs_utf8_default, + OPT_FREE, 0); +} + /* * Set an option to its default value. * This does not take care of side effects! @@ -558,9 +571,12 @@ set_option_default( dvi = ((flags & P_VI_DEF) || compatible) ? VI_DEFAULT : VIM_DEFAULT; if (flags & P_STRING) { + // 'fencs' default value depends on 'encoding' + if (options[opt_idx].var == (char_u *)&p_fencs && enc_utf8) + set_fencs_unicode(); // Use set_string_option_direct() for local options to handle // freeing and allocating the value. - if (options[opt_idx].indir != PV_NONE) + else if (options[opt_idx].indir != PV_NONE) set_string_option_direct(NULL, opt_idx, options[opt_idx].def_val[dvi], opt_flags, 0); else @@ -1684,6 +1700,8 @@ do_set( #endif newval = term_bg_default(); } + else if ((char_u **)varp == &p_fencs && enc_utf8) + newval = fencs_utf8_default; // expand environment variables and ~ (since the // default value was already expanded, only diff --git a/src/proto/option.pro b/src/proto/option.pro --- a/src/proto/option.pro +++ b/src/proto/option.pro @@ -1,5 +1,6 @@ /* option.c */ void set_init_1(int clean_arg); +void set_fencs_unicode(void); void set_string_default(char *name, char_u *val); void set_number_default(char *name, long val); void set_local_options_default(win_T *wp, int do_buffer); diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim --- a/src/testdir/test_options.vim +++ b/src/testdir/test_options.vim @@ -1140,6 +1140,14 @@ func Test_opt_default() call assert_equal('vt', &formatoptions) set formatoptions&vim call assert_equal('tcq', &formatoptions) + + call assert_equal('ucs-bom,utf-8,default,latin1', &fencs) + set fencs=latin1 + set fencs& + call assert_equal('ucs-bom,utf-8,default,latin1', &fencs) + set fencs=latin1 + set all& + call assert_equal('ucs-bom,utf-8,default,latin1', &fencs) endfunc " Test for the 'cmdheight' option diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2993, +/**/ 2992, /**/ 2991,