diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-07-24 15:02:03 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-07-24 15:02:03 +0200 |
commit | ad875fb7fff85d313fa35acde1afaec998d347d7 (patch) | |
tree | 384af81a849113f3c2fcc5c4abd66c126f4cc3e8 | |
parent | e24a9c0b592a11743475166c873a5c346c65f73d (diff) | |
download | vim-ad875fb7fff85d313fa35acde1afaec998d347d7.zip |
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().
-rw-r--r-- | src/ex_cmds.c | 10 | ||||
-rw-r--r-- | src/fileio.c | 78 | ||||
-rw-r--r-- | src/proto/fileio.pro | 2 | ||||
-rw-r--r-- | src/testdir/test91.in | 12 | ||||
-rw-r--r-- | src/testdir/test91.ok | 3 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 77 insertions, 30 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 445b66fee..c08bb21cb 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3448,9 +3448,13 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin) 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 index 71ecf42ae..fe90246fd 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -474,23 +474,8 @@ readfile(fname, sfname, from, lines_to_skip, lines_to_read, eap, flags) } #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_skip, lines_to_read, eap, flags) 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 index b24b95895..7aa99cfa8 100644 --- 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 index 0143c1880..e900a522d 100644 --- 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 index 6227ec7d3..22e157220 100644 --- 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 index f35c8b904..e435c1bdb 100644 --- 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, |