Fixed #592: Better handling of delimiter indentation
This commit is contained in:
parent
1d126b98b9
commit
4249328a06
@ -213,19 +213,9 @@ endfunction
|
|||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
|
|
||||||
function! vimtex#delim#get_valid_regexps(...) " {{{1
|
function! vimtex#delim#get_delim_regexes(...) " {{{1
|
||||||
"
|
return [s:re.delim_math.open, s:re.delim_math.close,
|
||||||
" Arguments: (Optional)
|
\ s:re.delim_tex.open, s:re.delim_tex.close]
|
||||||
" line number
|
|
||||||
" column number
|
|
||||||
"
|
|
||||||
" Returns:
|
|
||||||
" [regexp_open_delims, regexp_close_delims]
|
|
||||||
"
|
|
||||||
|
|
||||||
return call('vimtex#util#in_mathzone', a:000)
|
|
||||||
\ ? [s:re.delim_math.open, s:re.delim_math.close]
|
|
||||||
\ : [s:re.delim_tex.open, s:re.delim_tex.close]
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
|
@ -46,11 +46,11 @@ function! VimtexIndent(lnum) " {{{1
|
|||||||
|
|
||||||
let l:nprev = s:get_prev_line(l:nprev, 'ignore-ampersands')
|
let l:nprev = s:get_prev_line(l:nprev, 'ignore-ampersands')
|
||||||
if l:nprev == 0 | return 0 | endif
|
if l:nprev == 0 | return 0 | endif
|
||||||
let l:prev = getline(l:nprev)
|
let l:prev = substitute(getline(l:nprev), '\\\@<!%.*', '', '')
|
||||||
|
|
||||||
let l:ind = indent(l:nprev)
|
let l:ind = indent(l:nprev)
|
||||||
let l:ind += s:indent_envs(l:cur, l:prev)
|
let l:ind += s:indent_envs(l:cur, l:prev)
|
||||||
let l:ind += s:indent_delims(l:cur, l:prev, a:lnum)
|
let l:ind += s:indent_delims(l:cur, a:lnum, l:prev, l:nprev)
|
||||||
let l:ind += s:indent_tikz(l:nprev, l:prev)
|
let l:ind += s:indent_tikz(l:nprev, l:prev)
|
||||||
return l:ind
|
return l:ind
|
||||||
endfunction
|
endfunction
|
||||||
@ -104,12 +104,79 @@ let s:envs_begitem = s:envs_item . '\|' . s:envs_beglist
|
|||||||
let s:envs_enditem = s:envs_item . '\|' . s:envs_endlist
|
let s:envs_enditem = s:envs_item . '\|' . s:envs_endlist
|
||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
function! s:indent_delims(cur, prev, lnum) " {{{1
|
function! s:indent_delims(cur, ncur, prev, nprev) " {{{1
|
||||||
let [l:open, l:close] = vimtex#delim#get_valid_regexps(a:lnum, col('.'))
|
let [l:n1, l:dummy, l:m1] = s:split(a:prev, a:nprev)
|
||||||
return &sw*( max([s:count(a:prev, l:open) - s:count(a:prev, l:close), 0])
|
let [l:n2, l:m2, l:dummy] = s:split(a:cur, a:ncur)
|
||||||
\ - max([s:count(a:cur, l:close) - s:count(a:cur, l:open), 0]))
|
|
||||||
|
return &sw*( max([s:count(l:n1, s:to) + s:count(l:m1, s:mo)
|
||||||
|
\ - s:count(l:n1, s:tc) - s:count(l:m1, s:mc), 0])
|
||||||
|
\ - max([s:count(l:n2, s:tc) + s:count(l:m2, s:mc)
|
||||||
|
\ - s:count(l:n2, s:to) - s:count(l:m2, s:mo), 0]))
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
let [s:mo, s:mc, s:to, s:tc] = vimtex#delim#get_delim_regexes()
|
||||||
|
|
||||||
|
function! s:count(line, pattern) " {{{2
|
||||||
|
let sum = 0
|
||||||
|
let indx = match(a:line, a:pattern)
|
||||||
|
while indx >= 0
|
||||||
|
let sum += 1
|
||||||
|
let match = matchstr(a:line, a:pattern, indx)
|
||||||
|
let indx += len(match)
|
||||||
|
let indx = match(a:line, a:pattern, indx)
|
||||||
|
endwhile
|
||||||
|
return sum
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" }}}2
|
||||||
|
function! s:split(line, lnum) " {{{2
|
||||||
|
let l:map = map(range(1,col([a:lnum, strlen(a:line)])),
|
||||||
|
\ '[v:val, vimtex#util#in_mathzone(a:lnum, v:val)]')
|
||||||
|
|
||||||
|
" Adjust math mode limits (currently handle only $'s)
|
||||||
|
let l:prev = 1
|
||||||
|
for l:i in range(len(l:map))
|
||||||
|
if l:map[l:i][1] == 1 && l:prev == 0
|
||||||
|
let l:prev = l:map[l:i][1]
|
||||||
|
let l:map[l:i][1] = 0
|
||||||
|
else
|
||||||
|
let l:prev = l:map[l:i][1]
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
if l:map[0][1] == 1 && a:line[0] ==# '$'
|
||||||
|
let l:map[0][1] = 0
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Extract normal text
|
||||||
|
let l:normal = ''
|
||||||
|
for [l:i, l:val] in l:map
|
||||||
|
if l:val == 0
|
||||||
|
let l:normal .= a:line[l:i - 1]
|
||||||
|
endif
|
||||||
|
endfor
|
||||||
|
let l:normal = substitute(l:normal, '\\verb\(.\).\{}\1', '', 'g')
|
||||||
|
|
||||||
|
" Extract math text from beginning of line
|
||||||
|
let l:math_pre = ''
|
||||||
|
let l:indx = 0
|
||||||
|
while l:map[l:indx][1] == 1
|
||||||
|
let l:math_pre .= a:line[l:map[l:indx][0] - 1]
|
||||||
|
let l:indx += 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
" Extract math text from end of line
|
||||||
|
let l:math_end = ''
|
||||||
|
let l:indx = -1
|
||||||
|
while l:map[l:indx][1] == 1
|
||||||
|
let l:math_end = a:line[l:map[l:indx][0] - 1] . l:math_end
|
||||||
|
let l:indx -= 1
|
||||||
|
endwhile
|
||||||
|
|
||||||
|
return [l:normal, l:math_pre, l:math_end]
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" }}}2
|
||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
function! s:indent_tikz(lnum, prev) " {{{1
|
function! s:indent_tikz(lnum, prev) " {{{1
|
||||||
if vimtex#env#is_inside('tikzpicture')
|
if vimtex#env#is_inside('tikzpicture')
|
||||||
@ -142,20 +209,6 @@ let s:tikz_commands = '\v\\%(' . join([
|
|||||||
|
|
||||||
" }}}1
|
" }}}1
|
||||||
|
|
||||||
function! s:count(line, pattern) " {{{1
|
|
||||||
let sum = 0
|
|
||||||
let indx = match(a:line, a:pattern)
|
|
||||||
while indx >= 0
|
|
||||||
let sum += 1
|
|
||||||
let match = matchstr(a:line, a:pattern, indx)
|
|
||||||
let indx += len(match)
|
|
||||||
let indx = match(a:line, a:pattern, indx)
|
|
||||||
endwhile
|
|
||||||
return sum
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" }}}1
|
|
||||||
|
|
||||||
let &cpo = s:cpo_save
|
let &cpo = s:cpo_save
|
||||||
unlet s:cpo_save
|
unlet s:cpo_save
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user