aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Malcomson <hardenedapple@gmail.com>2017-02-28 15:19:45 +0000
committerJustin M. Keyes <justinkz@gmail.com>2017-03-02 00:18:00 +0100
commitb1731fe1b5d7a9b89acb6c2292b1e3e8f9f33544 (patch)
tree5a5afad73c682bb3972f83cea12c99e4b7a8125e
parent689e0daa95fc870e49f3eb2f23cd6a76c392ff7d (diff)
downloadrneovim-b1731fe1b5d7a9b89acb6c2292b1e3e8f9f33544.tar.gz
rneovim-b1731fe1b5d7a9b89acb6c2292b1e3e8f9f33544.tar.bz2
rneovim-b1731fe1b5d7a9b89acb6c2292b1e3e8f9f33544.zip
vim-patch:8.0.0388
Fix a problem when filtering manually folded lines When foldMarkAdjustRecurse() is called to adjust folds that start inside the range of lines that are being moved and end outside that range, it calculates `amount_after` for its recursive call incorrectly. The calculation assumes that folds inside the changed range are being deleted, but this is not always the case. This means nested folds that start after the changed range of lines are shifted an incorrect amount. We fix this by calculating the `amount_after` differently if the folds inside the changed range are not being deleted.
-rw-r--r--src/nvim/ex_docmd.c4
-rw-r--r--src/nvim/fold.c9
-rw-r--r--test/functional/normal/fold_spec.lua47
3 files changed, 55 insertions, 5 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c
index ff0df9e51c..87b6959101 100644
--- a/src/nvim/ex_docmd.c
+++ b/src/nvim/ex_docmd.c
@@ -3654,10 +3654,10 @@ static linenr_T get_address(exarg_T *eap,
n = 1;
else
n = getdigits(&cmd);
- if (addr_type == ADDR_LOADED_BUFFERS || addr_type == ADDR_BUFFERS)
+ if (addr_type == ADDR_LOADED_BUFFERS || addr_type == ADDR_BUFFERS) {
lnum = compute_buffer_local_count(
addr_type, lnum, (i == '-') ? -1 * n : n);
- else {
+ } else {
// Relative line addressing, need to adjust for folded lines
// now, but only do it after the first address.
if (addr_type == ADDR_LINES && (i == '-' || i == '+')
diff --git a/src/nvim/fold.c b/src/nvim/fold.c
index d964da371a..1423463800 100644
--- a/src/nvim/fold.c
+++ b/src/nvim/fold.c
@@ -1438,13 +1438,16 @@ static void foldMarkAdjustRecurse(garray_T *gap, linenr_T line1, linenr_T line2,
} else {
/* 5. fold is below line1 and contains line2; need to
* correct nested folds too */
- foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
- line2 - fp->fd_top, amount,
- amount_after + (fp->fd_top - top));
if (amount == MAXLNUM) {
+ foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
+ line2 - fp->fd_top, amount,
+ amount_after + (fp->fd_top - top));
fp->fd_len -= line2 - fp->fd_top + 1;
fp->fd_top = line1;
} else {
+ foldMarkAdjustRecurse(&fp->fd_nested, line1 - fp->fd_top,
+ line2 - fp->fd_top, amount,
+ amount_after - amount);
fp->fd_len += amount_after - amount;
fp->fd_top += amount;
}
diff --git a/test/functional/normal/fold_spec.lua b/test/functional/normal/fold_spec.lua
new file mode 100644
index 0000000000..a2a2a35a8b
--- /dev/null
+++ b/test/functional/normal/fold_spec.lua
@@ -0,0 +1,47 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local insert = helpers.insert
+local feed = helpers.feed
+local expect = helpers.expect
+local execute = helpers.execute
+
+describe('Folds', function()
+ clear()
+ it('manual folding adjusts with filter', function()
+ insert([[
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ 10
+ 11
+ 12
+ 13
+ 14
+ 15
+ 16
+ 17
+ 18
+ 19
+ 20]])
+ execute('4,$fold', '%foldopen', '10,$fold', '%foldopen')
+ execute('1,8! cat')
+ feed('5ggzdzMGdd')
+ expect([[
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9]])
+ end)
+end)