summaryrefslogtreecommitdiff
path: root/data/vim/patches/8.1.0767
diff options
context:
space:
mode:
Diffstat (limited to 'data/vim/patches/8.1.0767')
-rw-r--r--data/vim/patches/8.1.0767163
1 files changed, 163 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0767 b/data/vim/patches/8.1.0767
new file mode 100644
index 000000000..139ff36ed
--- /dev/null
+++ b/data/vim/patches/8.1.0767
@@ -0,0 +1,163 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 8.1.0767
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 8.1.0767
+Problem: When deleting lines at the bottom signs are misplaced.
+Solution: Properly update the line number of signs at the end of a buffer
+ after a delete/undo operation. (Yegappan Lakshmanan, closes #3798)
+Files: src/sign.c, src/testdir/test_signs.vim
+
+
+*** ../vim-8.1.0766/src/sign.c 2019-01-15 20:19:36.747904404 +0100
+--- src/sign.c 2019-01-17 17:34:20.468494506 +0100
+***************
+*** 660,677 ****
+ long amount_after)
+ {
+ signlist_T *sign; // a sign in a b_signlist
+
+ FOR_ALL_SIGNS_IN_BUF(curbuf, sign)
+ {
+ if (sign->lnum >= line1 && sign->lnum <= line2)
+ {
+! if (amount == MAXLNUM)
+! sign->lnum = line1;
+! else
+! sign->lnum += amount;
+ }
+ else if (sign->lnum > line2)
+! sign->lnum += amount_after;
+ }
+ }
+
+--- 660,687 ----
+ long amount_after)
+ {
+ signlist_T *sign; // a sign in a b_signlist
++ linenr_T new_lnum;
+
+ FOR_ALL_SIGNS_IN_BUF(curbuf, sign)
+ {
++ // Ignore changes to lines after the sign
++ if (sign->lnum < line1)
++ continue;
++ new_lnum = sign->lnum;
+ if (sign->lnum >= line1 && sign->lnum <= line2)
+ {
+! if (amount != MAXLNUM)
+! new_lnum += amount;
+ }
+ else if (sign->lnum > line2)
+! // Lines inserted or deleted before the sign
+! new_lnum += amount_after;
+!
+! // If the new sign line number is past the last line in the buffer,
+! // then don't adjust the line number. Otherwise, it will always be past
+! // the last line and will not be visible.
+! if (new_lnum <= curbuf->b_ml.ml_line_count)
+! sign->lnum = new_lnum;
+ }
+ }
+
+*** ../vim-8.1.0766/src/testdir/test_signs.vim 2019-01-11 13:42:31.680331155 +0100
+--- src/testdir/test_signs.vim 2019-01-17 17:34:20.472494477 +0100
+***************
+*** 1202,1214 ****
+ enew! | only!
+
+ sign define sign1 text=#> linehl=Comment
+! call setline(1, ['A', 'B', 'C', 'D'])
+ exe 'sign place 5 line=3 name=sign1 buffer=' . bufnr('')
+ let l = sign_getplaced(bufnr(''))
+ call assert_equal(3, l[0].signs[0].lnum)
+
+ " Add some lines before the sign and check the sign line number
+! call append(2, ['AA', 'AB', 'AC'])
+ let l = sign_getplaced(bufnr(''))
+ call assert_equal(6, l[0].signs[0].lnum)
+
+--- 1202,1214 ----
+ enew! | only!
+
+ sign define sign1 text=#> linehl=Comment
+! call setline(1, ['A', 'B', 'C', 'D', 'E'])
+ exe 'sign place 5 line=3 name=sign1 buffer=' . bufnr('')
+ let l = sign_getplaced(bufnr(''))
+ call assert_equal(3, l[0].signs[0].lnum)
+
+ " Add some lines before the sign and check the sign line number
+! call append(2, ['BA', 'BB', 'BC'])
+ let l = sign_getplaced(bufnr(''))
+ call assert_equal(6, l[0].signs[0].lnum)
+
+***************
+*** 1217,1222 ****
+--- 1217,1260 ----
+ let l = sign_getplaced(bufnr(''))
+ call assert_equal(4, l[0].signs[0].lnum)
+
++ " Insert some lines after the sign and check the sign line number
++ call append(5, ['DA', 'DB'])
++ let l = sign_getplaced(bufnr(''))
++ call assert_equal(4, l[0].signs[0].lnum)
++
++ " Delete some lines after the sign and check the sign line number
++ call deletebufline('', 6, 7)
++ let l = sign_getplaced(bufnr(''))
++ call assert_equal(4, l[0].signs[0].lnum)
++
++ " Break the undo. Otherwise the undo operation below will undo all the
++ " changes made by this function.
++ let &undolevels=&undolevels
++
++ " Delete the line with the sign
++ call deletebufline('', 4)
++ let l = sign_getplaced(bufnr(''))
++ call assert_equal(4, l[0].signs[0].lnum)
++
++ " Undo the delete operation
++ undo
++ let l = sign_getplaced(bufnr(''))
++ call assert_equal(5, l[0].signs[0].lnum)
++
++ " Break the undo
++ let &undolevels=&undolevels
++
++ " Delete few lines at the end of the buffer including the line with the sign
++ " Sign line number should not change (as it is placed outside of the buffer)
++ call deletebufline('', 3, 6)
++ let l = sign_getplaced(bufnr(''))
++ call assert_equal(5, l[0].signs[0].lnum)
++
++ " Undo the delete operation. Sign should be restored to the previous line
++ undo
++ let l = sign_getplaced(bufnr(''))
++ call assert_equal(5, l[0].signs[0].lnum)
++
+ sign unplace * group=*
+ sign undefine sign1
+ enew!
+*** ../vim-8.1.0766/src/version.c 2019-01-17 17:13:25.924984061 +0100
+--- src/version.c 2019-01-17 17:32:46.589140279 +0100
+***************
+*** 793,794 ****
+--- 793,796 ----
+ { /* Add new patch number below this line */
++ /**/
++ 767,
+ /**/
+
+--
+hundred-and-one symptoms of being an internet addict:
+240. You think Webster's Dictionary is a directory of WEB sites.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
+/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\ an exciting new programming language -- http://www.Zimbu.org ///
+ \\\ help me help AIDS victims -- http://ICCF-Holland.org ///