From acc5fd9fac60de4494925be23f873cf98aaa61b0 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Sun, 16 Feb 2020 09:04:30 -0500 Subject: vim-patch:8.1.0043: ++bad argument of :edit does not work properly 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 vim/vim#2966, closes vim/vim#2947) https://github.com/vim/vim/commit/7580849df9d6c7c515f5ed784019336d8a8ec0f0 --- src/nvim/ex_docmd.c | 4 +++- src/nvim/testdir/test_plus_arg_edit.vim | 28 ++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index ead0922c5a..28ecaf684a 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -4547,8 +4547,10 @@ int get_bad_opt(const char_u *p, exarg_T *eap) eap->bad_char = BAD_DROP; } else if (MB_BYTE2LEN(*p) == 1 && p[1] == NUL) { eap->bad_char = *p; + } else { + return FAIL; } - return FAIL; + return OK; } /* diff --git a/src/nvim/testdir/test_plus_arg_edit.vim b/src/nvim/testdir/test_plus_arg_edit.vim index f6d31e7626..e91a6e467a 100644 --- a/src/nvim/testdir/test_plus_arg_edit.vim +++ b/src/nvim/testdir/test_plus_arg_edit.vim @@ -8,3 +8,31 @@ function Test_edit() 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 -- cgit