]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.1.0516: :move command marks buffer modified when nothing changed v8.1.0516
authorBram Moolenaar <Bram@vim.org>
Sat, 10 Nov 2018 18:19:36 +0000 (19:19 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 10 Nov 2018 18:19:36 +0000 (19:19 +0100)
Problem:    :move command marks buffer modified when nothing changed.
Solution:   Do not set 'modified'.  Add a test. (Jason Franklin)

src/Make_all.mak
src/ex_cmds.c
src/testdir/test_alot.vim
src/testdir/test_move.vim [new file with mode: 0644]
src/version.c

index f5f0552b96a7f601301c3a6247ffa1c078b28dba..da3a62ca8baed634a3ea6ee4f1b807845b67e743 100644 (file)
@@ -123,6 +123,7 @@ NEW_TESTS = \
        test_mksession \
        test_mksession_utf8 \
        test_modeline \
+       test_move \
        test_nested_function \
        test_netbeans \
        test_normal \
index 7512785c9b5cc361aba76c77bc8a4422c7e83d39..cb728d4052f0a9ea307731212214750b7bcf45ad 100644 (file)
@@ -899,9 +899,9 @@ do_move(linenr_T line1, linenr_T line2, linenr_T dest)
 {
     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, linenr_T dest)
 
     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;
 
     /*
index 3a0c6e042244c4b5752bd1af3623838b6d3b202d..be665120b356fb92cbfa9ec3ff1711a65dd7fd73 100644 (file)
@@ -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
diff --git a/src/testdir/test_move.vim b/src/testdir/test_move.vim
new file mode 100644 (file)
index 0000000..d774c93
--- /dev/null
@@ -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
index 3d728548b21dd8b4fc40005a7c1c222b34017776..12b86883b923e5b47259575c2e01375505405e6c 100644 (file)
@@ -792,6 +792,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    516,
 /**/
     515,
 /**/