changeset 18114:90b0af9ba4ff v8.1.2052

patch 8.1.2052: using "x" before a closed fold may delete that fold Commit: https://github.com/vim/vim/commit/7a9bd7c1e0ce1baf5a02daf36eeae3638aa315c7 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Sep 17 22:42:55 2019 +0200 patch 8.1.2052: using "x" before a closed fold may delete that fold Problem: Using "x" before a closed fold may delete that fold. Solution: Do not translate 'x' do "dl". (Christian Brabandt, closes https://github.com/vim/vim/issues/4927)
author Bram Moolenaar <Bram@vim.org>
date Tue, 17 Sep 2019 22:45:05 +0200
parents d145b3865e23
children bd18e9db370e
files src/normal.c src/testdir/test_fold.vim src/version.c
diffstat 3 files changed, 23 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/normal.c
+++ b/src/normal.c
@@ -7381,8 +7381,8 @@ nv_optrans(cmdarg_T *cap)
 
     if (!checkclearopq(cap->oap))
     {
-	/* In Vi "2D" doesn't delete the next line.  Can't translate it
-	 * either, because "2." should also not use the count. */
+	// In Vi "2D" doesn't delete the next line.  Can't translate it
+	// either, because "2." should also not use the count.
 	if (cap->cmdchar == 'D' && vim_strchr(p_cpo, CPO_HASH) != NULL)
 	{
 	    cap->oap->start = curwin->w_cursor;
@@ -7400,7 +7400,13 @@ nv_optrans(cmdarg_T *cap)
 	{
 	    if (cap->count0)
 		stuffnumReadbuff(cap->count0);
-	    stuffReadbuff(ar[(int)(vim_strchr(str, cap->cmdchar) - str)]);
+	    // If on an empty line and using 'x' and "l" is included in the
+	    // whichwrap option, do not delete the next line.
+	    if (cap->cmdchar == 'x' && vim_strchr(p_ww, 'l') != NULL
+						      && gchar_cursor() == NUL)
+		stuffReadbuff((char_u *)"dd");
+	    else
+		stuffReadbuff(ar[(int)(vim_strchr(str, cap->cmdchar) - str)]);
 	}
     }
     cap->opcount = 0;
--- a/src/testdir/test_fold.vim
+++ b/src/testdir/test_fold.vim
@@ -757,3 +757,15 @@ func Test_fold_delete_with_marker()
   bwipe!
   bwipe!
 endfunc
+
+func Test_fold_delete_with_marker_and_whichwrap()
+  new
+  let content1 = ['']
+  let content2 = ['folded line 1 "{{{1', '  test', '  test2', '  test3', '', 'folded line 2 "{{{1', '  test', '  test2', '  test3']
+  call setline(1, content1 + content2)
+  set fdm=marker ww+=l
+  normal! x
+  call assert_equal(content2, getline(1, '$'))
+  set fdm& ww&
+  bwipe!
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2052,
+/**/
     2051,
 /**/
     2050,