summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-11-10 19:19:36 +0100
committerBram Moolenaar <Bram@vim.org>2018-11-10 19:19:36 +0100
commitddd1f9183bed00d096f29c503721ac559174a29f (patch)
tree0ad97968954e7ff342475ebac38896b1694dba62
parentded5f1bed7ff2d138b3ee0f9610d17290b62692d (diff)
downloadvim-git-8.1.0516.tar.gz
patch 8.1.0516: :move command marks buffer modified when nothing changedv8.1.0516
Problem: :move command marks buffer modified when nothing changed. Solution: Do not set 'modified'. Add a test. (Jason Franklin)
-rw-r--r--src/Make_all.mak1
-rw-r--r--src/ex_cmds.c22
-rw-r--r--src/testdir/test_alot.vim1
-rw-r--r--src/testdir/test_move.vim40
-rw-r--r--src/version.c2
5 files changed, 62 insertions, 4 deletions
diff --git a/src/Make_all.mak b/src/Make_all.mak
index f5f0552b9..da3a62ca8 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 7512785c9..cb728d405 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 3a0c6e042..be665120b 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 000000000..d774c93db
--- /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 3d728548b..12b86883b 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,