summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-06-12 12:39:41 +0200
committerBram Moolenaar <Bram@vim.org>2018-06-12 12:39:41 +0200
commit7580849df9d6c7c515f5ed784019336d8a8ec0f0 (patch)
tree4aaa9b9d357d62e62cd9c15ecc6dabc56556f5c9
parentf98b845dd185dfadfa7a622a42452bfa6809d4e0 (diff)
downloadvim-git-7580849df9d6c7c515f5ed784019336d8a8ec0f0.tar.gz
patch 8.1.0043: ++bad argument of :edit does not work properlyv8.1.0043
Problem: ++bad argument of :edit does not work properly. Solution: Return FAIL from get_bad_opt() only when there is no valid argument. (Dominique Pelle, Christian Brabandt, closes #2966, closes #2947)
-rw-r--r--src/ex_docmd.c4
-rw-r--r--src/testdir/test_plus_arg_edit.vim32
-rw-r--r--src/version.c2
3 files changed, 35 insertions, 3 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 342dec222..3bc86f5ac 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -5318,7 +5318,9 @@ get_bad_opt(char_u *p, exarg_T *eap)
eap->bad_char = BAD_DROP;
else if (MB_BYTE2LEN(*p) == 1 && p[1] == NUL)
eap->bad_char = *p;
- return FAIL;
+ else
+ return FAIL;
+ return OK;
}
#endif
diff --git a/src/testdir/test_plus_arg_edit.vim b/src/testdir/test_plus_arg_edit.vim
index 71dbea199..e91a6e467 100644
--- a/src/testdir/test_plus_arg_edit.vim
+++ b/src/testdir/test_plus_arg_edit.vim
@@ -1,10 +1,38 @@
" Tests for complicated + argument to :edit command
function Test_edit()
- call writefile(["foo|bar"], "Xfile1")
- call writefile(["foo/bar"], "Xfile2")
+ call writefile(["foo|bar"], "Xfile1")
+ call writefile(["foo/bar"], "Xfile2")
edit +1|s/|/PIPE/|w Xfile1| e Xfile2|1 | s/\//SLASH/|w
call assert_equal(["fooPIPEbar"], readfile("Xfile1"))
call assert_equal(["fooSLASHbar"], readfile("Xfile2"))
call delete('Xfile1')
call delete('Xfile2')
endfunction
+
+func Test_edit_bad()
+ if !has('multi_byte')
+ finish
+ endif
+
+ " Test loading a utf8 file with bad utf8 sequences.
+ call writefile(["[\xff][\xc0][\xe2\x89\xf0][\xc2\xc2]"], "Xfile")
+ new
+
+ " Without ++bad=..., the default behavior is like ++bad=?
+ e! ++enc=utf8 Xfile
+ call assert_equal('[?][?][???][??]', getline(1))
+
+ e! ++enc=utf8 ++bad=_ Xfile
+ call assert_equal('[_][_][___][__]', getline(1))
+
+ e! ++enc=utf8 ++bad=drop Xfile
+ call assert_equal('[][][][]', getline(1))
+
+ e! ++enc=utf8 ++bad=keep Xfile
+ call assert_equal("[\xff][\xc0][\xe2\x89\xf0][\xc2\xc2]", getline(1))
+
+ call assert_fails('e! ++enc=utf8 ++bad=foo Xfile', 'E474:')
+
+ bw!
+ call delete('Xfile')
+endfunc
diff --git a/src/version.c b/src/version.c
index 4ab241eb9..100506b0b 100644
--- a/src/version.c
+++ b/src/version.c
@@ -762,6 +762,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 43,
+/**/
42,
/**/
41,