Merge pull request #64 from vigoux/feature/folding

Treesitter based code folding.
This commit is contained in:
Kiyan Yazdani 2020-05-25 11:31:24 +02:00 committed by GitHub
commit c35d8ac4d5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 47 additions and 1 deletions

View file

@ -124,7 +124,7 @@ The goal of `nvim-treesitter` is both to provide a simple and easy way to use th
but also to add some functionalities to it:
Some of these features are :
- [x] Incremental selection
- [ ] Syntax based code folding
- [x] Syntax based code folding (`set foldmethod=expr foldexpr=nvim_treesitter#foldexr()`)
- [x] Consistent syntax highlighting (the api is not quite stable yet)
- [x] Statusline indicator (`require'nvim-treesitter'.statusline(size)`)

View file

@ -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

View file

@ -165,4 +165,16 @@ could be used as a statusline indicator.
Note: The `size` argument is optionnal. When specified, the string will not be
longer than `size`.
|nvim_treesitter#foldexpr()|
*nvim_treesitter#foldexpr()*
Functions to be used to determine the fold level at a given line number.
To use it: >
set foldmethod=expr
set foldexpr=nvim_treesitter#foldexr()
<
Note: This is highly experimental, and folding can break on some types of
edits. If you encounter such breakage, hiting `zx` should fix folding.
In any case, feel free to open an issue with the reproducing steps.
vim:tw=78:ts=8:noet:ft=help:norl:

View file

@ -11,6 +11,7 @@ nvim-treesitter-commands nvim-treesitter.txt /*nvim-treesitter-commands*
nvim-treesitter-functions nvim-treesitter.txt /*nvim-treesitter-functions*
nvim-treesitter-intro nvim-treesitter.txt /*nvim-treesitter-intro*
nvim-treesitter-quickstart nvim-treesitter.txt /*nvim-treesitter-quickstart*
nvim_treesitter#foldexpr() nvim-treesitter.txt /*nvim_treesitter#foldexpr()*
nvim_treesitter#statusline() nvim-treesitter.txt /*nvim_treesitter#statusline()*
ts_api.containing_scope nvim-treesitter.txt /*ts_api.containing_scope*
ts_api.get_named_children nvim-treesitter.txt /*ts_api.get_named_children*

View file

@ -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