diff options
Diffstat (limited to 'indent')
| -rw-r--r-- | indent/tex.vim | 304 | 
1 files changed, 66 insertions, 238 deletions
| diff --git a/indent/tex.vim b/indent/tex.vim index 50d1de1a..63453bda 100644 --- a/indent/tex.vim +++ b/indent/tex.vim @@ -1,262 +1,90 @@ -" Vim indent file -" Language:     LaTeX -" Maintainer:   Johannes Tanzler <johannes.tanzler@gmail.com> -" Version: 	0.5 -" Created:      Sat, 16 Feb 2002 16:50:19 +0100 -" Last Change:	Mar, 27 Jun 2011 11:46:35 +0200 -" Last Update:  18th feb 2002, by LH : -"               (*) better support for the option -"               (*) use some regex instead of several '||'. -"               Oct 9th, 2003, by JT: -"               (*) don't change indentation of lines starting with '%' -"               2005/06/15, Moshe Kaminsky <kaminsky@math.huji.ac.il> -"               (*) New variables: -"                   g:tex_items, g:tex_itemize_env, g:tex_noindent_env -"               2011/3/6, by Zhou Yi Chao <broken.zhou@gmail.com> -"               (*) Don't change indentation of lines starting with '%' -"                   I don't see any code with '%' and it doesn't work properly -"                   so I add some code. -"               (*) New features: Add smartindent-like indent -"                   for "{}" and  "[]". -"               (*) New variables: g:tex_indent_brace -" -" Options: {{{ -" -" To set the following options (ok, currently it's just one), add a line like -"   let g:tex_indent_items = 1 -" to your ~/.vimrc. -" -" * g:tex_indent_brace -" -"   If this variable is unset or non-zero, it will use smartindent-like style -"   for "{}" and "[]" -" -" * g:tex_indent_items -" -"   If this variable is set, item-environments are indented like Emacs does -"   it, i.e., continuation lines are indented with a shiftwidth. -" -"   NOTE: I've already set the variable below; delete the corresponding line -"   if you don't like this behaviour. -" -"   Per default, it is unset. -" -"              set                                unset -"   ---------------------------------------------------------------- -"       \begin{itemize}                      \begin{itemize} -"         \item blablabla                      \item blablabla -"           bla bla bla                        bla bla bla -"         \item blablabla                      \item blablabla -"           bla bla bla                        bla bla bla -"       \end{itemize}                        \end{itemize} -" -" -" * g:tex_items -" -"   A list of tokens to be considered as commands for the beginning of an item -"   command. The tokens should be separated with '\|'. The initial '\' should -"   be escaped. The default is '\\bibitem\|\\item'. -" -" * g:tex_itemize_env -" -"   A list of environment names, separated with '\|', where the items (item -"   commands matching g:tex_items) may appear. The default is -"   'itemize\|description\|enumerate\|thebibliography'. -" -" * g:tex_noindent_env -" -"   A list of environment names. separated with '\|', where no indentation is -"   required. The default is 'document\|verbatim\|comment\|lstlisting'. -" -" }}} -" -" License: {{{ -" Copyright (c) 2002-2011 Johannes Tanzler <johannes.tanzler@gmail.com> - -" Permission is hereby granted, free of charge, to any person obtaining -" a copy of this software and associated documentation files (the -" "Software"), to deal in the Software without restriction, including -" without limitation the rights to use, copy, modify, merge, publish, -" distribute, sublicense, and/or sell copies of the Software, and to -" permit persons to whom the Software is furnished to do so, subject to -" the following conditions: -" -" The above copyright notice and this permission notice shall be included -" in all copies or substantial portions of the Software. -" -" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -" IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -" CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -" TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -" SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -" }}} +" LaTeX indent file (part of LaTeX Box) +" Maintainer: David Munger (mungerd@gmail.com)  if exists("b:did_indent") -    finish -endif -let b:did_indent = 1 - -" Delete the next line to avoid the special indention of items -if !exists("g:tex_indent_items") -    let g:tex_indent_items = 1 -endif -if !exists("g:tex_indent_brace") -    let g:tex_indent_brace = 1 -endif -if g:tex_indent_items -    if !exists("g:tex_itemize_env") -        let g:tex_itemize_env = 'itemize\|description\|enumerate\|thebibliography' -    endif -    if !exists('g:tex_items') -        let g:tex_items = '\\bibitem\|\\item' -    endif -else -    let g:tex_items = '' -endif - -if !exists("g:tex_noindent_env") -    let g:tex_noindent_env = 'document\|verbatim\|comment\|lstlisting' -endif - -setlocal autoindent -setlocal nosmartindent -setlocal indentexpr=GetTeXIndent() -exec 'setlocal indentkeys+=},]' . substitute(g:tex_items, '^\|\(\\|\)', ',=', 'g') -let g:tex_items = '^\s*' . g:tex_items - - -" Only define the function once -if exists("*GetTeXIndent") | finish +	finish  endif +let b:did_indent = 1 +setlocal indentexpr=LatexBox_TexIndent() +setlocal indentkeys=0=\\end,0=\\end{enumerate},0=\\end{itemize},0=\\end{description},0=\\right,0=\\item,0=\\),0=\\],0},o,O,0\\ -function GetTeXIndent() - -    " Find a non-blank line above the current line. -    let lnum = prevnonblank(v:lnum - 1) - -    " New code for comments: Comments is not what we need. -    while lnum != 0 -        if getline(lnum) !~ '^\s*%' -            break -        endif -        let lnum = prevnonblank(lnum - 1) -    endwhile - -    " At the start of the file use zero indent. -    if lnum == 0 | return 0 -    endif - -    let ind = indent(lnum) -    let line = getline(lnum)             " last line -    let cline = getline(v:lnum)          " current line - -    " New code for comment: retain the indent of current line -    if cline =~ '^\s*%' -        return indent(v:lnum) -    endif +let s:list_envs = ['itemize', 'enumerate', 'description'] +" indent on \left( and on \(, but not on ( +" indent on \left[ and on \[, but not on [ +" indent on \left\{ and on {, but not on \{ +let s:open_pat = '\\\@<!\%(\\begin\|\\left\|\\(\|\\\[\|{\)' +let s:close_pat = '\\\@<!\%(\\end\|\\right\|\\)\|\\\]\|}\)' +let s:list_open_pat = '\\\@<!\\begin{\%(' . join(s:list_envs, '\|') . '\)}' +let s:list_close_pat	= '\\\@<!\\end{\%(' . join(s:list_envs, '\|') . '\)}' -    " Add a 'shiftwidth' after beginning of environments. -    " Don't add it for environments identified by -    " g:tex_noindent_env -    " LH modification : \begin does not always start a line -    let current_regexp = '\\begin' -    while 1 -        let match_list = matchlist(line, current_regexp.'\s*{\(.*\)}') -        if (empty(match_list)) -            break -        endif -        let environment_type = get(match_list, 1) -        if environment_type !~ g:tex_noindent_env -            let ind = ind + &sw +function! s:CountMatches(str, pat) +	return len(substitute(substitute(a:str, a:pat, "\n", 'g'), "[^\n]", '', 'g')) +endfunction -            if g:tex_indent_items == 1 -                " Add another sw for item-environments -                if line =~ g:tex_itemize_env -                    let ind = ind + &sw -                endif -            endif -        endif -        " Make the regexp match the following begin -        let current_regexp = current_regexp.'.*\\begin' -    endwhile -    " Subtract a 'shiftwidth' when an environment ends -    if cline =~ '^\s*\\end' && cline !~ g:tex_noindent_env +" TexIndent {{{ +function! LatexBox_TexIndent() -        if g:tex_indent_items == 1 -            " Remove another sw for item-environments -            if cline =~ g:tex_itemize_env -                let ind = ind - &sw -            endif -        endif +	let lnum_curr = v:lnum +	let lnum_prev = prevnonblank(lnum_curr - 1) -        let ind = ind - &sw -    endif +	if lnum_prev == 0 +		return 0 +	endif -    " Subtract a 'shiftwidth' when an environment ended -    " the previous line but the shiftwidth wasn't -    " applied because it didn't begin the line -    let current_regexp = '\\end' -    while 1 -        let match_list = matchlist(line, current_regexp.'\s*{\(.*\)}') -        if (empty(match_list)) -            break -        endif -        let environment_type = get(match_list, 1) -        if environment_type !~ g:tex_noindent_env -           \ && (current_regexp != '\\end' || line !~ '^\s*\\end') -           " If the end begin the line, the shift width has already -           " been subtracted at the previous line +	let line_curr = getline(lnum_curr) +	let line_prev = getline(lnum_prev) -            let ind = ind - &sw +	" remove \\ +	let line_curr = substitute(line_curr, '\\\\', '', 'g') +	let line_prev = substitute(line_prev, '\\\\', '', 'g') -            if g:tex_indent_items == 1 -                " Add another sw for item-environments -                if line =~ g:tex_itemize_env -                    let ind = ind - &sw -                endif -            endif -        endif -        " Make the regexp match the following end -        let current_regexp = current_regexp.'.*\\end' -    endwhile +	" strip comments +	let line_curr = substitute(line_curr, '\\\@<!%.*$', '', 'g') +	let line_prev = substitute(line_prev, '\\\@<!%.*$', '', 'g') -    if g:tex_indent_brace -      " Add a 'shiftwidth' after a "{" or "[" while there are not "}" and "]" -      " after them. \m for magic -        if line =~ '\m\(\(\[[^\]]*\)\|\({[^}]*\)\)$' -            let ind = ind + &sw -        endif -      " Remove a 'shiftwidth' after a "}" or "]" while there are not "{" and "[" -      " before them. \m for magic -        if cline =~ '\m^\(\([^[]*\]\)\|\([^{]*}\)\)' -            let ind = ind - &sw -        endif -    endif +	" find unmatched opening patterns on previous line +	let n = s:CountMatches(line_prev, s:open_pat)-s:CountMatches(line_prev, s:close_pat) +	let n += s:CountMatches(line_prev, s:list_open_pat)-s:CountMatches(line_prev, s:list_close_pat) +	" reduce indentation if current line starts with a closing pattern +	if line_curr =~ '^\s*\%(' . s:close_pat . '\)' +		let n -= 1 +	endif -    " Special treatment for 'item' -    " ---------------------------- +	" compensate indentation if previous line starts with a closing pattern +	if line_prev =~ '^\s*\%(' . s:close_pat . '\)' +		let n += 1 +	endif -    if g:tex_indent_items +	" reduce indentation if current line starts with a closing list +	if line_curr =~ '^\s*\%(' . s:list_close_pat . '\)' +		let n -= 1 +	endif -        " '\item' or '\bibitem' itself: -        if cline =~ g:tex_items -            let ind = ind - &sw -        endif +	" compensate indentation if previous line starts with a closing list +	if line_prev =~ '^\s*\%(' . s:list_close_pat . '\)' +		let n += 1 +	endif -        " lines following to '\item' are intented once again: -        if line =~ g:tex_items -            let ind = ind + &sw -        endif +	" reduce indentation if previous line is \begin{document} +	if line_prev =~ '\\begin\s*{document}' +		let n -= 1 +	endif -    endif +	" less shift for lines starting with \item +	let item_here =  line_curr =~ '^\s*\\item' +	let item_above = line_prev =~ '^\s*\\item' +	if !item_here && item_above +		let n += 1 +	elseif item_here && !item_above +		let n -= 1 +	endif -    return ind +	return indent(lnum_prev) + n * &sw  endfunction +" }}} -" vim: set sw=4 textwidth=78: +" vim:fdm=marker:ff=unix:noet:ts=4:sw=4 | 
