aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/lua/stdlib.c
diff options
context:
space:
mode:
authorJaehwang Jung <tomtomjhj@gmail.com>2023-12-04 11:37:45 +0900
committerLewis Russell <me@lewisr.dev>2023-12-06 11:00:05 +0000
commit040369e1e4b86c4655a6885b36ee89ad4f10ca16 (patch)
treea428438a88e35ac59e42f2c044a922460a4a4e0c /src/nvim/lua/stdlib.c
parentf22e9e10f9ad77d2cce7f52837c5724877505a08 (diff)
downloadrneovim-040369e1e4b86c4655a6885b36ee89ad4f10ca16.tar.gz
rneovim-040369e1e4b86c4655a6885b36ee89ad4f10ca16.tar.bz2
rneovim-040369e1e4b86c4655a6885b36ee89ad4f10ca16.zip
fix(treesitter): don't forcefully open folds
Problem: When `vim._foldupdate()` is invoked inside a scheduled callback, the cursor may have moved to a line with a closed fold, e.g., after `dd` on the line that is one line above a folded region. Then it opens the fold, which is unnecessary and distracting. Legacy foldexprs do not have this issue. Solution: Don't explicitly open folds on cursor. Note: This doesn't completely prevent spurious opening of folds. That is due to bugs in treesitter foldexpr algorithm, which should be addressed separately.
Diffstat (limited to 'src/nvim/lua/stdlib.c')
-rw-r--r--src/nvim/lua/stdlib.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/src/nvim/lua/stdlib.c b/src/nvim/lua/stdlib.c
index d7a7abe3c8..fc2fedeaa1 100644
--- a/src/nvim/lua/stdlib.c
+++ b/src/nvim/lua/stdlib.c
@@ -536,11 +536,14 @@ static int nlua_iconv(lua_State *lstate)
return 1;
}
-// Like 'zx' but don't call newFoldLevel()
+// Update foldlevels (e.g., by evaluating 'foldexpr') for all lines in the current window without
+// invoking other side effects. Unlike `zx`, it does not close manually opened folds and does not
+// open folds under the cursor.
static int nlua_foldupdate(lua_State *lstate)
{
curwin->w_foldinvalid = true; // recompute folds
- foldOpenCursor();
+ foldUpdate(curwin, 1, (linenr_T)MAXLNUM);
+ curwin->w_foldinvalid = false;
return 0;
}