summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2013-07-24 15:02:03 +0200
committerBram Moolenaar <Bram@vim.org>2013-07-24 15:02:03 +0200
commitad875fb7fff85d313fa35acde1afaec998d347d7 (patch)
tree384af81a849113f3c2fcc5c4abd66c126f4cc3e8
parente24a9c0b592a11743475166c873a5c346c65f73d (diff)
downloadvim-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.c10
-rw-r--r--src/fileio.c78
-rw-r--r--src/proto/fileio.pro2
-rw-r--r--src/testdir/test91.in12
-rw-r--r--src/testdir/test91.ok3
-rw-r--r--src/version.c2
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,