vimtex/indent/tex.vim

142 lines
3.5 KiB
VimL
Raw Normal View History

2015-03-07 23:02:15 +01:00
" vimtex - LaTeX plugin for Vim
2014-07-23 00:08:57 +02:00
"
" Maintainer: Karl Yngve Lervåg
" Email: karl.yngve@gmail.com
"
2015-03-19 15:12:12 +01:00
if exists('b:did_indent')
2013-10-10 14:47:08 +02:00
finish
endif
let b:did_indent = 1
2016-02-23 21:03:53 +01:00
let b:did_vimtex_indent = 1
2015-01-26 15:41:40 +01:00
2015-03-07 23:02:15 +01:00
call vimtex#util#set_default('g:vimtex_indent_enabled', 1)
if !g:vimtex_indent_enabled | finish | endif
2015-01-26 15:41:40 +01:00
2013-10-10 14:47:08 +02:00
let s:cpo_save = &cpo
set cpo&vim
setlocal autoindent
setlocal indentexpr=VimtexIndent()
2013-10-10 14:47:08 +02:00
setlocal indentkeys&
2015-10-26 22:43:36 +01:00
setlocal indentkeys+=[,(,{,),},],\&,=item
2013-10-10 14:47:08 +02:00
function! VimtexIndent() " {{{1
2013-10-10 14:47:08 +02:00
" Find a non-blank non-comment line above the current line
2016-03-24 12:52:45 +01:00
let l:nprev = prevnonblank(v:lnum - 1)
while l:nprev != 0 && getline(l:nprev) =~# '^\s*%'
let l:nprev = prevnonblank(l:nprev - 1)
2013-10-10 14:47:08 +02:00
endwhile
2016-03-24 12:52:45 +01:00
if l:nprev == 0
2013-10-10 14:47:08 +02:00
return 0
endif
2016-03-24 12:52:45 +01:00
" Get current and previous line and remove comments
let l:cur = substitute(getline(v:lnum), '\\\@<!%.*', '', '')
let l:prev = substitute(getline(l:nprev), '\\\@<!%.*', '', '')
2013-10-10 14:47:08 +02:00
" Check for verbatim modes
2015-03-19 15:12:12 +01:00
if synIDattr(synID(v:lnum, indent(v:lnum), 1), 'name') ==# 'texZone'
2016-03-24 12:52:45 +01:00
return empty(l:cur) ? indent(l:nprev) : indent(v:lnum)
2013-10-10 14:47:08 +02:00
endif
" Align on ampersands
2016-03-24 12:52:45 +01:00
if l:cur =~# '^\s*&' && l:prev =~# '\\\@<!&.*'
return indent(v:lnum) + match(l:prev, '\\\@<!&') - stridx(l:cur, '&')
endif
" Use previous indentation for comments
if l:cur =~# '^\s*%'
return indent(v:lnum)
2013-10-10 14:47:08 +02:00
endif
" Find previous non-empty non-comment non-ampersand line
2016-03-24 12:52:45 +01:00
while l:nprev != 0 && (match(l:prev, '\\\@<!&') != -1 || l:prev =~# '^\s*%')
let l:nprev = prevnonblank(l:nprev - 1)
let l:prev = getline(l:nprev)
2013-10-10 14:47:08 +02:00
endwhile
2016-03-24 12:52:45 +01:00
if l:nprev == 0
2013-10-10 14:47:08 +02:00
return 0
endif
2016-03-24 12:52:45 +01:00
let l:ind = indent(l:nprev)
2013-10-10 14:47:08 +02:00
" Add indent on begin environment
2016-03-24 12:52:45 +01:00
if l:prev =~# '\\begin{.*}' && l:prev !~ s:envs_noindent
let l:ind = l:ind + &sw
2013-10-10 14:47:08 +02:00
" Add extra indent for list environments
2016-03-24 12:52:45 +01:00
if l:prev =~ s:envs_lists
let l:ind = l:ind + &sw
2013-10-10 14:47:08 +02:00
endif
endif
" Subtract indent on end environment
2016-03-24 12:52:45 +01:00
if l:cur =~# '\\end{.*}' && l:cur !~ s:envs_noindent
let l:ind = l:ind - &sw
2013-10-10 14:47:08 +02:00
" Subtract extra indent for list environments
2016-03-24 12:52:45 +01:00
if l:cur =~ s:envs_lists
let l:ind = l:ind - &sw
2013-10-10 14:47:08 +02:00
endif
endif
" Indent opening and closing delimiters
let [l:re_open, l:re_close] = vimtex#delim#get_valid_regexps(v:lnum, col('.'))
2016-03-24 12:52:45 +01:00
let l:ind += &sw*(
\ max([s:count(l:prev, l:re_open) - s:count(l:prev, l:re_close), 0])
\ - max([s:count(l:cur, l:re_close) - s:count(l:cur, l:re_open), 0]))
2013-10-10 14:47:08 +02:00
" Indent list items
2016-03-24 12:52:45 +01:00
if l:prev =~# '^\s*\\\(bib\)\?item'
let l:ind += &sw
2013-10-10 14:47:08 +02:00
endif
2016-03-24 12:52:45 +01:00
if l:cur =~# '^\s*\\\(bib\)\?item'
let l:ind -= &sw
2013-10-10 14:47:08 +02:00
endif
" Indent tikz elements
2016-03-24 12:52:45 +01:00
if l:prev =~# s:tikz_commands && l:prev !~# ';'
let l:ind += &sw
elseif l:prev !~# s:tikz_commands && l:prev =~# ';'
let l:ind -= &sw
endif
2016-03-24 12:52:45 +01:00
return l:ind
2013-10-10 14:47:08 +02:00
endfunction
"}}}
function! s:count(line, pattern) " {{{1
2013-10-10 14:47:08 +02:00
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
2015-03-07 23:02:15 +01:00
" }}}1
" {{{1 Script variables
" Define some common patterns
let s:envs_lists = 'itemize\|description\|enumerate\|thebibliography'
let s:envs_noindent = 'document\|verbatim\|lstlisting'
2016-02-23 22:13:06 +01:00
let s:tikz_commands = '\v\\%(' . join([
2015-03-07 23:02:15 +01:00
\ 'draw',
\ 'fill',
\ 'path',
\ 'node',
2016-02-23 22:13:06 +01:00
\ 'coordinate',
\ 'add%(legendentry|plot)',
\ ], '|') . ')'
2015-03-07 23:02:15 +01:00
2013-10-10 14:47:08 +02:00
" }}}1
let &cpo = s:cpo_save
unlet s:cpo_save
2014-12-08 20:44:17 +01:00
" vim: fdm=marker sw=2