changeset 15010:e3910b9827d0 v8.1.0516

patch 8.1.0516: :move command marks buffer modified when nothing changed commit https://github.com/vim/vim/commit/ddd1f9183bed00d096f29c503721ac559174a29f Author: Bram Moolenaar <Bram@vim.org> Date: Sat Nov 10 19:19:36 2018 +0100 patch 8.1.0516: :move command marks buffer modified when nothing changed Problem: :move command marks buffer modified when nothing changed. Solution: Do not set 'modified'. Add a test. (Jason Franklin)
author Bram Moolenaar <Bram@vim.org>
date Sat, 10 Nov 2018 19:30:05 +0100
parents 29667f9e57b5
children e82e977f5b8e
files src/Make_all.mak src/ex_cmds.c src/testdir/test_alot.vim src/testdir/test_move.vim src/version.c
diffstat 5 files changed, 62 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/Make_all.mak
+++ b/src/Make_all.mak
@@ -123,6 +123,7 @@ NEW_TESTS = \
 	test_mksession \
 	test_mksession_utf8 \
 	test_modeline \
+	test_move \
 	test_nested_function \
 	test_netbeans \
 	test_normal \
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -899,9 +899,9 @@ do_move(linenr_T line1, linenr_T line2, 
 {
     char_u	*str;
     linenr_T	l;
-    linenr_T	extra;	    /* Num lines added before line1 */
-    linenr_T	num_lines;  /* Num lines moved */
-    linenr_T	last_line;  /* Last line in file after adding new text */
+    linenr_T	extra;	    // Num lines added before line1
+    linenr_T	num_lines;  // Num lines moved
+    linenr_T	last_line;  // Last line in file after adding new text
 #ifdef FEAT_FOLDING
     win_T	*win;
     tabpage_T	*tp;
@@ -909,10 +909,24 @@ do_move(linenr_T line1, linenr_T line2, 
 
     if (dest >= line1 && dest < line2)
     {
-	EMSG(_("E134: Move lines into themselves"));
+	EMSG(_("E134: Cannot move a range of lines into itself"));
 	return FAIL;
     }
 
+    // Do nothing if we are not actually moving any lines.  This will prevent
+    // the 'modified' flag from being set without cause.
+    if (dest == line1 - 1 || dest == line2)
+    {
+	// Move the cursor as if lines were moved (see below) to be backwards
+	// compatible.
+	if (dest >= line1)
+	    curwin->w_cursor.lnum = dest;
+	else
+	    curwin->w_cursor.lnum = dest + (line2 - line1) + 1;
+
+	return OK;
+    }
+
     num_lines = line2 - line1 + 1;
 
     /*
--- a/src/testdir/test_alot.vim
+++ b/src/testdir/test_alot.vim
@@ -41,6 +41,7 @@ source test_match.vim
 source test_menu.vim
 source test_messages.vim
 source test_modeline.vim
+source test_move.vim
 source test_partial.vim
 source test_popup.vim
 source test_put.vim
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_move.vim
@@ -0,0 +1,40 @@
+" Test the ":move" command.
+
+func Test_move()
+  enew!
+  call append(0, ['line 1', 'line 2', 'line 3'])
+  g /^$/ delete _
+  set nomodified
+
+  move .
+  call assert_equal(['line 1', 'line 2', 'line 3'], getline(1, 3))
+  call assert_false(&modified)
+
+  1,2move 0
+  call assert_equal(['line 1', 'line 2', 'line 3'], getline(1, 3))
+  call assert_false(&modified)
+
+  1,3move 3
+  call assert_equal(['line 1', 'line 2', 'line 3'], getline(1, 3))
+  call assert_false(&modified)
+
+  1move 2
+  call assert_equal(['line 2', 'line 1', 'line 3'], getline(1, 3))
+  call assert_true(&modified)
+  set nomodified
+
+  3move 0
+  call assert_equal(['line 3', 'line 2', 'line 1'], getline(1, 3))
+  call assert_true(&modified)
+  set nomodified
+
+  2,3move 0
+  call assert_equal(['line 2', 'line 1', 'line 3'], getline(1, 3))
+  call assert_true(&modified)
+  set nomodified
+
+  call assert_fails('1,2move 1', 'E134')
+  call assert_fails('2,3move 2', 'E134')
+
+  %bwipeout!
+endfunc
--- a/src/version.c
+++ b/src/version.c
@@ -793,6 +793,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    516,
+/**/
     515,
 /**/
     514,