Skip to content

Commit

Permalink
merge: add folding for \item's
Browse files Browse the repository at this point in the history
refer: #1765
  • Loading branch information
lervag committed Aug 11, 2020
2 parents a8a0af0 + 65966da commit aae5262
Show file tree
Hide file tree
Showing 6 changed files with 102 additions and 1 deletion.
10 changes: 9 additions & 1 deletion autoload/vimtex/fold.vim
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ function! vimtex#fold#init_state(state) abort " {{{1
\ . '|^\s*\%'
\ . '|^\s*\]\s*%(\{|$)'
\ . '|^\s*}'
let a:state.fold_re_next = ''
for l:name in [
\ 'preamble',
\ 'cmd_single',
Expand All @@ -62,6 +63,7 @@ function! vimtex#fold#init_state(state) abort " {{{1
\ 'sections',
\ 'markers',
\ 'comments',
\ 'items',
\ 'envs',
\ 'env_options',
\]
Expand All @@ -71,6 +73,11 @@ function! vimtex#fold#init_state(state) abort " {{{1
if exists('l:type.re.fold_re')
let a:state.fold_re .= '|' . l:type.re.fold_re
endif
if exists('l:type.re.fold_re_next')
let a:state.fold_re_next .=
\ (empty(a:state.fold_re_next) ? '\v' : '|')
\ . l:type.re.fold_re_next
endif
endif
endfor
endfunction
Expand All @@ -86,14 +93,15 @@ endfunction
" }}}1
function! vimtex#fold#level(lnum) abort " {{{1
let l:line = getline(a:lnum)
let l:next = getline(a:lnum + 1)

" Never fold \begin|end{document}
if l:line =~# '^\s*\\\%(begin\|end\){document}'
return 0
endif

" Optimize: Filter out irrelevant lines
if l:line !~# b:vimtex.fold_re
if l:line !~# b:vimtex.fold_re && l:next !~# b:vimtex.fold_re_next
return '='
endif

Expand Down
62 changes: 62 additions & 0 deletions autoload/vimtex/fold/items.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
" vimtex - LaTeX plugin for Vim
"
" Maintainer: Karl Yngve Lervåg
" Email: [email protected]
"

function! vimtex#fold#items#new(config) abort " {{{1
return extend(deepcopy(s:folder), a:config).init()
endfunction

" }}}1


let s:folder = {
\ 'name' : 'items',
\ 're' : {},
\ 'state' : [],
\}
function! s:folder.init() dict abort " {{{1
let l:envs = '\{%(' . join(g:vimtex_indent_lists, '|') . ')}'

let self.re.env_start = '\v^\s*\\begin' . l:envs
let self.re.env_end = '\v^\s*\\end' . l:envs

let self.re.fold_re = '^\s*\\item>'
let self.re.fold_re_next = '^\s*\\%(item>|end' . l:envs . ')'

let self.re.start = '\v' . self.re.fold_re
let self.re.end = '\v' . self.re.fold_re_next

return self
endfunction

" }}}1
function! s:folder.level(line, lnum) dict abort " {{{1
let l:next = getline(a:lnum + 1)

if a:line =~# self.re.env_start
call add(self.state, {'folded': v:false})
elseif a:line =~# self.re.env_end
call remove(self.state, -1)
if get(self.state, -1, {'folded': v:false}).folded
\ && l:next =~# self.re.end
return 's2'
endif
elseif a:line =~# self.re.start
if l:next !~# self.re.end
let self.state[-1].folded = v:true
return 'a1'
endif
elseif self.state[-1].folded && l:next =~# self.re.end
let self.state[-1].folded = v:false
return 's1'
endif
endfunction

" }}}1
function! s:folder.text(line, level) abort dict " {{{1
return a:line
endfunction

" }}}1
1 change: 1 addition & 0 deletions autoload/vimtex/options.vim
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ function! vimtex#options#init() abort " {{{1
call s:init_option('vimtex_fold_types', {})
call s:init_option('vimtex_fold_types_defaults', {
\ 'preamble' : {},
\ 'items' : {},
\ 'comments' : { 'enabled' : 0 },
\ 'envs' : {
\ 'blacklist' : [],
Expand Down
5 changes: 5 additions & 0 deletions doc/vimtex.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1463,6 +1463,10 @@ OPTIONS *vimtex-options*
Here the `axis` environment must not be otherwise
folded through the <envs> fold type.

<items> `\item` blocks in itemize like environments. The
recognized environments are the same as specified by
|g:vimtex_indent_lists|.

<cmd_single> Fold long commands with a single argument. E.g.: >
\hypersetup{ ---> \hypersetup{...}
Expand Down Expand Up @@ -1510,6 +1514,7 @@ OPTIONS *vimtex-options*
let g:vimtex_fold_types = {}
let g:vimtex_fold_types_defaults = {
\ 'preamble' : {},
\ 'items' : {},
\ 'comments' : {'enabled' : 0},
\ 'envs' : {
\ 'blacklist' : [], !!! This is a list of strings
Expand Down
19 changes: 19 additions & 0 deletions test/tests/test-folding/main.tex
Original file line number Diff line number Diff line change
Expand Up @@ -169,4 +169,23 @@ \subsection{test 2.1}

\subsection{test 2.2}

\section{test 3}

\begin{itemize}
\item test of fold
folded here
\begin{enumerate}
\item new fold level heere
and here
\item new fold level heere
and here
\item new fold level heere
and here
\item and not here
\end{enumerate}
folded more here
\item test of fold
folded here
\end{itemize}

\end{document}
6 changes: 6 additions & 0 deletions test/tests/test-folding/test.vim
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,10 @@ silent VimtexReload
call vimtex#test#assert_equal('Testing markers ', foldtextresult(158))
call vimtex#test#assert_equal('% <<: this fold worked before issue #1515', foldtextresult(163))

call vimtex#test#assert_equal(3, foldlevel(176))
call vimtex#test#assert_equal(5, foldlevel(179))
call vimtex#test#assert_equal(4, foldlevel(184))
call vimtex#test#assert_equal(3, foldlevel(186))
call vimtex#test#assert_equal(1, foldlevel(190))

quit!

0 comments on commit aae5262

Please sign in to comment.