diff options
-rw-r--r-- | src/Make_all.mak | 1 | ||||
-rw-r--r-- | src/ex_cmds.c | 22 | ||||
-rw-r--r-- | src/testdir/test_alot.vim | 1 | ||||
-rw-r--r-- | src/testdir/test_move.vim | 40 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 62 insertions, 4 deletions
diff --git a/src/Make_all.mak b/src/Make_all.mak index f5f0552b96..da3a62ca8b 100644 --- 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 \ diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 7512785c9b..cb728d4052 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -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; /* diff --git a/src/testdir/test_alot.vim b/src/testdir/test_alot.vim index 3a0c6e0422..be665120b3 100644 --- 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 diff --git a/src/testdir/test_move.vim b/src/testdir/test_move.vim new file mode 100644 index 0000000000..d774c93dbd --- /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 diff --git a/src/version.c b/src/version.c index 3d728548b2..12b86883b9 100644 --- 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, |