# HG changeset patch # User Bram Moolenaar # Date 1374670923 -7200 # Node ID 74d2f3188cd0aaa0d3d7cd3df001d88b04f77f5c # Parent a25b52f7f08e28ec456a018751e7057f7e2523db updated for version 7.4a.041 Problem: When using ":new ++ff=unix" and "dos" is first in 'fileformats' then 'ff' is set to "dos" instead of "unix". (Ingo Karkat) Solution: Create set_file_options() and invoke it from do_ecmd(). diff --git a/src/ex_cmds.c b/src/ex_cmds.c --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3448,9 +3448,13 @@ do_ecmd(fnum, ffname, sfname, eap, newln curwin->w_buffer = buf; curbuf = buf; ++curbuf->b_nwindows; - /* set 'fileformat' */ - if (*p_ffs && !oldbuf) - set_fileformat(default_fileformat(), OPT_LOCAL); + + /* Set 'fileformat', 'binary' and 'fenc' when forced. */ + if (!oldbuf && eap != NULL) + { + set_file_options(TRUE, eap); + set_forced_fenc(eap); + } } /* May get the window options from the last time this buffer diff --git a/src/fileio.c b/src/fileio.c --- a/src/fileio.c +++ b/src/fileio.c @@ -474,23 +474,8 @@ readfile(fname, sfname, from, lines_to_s } #endif - /* set default 'fileformat' */ - if (set_options) - { - if (eap != NULL && eap->force_ff != 0) - set_fileformat(get_fileformat_force(curbuf, eap), OPT_LOCAL); - else if (*p_ffs != NUL) - set_fileformat(default_fileformat(), OPT_LOCAL); - } - - /* set or reset 'binary' */ - if (eap != NULL && eap->force_bin != 0) - { - int oldval = curbuf->b_p_bin; - - curbuf->b_p_bin = (eap->force_bin == FORCE_BIN); - set_options_bin(oldval, curbuf->b_p_bin, OPT_LOCAL); - } + /* Set default or forced 'fileformat' and 'binary'. */ + set_file_options(set_options, eap); /* * When opening a new file we take the readonly flag from the file. @@ -647,15 +632,9 @@ readfile(fname, sfname, from, lines_to_s check_marks_read(); #endif #ifdef FEAT_MBYTE - if (eap != NULL && eap->force_enc != 0) - { - /* set forced 'fileencoding' */ - fenc = enc_canonize(eap->cmd + eap->force_enc); - if (fenc != NULL) - set_string_option_direct((char_u *)"fenc", -1, - fenc, OPT_FREE|OPT_LOCAL, 0); - vim_free(fenc); - } + /* Set forced 'fileencoding'. */ + if (eap != NULL) + set_forced_fenc(eap); #endif #ifdef FEAT_AUTOCMD apply_autocmds_exarg(EVENT_BUFNEWFILE, sfname, sfname, @@ -2738,7 +2717,52 @@ prep_exarg(eap, buf) return OK; } -#ifdef FEAT_MBYTE +/* + * Set default or forced 'fileformat' and 'binary'. + */ + void +set_file_options(set_options, eap) + int set_options; + exarg_T *eap; +{ + /* set default 'fileformat' */ + if (set_options) + { + if (eap != NULL && eap->force_ff != 0) + set_fileformat(get_fileformat_force(curbuf, eap), OPT_LOCAL); + else if (*p_ffs != NUL) + set_fileformat(default_fileformat(), OPT_LOCAL); + } + + /* set or reset 'binary' */ + if (eap != NULL && eap->force_bin != 0) + { + int oldval = curbuf->b_p_bin; + + curbuf->b_p_bin = (eap->force_bin == FORCE_BIN); + set_options_bin(oldval, curbuf->b_p_bin, OPT_LOCAL); + } +} + +#if defined(FEAT_MBYTE) || defined(PROTO) +/* + * Set forced 'fileencoding'. + */ + void +set_forced_fenc(eap) + exarg_T *eap; +{ + if (eap->force_enc != 0) + { + char_u *fenc = enc_canonize(eap->cmd + eap->force_enc); + + if (fenc != NULL) + set_string_option_direct((char_u *)"fenc", -1, + fenc, OPT_FREE|OPT_LOCAL, 0); + vim_free(fenc); + } +} + /* * Find next fileencoding to use from 'fileencodings'. * "pp" points to fenc_next. It's advanced to the next item. diff --git a/src/proto/fileio.pro b/src/proto/fileio.pro --- a/src/proto/fileio.pro +++ b/src/proto/fileio.pro @@ -2,6 +2,8 @@ void filemess __ARGS((buf_T *buf, char_u *name, char_u *s, int attr)); int readfile __ARGS((char_u *fname, char_u *sfname, linenr_T from, linenr_T lines_to_skip, linenr_T lines_to_read, exarg_T *eap, int flags)); int prep_exarg __ARGS((exarg_T *eap, buf_T *buf)); +void set_file_options __ARGS((int set_options, exarg_T *eap)); +void set_forced_fenc __ARGS((exarg_T *eap)); int prepare_crypt_read __ARGS((FILE *fp)); char_u *prepare_crypt_write __ARGS((buf_T *buf, int *lenp)); int check_file_readonly __ARGS((char_u *fname, int perm)); diff --git a/src/testdir/test91.in b/src/testdir/test91.in --- a/src/testdir/test91.in +++ b/src/testdir/test91.in @@ -3,6 +3,7 @@ vim: set ft=vim : STARTTEST :so small.vim +:so mbyte.vim :" :" Test for getbufvar() :" Use strings to test for memory leaks. @@ -22,6 +23,17 @@ STARTTEST :$put =string(getbufvar(1, '&autoindent')) :$put =string(getbufvar(1, '&autoindent', 1)) :" +:" Open new window with forced option values +:set fileformats=unix,dos +:new ++ff=dos ++bin ++enc=iso-8859-2 +:let otherff = getbufvar(bufnr('%'), '&fileformat') +:let otherbin = getbufvar(bufnr('%'), '&bin') +:let otherfenc = getbufvar(bufnr('%'), '&fenc') +:close +:$put =otherff +:$put =string(otherbin) +:$put =otherfenc +:unlet otherff otherbin otherfenc :" test for getwinvar() :let w:var_str = "Dance" :let def_str = "Chance" diff --git a/src/testdir/test91.ok b/src/testdir/test91.ok --- a/src/testdir/test91.ok +++ b/src/testdir/test91.ok @@ -10,6 +10,9 @@ start: '5678' 0 0 +dos +1 +iso-8859-2 'Dance' 'Dance' {'var_str': 'Dance'} diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -728,6 +728,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 41, +/**/ 40, /**/ 39,