aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Vigouroux <tomvig38@gmail.com>2020-05-25 10:26:29 +0200
committerThomas Vigouroux <tomvig38@gmail.com>2020-05-25 11:19:38 +0200
commitfbade728fed18a084bc5601a62628d3dec0c631c (patch)
treef2728814efaacf1d746e2aa571c850f9d9faad77
parentMerge pull request #62 from theHamsta/c-locals (diff)
downloadnvim-treesitter-fbade728fed18a084bc5601a62628d3dec0c631c.tar
nvim-treesitter-fbade728fed18a084bc5601a62628d3dec0c631c.tar.gz
nvim-treesitter-fbade728fed18a084bc5601a62628d3dec0c631c.tar.bz2
nvim-treesitter-fbade728fed18a084bc5601a62628d3dec0c631c.tar.lz
nvim-treesitter-fbade728fed18a084bc5601a62628d3dec0c631c.tar.xz
nvim-treesitter-fbade728fed18a084bc5601a62628d3dec0c631c.tar.zst
nvim-treesitter-fbade728fed18a084bc5601a62628d3dec0c631c.zip
feat: add syntax-based folding
-rw-r--r--autoload/nvim_treesitter.vim4
-rw-r--r--lua/nvim-treesitter/fold.lua29
2 files changed, 33 insertions, 0 deletions
diff --git a/autoload/nvim_treesitter.vim b/autoload/nvim_treesitter.vim
index 715befe0f..65986a8bb 100644
--- a/autoload/nvim_treesitter.vim
+++ b/autoload/nvim_treesitter.vim
@@ -1,3 +1,7 @@
function! nvim_treesitter#statusline(len)
return luaeval("require'nvim-treesitter'.statusline(_A)", a:len)
endfunction
+
+function! nvim_treesitter#foldexpr()
+ return luaeval(printf('require"nvim-treesitter.fold".get_fold_indic(%d)', v:lnum))
+endfunction
diff --git a/lua/nvim-treesitter/fold.lua b/lua/nvim-treesitter/fold.lua
new file mode 100644
index 000000000..6a39461a7
--- /dev/null
+++ b/lua/nvim-treesitter/fold.lua
@@ -0,0 +1,29 @@
+local api = vim.api
+local parsers = require'nvim-treesitter.parsers'
+
+local M = {}
+
+function M.get_fold_indic(lnum)
+ if not parsers.has_parser() or not lnum then return '0' end
+
+ local function smallest_multiline_containing(node, level)
+ for index = 0,(node:named_child_count() -1) do
+ local child = node:named_child(index)
+ local start, _, stop, _ = child:range()
+
+ if start ~= stop and start <= (lnum -1) and stop >= (lnum -1) then
+ return smallest_multiline_containing(child, level + 1)
+ end
+ end
+
+ return node, level
+ end
+
+ local parser = parsers.get_parser()
+
+ local multiline_here, level = smallest_multiline_containing(parser:parse():root(), 0)
+
+ return tostring(level)
+end
+
+return M