xref: /vim-8.2.3635/runtime/indent/tex.vim (revision 6c391a74)
1eb3dc87fSBram Moolenaar" Vim indent file
2eb3dc87fSBram Moolenaar" Language:     LaTeX
3eb3dc87fSBram Moolenaar" Maintainer:   Yichao Zhou <broken.zhou AT gmail.com>
4f1568ecaSBram Moolenaar" Created:      Sat, 16 Feb 2002 16:50:19 +0100
5eb3dc87fSBram Moolenaar" Version: 1.0.0
6328da0dcSBram Moolenaar"   Please email me if you found something I can do.  Comments, bug report and
7328da0dcSBram Moolenaar"   feature request are welcome.
861d35bd0SBram Moolenaar
9eb3dc87fSBram Moolenaar" Last Update:  {{{
1061d35bd0SBram Moolenaar"               25th Sep 2002, by LH :
11f1568ecaSBram Moolenaar"               (*) better support for the option
12f1568ecaSBram Moolenaar"               (*) use some regex instead of several '||'.
13f1568ecaSBram Moolenaar"               Oct 9th, 2003, by JT:
14f1568ecaSBram Moolenaar"               (*) don't change indentation of lines starting with '%'
1561d35bd0SBram Moolenaar"               2005/06/15, Moshe Kaminsky <kaminsky AT math.huji.ac.il>
16f1568ecaSBram Moolenaar"               (*) New variables:
17f1568ecaSBram Moolenaar"                   g:tex_items, g:tex_itemize_env, g:tex_noindent_env
18eb3dc87fSBram Moolenaar"               2011/3/6, by Yichao Zhou <broken.zhou AT gmail.com>
19f1568ecaSBram Moolenaar"               (*) Don't change indentation of lines starting with '%'
20f1568ecaSBram Moolenaar"                   I don't see any code with '%' and it doesn't work properly
21f1568ecaSBram Moolenaar"                   so I add some code.
22f1568ecaSBram Moolenaar"               (*) New features: Add smartindent-like indent for "{}" and  "[]".
23f1568ecaSBram Moolenaar"               (*) New variables: g:tex_indent_brace
24eb3dc87fSBram Moolenaar"               2011/9/25, by Yichao Zhou <broken.zhou AT gmail.com>
25f1568ecaSBram Moolenaar"               (*) Bug fix: smartindent-like indent for "[]"
26f1568ecaSBram Moolenaar"               (*) New features: Align with "&".
2761d35bd0SBram Moolenaar"               (*) New variable: g:tex_indent_and.
28eb3dc87fSBram Moolenaar"               2011/10/23 by Yichao Zhou <broken.zhou AT gmail.com>
29f1568ecaSBram Moolenaar"               (*) Bug fix: improve the smartindent-like indent for "{}" and
30f1568ecaSBram Moolenaar"               "[]".
31eb3dc87fSBram Moolenaar"               2012/02/27 by Yichao Zhou <broken.zhou AT gmail.com>
3261d35bd0SBram Moolenaar"               (*) Bug fix: support default folding marker.
3361d35bd0SBram Moolenaar"               (*) Indent with "&" is not very handy.  Make it not enable by
3461d35bd0SBram Moolenaar"               default.
35eb3dc87fSBram Moolenaar"               2012/03/06 by Yichao Zhou <broken.zhou AT gmail.com>
3661d35bd0SBram Moolenaar"               (*) Modify "&" behavior and make it default again.  Now "&"
3761d35bd0SBram Moolenaar"               won't align when there are more then one "&" in the previous
3861d35bd0SBram Moolenaar"               line.
3961d35bd0SBram Moolenaar"               (*) Add indent "\left(" and "\right)"
4061d35bd0SBram Moolenaar"               (*) Trust user when in "verbatim" and "lstlisting"
41eb3dc87fSBram Moolenaar"               2012/03/11 by Yichao Zhou <broken.zhou AT gmail.com>
4261d35bd0SBram Moolenaar"               (*) Modify "&" so that only indent when current line start with
4361d35bd0SBram Moolenaar"                   "&".
44eb3dc87fSBram Moolenaar"               2012/03/12 by Yichao Zhou <broken.zhou AT gmail.com>
4561d35bd0SBram Moolenaar"               (*) Modify indentkeys.
46eb3dc87fSBram Moolenaar"               2012/03/18 by Yichao Zhou <broken.zhou AT gmail.com>
4761d35bd0SBram Moolenaar"               (*) Add &cpo
48eb3dc87fSBram Moolenaar"               2013/05/02 by Yichao Zhou <broken.zhou AT gmail.com>
49ad3b366cSBram Moolenaar"               (*) Fix problem about GetTeXIndent checker. Thank Albert Netymk
50ad3b366cSBram Moolenaar"                   for reporting this.
51eb3dc87fSBram Moolenaar"               2014/06/23 by Yichao Zhou <broken.zhou AT gmail.com>
52328da0dcSBram Moolenaar"               (*) Remove the feature g:tex_indent_and because it is buggy.
53328da0dcSBram Moolenaar"               (*) If there is not any obvious indentation hints, we do not
54328da0dcSBram Moolenaar"                   alert our user's current indentation.
55328da0dcSBram Moolenaar"               (*) g:tex_indent_brace now only works if the open brace is the
56328da0dcSBram Moolenaar"                   last character of that line.
57eb3dc87fSBram Moolenaar"               2014/08/03 by Yichao Zhou <broken.zhou AT gmail.com>
58328da0dcSBram Moolenaar"               (*) Indent current line if last line has larger indentation
59eb3dc87fSBram Moolenaar"               2016/11/08 by Yichao Zhou <broken.zhou AT gmail.com>
60eb3dc87fSBram Moolenaar"               (*) Fix problems for \[ and \].  Thanks Bruno for reporting.
61eb3dc87fSBram Moolenaar"               2017/04/30 by Yichao Zhou <broken.zhou AT gmail.com>
62eb3dc87fSBram Moolenaar"               (*) Fix a bug between g:tex_noindent_env and g:tex_indent_items
63eb3dc87fSBram Moolenaar"                   Now g:tex_noindent_env='document\|verbatim\|itemize' (Emacs
64eb3dc87fSBram Moolenaar"                   style) is supported.  Thanks Miles Wheeler for reporting.
65eb3dc87fSBram Moolenaar"               2018/02/07 by Yichao Zhou <broken.zhou AT gmail.com>
66eb3dc87fSBram Moolenaar"               (*) Make indentation more smart in the normal mode
67388a5d4fSBram Moolenaar"               2020/04/26 by Yichao Zhou <broken.zhou AT gmail.com>
68388a5d4fSBram Moolenaar"               (*) Fix a bug related to \[ & \].  Thanks Manuel Boni for
69388a5d4fSBram Moolenaar"               reporting.
70328da0dcSBram Moolenaar"
7161d35bd0SBram Moolenaar" }}}
72eb3dc87fSBram Moolenaar
73eb3dc87fSBram Moolenaar" Document: {{{
74eb3dc87fSBram Moolenaar"
75388a5d4fSBram Moolenaar" For proper latex experience, please put
76388a5d4fSBram Moolenaar"         let g:tex_flavor = "latex"
77388a5d4fSBram Moolenaar" into your vimrc.
78eb3dc87fSBram Moolenaar"
79eb3dc87fSBram Moolenaar" * g:tex_indent_brace
80eb3dc87fSBram Moolenaar"
81eb3dc87fSBram Moolenaar"   If this variable is unset or non-zero, it will use smartindent-like style
82eb3dc87fSBram Moolenaar"   for "{}" and "[]".  Now this only works if the open brace is the last
83eb3dc87fSBram Moolenaar"   character of that line.
84eb3dc87fSBram Moolenaar"
85eb3dc87fSBram Moolenaar"         % Example 1
86eb3dc87fSBram Moolenaar"         \usetikzlibrary{
87eb3dc87fSBram Moolenaar"           external
88eb3dc87fSBram Moolenaar"         }
89eb3dc87fSBram Moolenaar"
90eb3dc87fSBram Moolenaar"         % Example 2
91eb3dc87fSBram Moolenaar"         \tikzexternalize[
92eb3dc87fSBram Moolenaar"           prefix=tikz]
93eb3dc87fSBram Moolenaar"
94eb3dc87fSBram Moolenaar" * g:tex_indent_items
95eb3dc87fSBram Moolenaar"
96eb3dc87fSBram Moolenaar"   If this variable is set, item-environments are indented like Emacs does
97eb3dc87fSBram Moolenaar"   it, i.e., continuation lines are indented with a shiftwidth.
98eb3dc87fSBram Moolenaar"
99eb3dc87fSBram Moolenaar"              set                      unset
100eb3dc87fSBram Moolenaar"   ------------------------------------------------------
101eb3dc87fSBram Moolenaar"       \begin{itemize}            \begin{itemize}
102eb3dc87fSBram Moolenaar"         \item blablabla            \item blablabla
103eb3dc87fSBram Moolenaar"           bla bla bla              bla bla bla
104eb3dc87fSBram Moolenaar"         \item blablabla            \item blablabla
105eb3dc87fSBram Moolenaar"           bla bla bla              bla bla bla
106eb3dc87fSBram Moolenaar"       \end{itemize}              \end{itemize}
107eb3dc87fSBram Moolenaar"
108eb3dc87fSBram Moolenaar"
109eb3dc87fSBram Moolenaar" * g:tex_items
110eb3dc87fSBram Moolenaar"
111eb3dc87fSBram Moolenaar"   A list of tokens to be considered as commands for the beginning of an item
112eb3dc87fSBram Moolenaar"   command. The tokens should be separated with '\|'. The initial '\' should
113eb3dc87fSBram Moolenaar"   be escaped. The default is '\\bibitem\|\\item'.
114eb3dc87fSBram Moolenaar"
115eb3dc87fSBram Moolenaar" * g:tex_itemize_env
116eb3dc87fSBram Moolenaar"
117eb3dc87fSBram Moolenaar"   A list of environment names, separated with '\|', where the items (item
118eb3dc87fSBram Moolenaar"   commands matching g:tex_items) may appear. The default is
119eb3dc87fSBram Moolenaar"   'itemize\|description\|enumerate\|thebibliography'.
120eb3dc87fSBram Moolenaar"
121eb3dc87fSBram Moolenaar" * g:tex_noindent_env
122eb3dc87fSBram Moolenaar"
123eb3dc87fSBram Moolenaar"   A list of environment names. separated with '\|', where no indentation is
124eb3dc87fSBram Moolenaar"   required. The default is 'document\|verbatim'.
125eb3dc87fSBram Moolenaar" }}}
126eb3dc87fSBram Moolenaar
127eb3dc87fSBram Moolenaar" Only define the function once
128f1568ecaSBram Moolenaarif exists("b:did_indent")
129f1568ecaSBram Moolenaar    finish
130f1568ecaSBram Moolenaarendif
13161d35bd0SBram Moolenaar
13261d35bd0SBram Moolenaarlet s:cpo_save = &cpo
13361d35bd0SBram Moolenaarset cpo&vim
134eb3dc87fSBram Moolenaar
135eb3dc87fSBram Moolenaar" Define global variable {{{
136eb3dc87fSBram Moolenaar
137f1568ecaSBram Moolenaarlet b:did_indent = 1
138f1568ecaSBram Moolenaar
139f1568ecaSBram Moolenaarif !exists("g:tex_indent_items")
140f1568ecaSBram Moolenaar    let g:tex_indent_items = 1
141f1568ecaSBram Moolenaarendif
142f1568ecaSBram Moolenaarif !exists("g:tex_indent_brace")
143f1568ecaSBram Moolenaar    let g:tex_indent_brace = 1
144f1568ecaSBram Moolenaarendif
145328da0dcSBram Moolenaarif !exists("g:tex_max_scan_line")
146328da0dcSBram Moolenaar    let g:tex_max_scan_line = 60
147f1568ecaSBram Moolenaarendif
148f1568ecaSBram Moolenaarif g:tex_indent_items
149f1568ecaSBram Moolenaar    if !exists("g:tex_itemize_env")
150f1568ecaSBram Moolenaar        let g:tex_itemize_env = 'itemize\|description\|enumerate\|thebibliography'
151f1568ecaSBram Moolenaar    endif
152f1568ecaSBram Moolenaar    if !exists('g:tex_items')
153f1568ecaSBram Moolenaar        let g:tex_items = '\\bibitem\|\\item'
154f1568ecaSBram Moolenaar    endif
155f1568ecaSBram Moolenaarelse
156f1568ecaSBram Moolenaar    let g:tex_items = ''
157f1568ecaSBram Moolenaarendif
158f1568ecaSBram Moolenaar
15961d35bd0SBram Moolenaarif !exists("g:tex_noindent_env")
16061d35bd0SBram Moolenaar    let g:tex_noindent_env = 'document\|verbatim\|lstlisting'
16161d35bd0SBram Moolenaarendif "}}}
162eb3dc87fSBram Moolenaar
163eb3dc87fSBram Moolenaar" VIM Setting " {{{
164f1568ecaSBram Moolenaarsetlocal autoindent
165f1568ecaSBram Moolenaarsetlocal nosmartindent
166f1568ecaSBram Moolenaarsetlocal indentexpr=GetTeXIndent()
16761d35bd0SBram Moolenaarsetlocal indentkeys&
16861d35bd0SBram Moolenaarexec 'setlocal indentkeys+=[,(,{,),},],\&' . substitute(g:tex_items, '^\|\(\\|\)', ',=', 'g')
16961d35bd0SBram Moolenaarlet g:tex_items = '^\s*' . substitute(g:tex_items, '^\(\^\\s\*\)*', '', '')
1707db25fedSBram Moolenaar" }}}
171eb3dc87fSBram Moolenaar
172eb3dc87fSBram Moolenaarfunction! GetTeXIndent() " {{{
173f1568ecaSBram Moolenaar    " Find a non-blank line above the current line.
174f1568ecaSBram Moolenaar    let lnum = prevnonblank(v:lnum - 1)
175328da0dcSBram Moolenaar    let cnum = v:lnum
176f1568ecaSBram Moolenaar
177f1568ecaSBram Moolenaar    " Comment line is not what we need.
178f1568ecaSBram Moolenaar    while lnum != 0 && getline(lnum) =~ '^\s*%'
179f1568ecaSBram Moolenaar        let lnum = prevnonblank(lnum - 1)
180f1568ecaSBram Moolenaar    endwhile
181f1568ecaSBram Moolenaar
182f1568ecaSBram Moolenaar    " At the start of the file use zero indent.
183f1568ecaSBram Moolenaar    if lnum == 0
184f1568ecaSBram Moolenaar        return 0
185f1568ecaSBram Moolenaar    endif
186f1568ecaSBram Moolenaar
187328da0dcSBram Moolenaar    let line = substitute(getline(lnum), '\s*%.*', '','g')     " last line
188328da0dcSBram Moolenaar    let cline = substitute(getline(v:lnum), '\s*%.*', '', 'g') " current line
18961d35bd0SBram Moolenaar
190388a5d4fSBram Moolenaar    let ccol = 1
191388a5d4fSBram Moolenaar    while cline[ccol] =~ '\s'
192388a5d4fSBram Moolenaar        let ccol += 1
193388a5d4fSBram Moolenaar    endwhile
194388a5d4fSBram Moolenaar
19561d35bd0SBram Moolenaar    "  We are in verbatim, so do what our user what.
196388a5d4fSBram Moolenaar    if synIDattr(synID(v:lnum, ccol, 1), "name") == "texZone"
19761d35bd0SBram Moolenaar        if empty(cline)
19861d35bd0SBram Moolenaar            return indent(lnum)
19961d35bd0SBram Moolenaar        else
20061d35bd0SBram Moolenaar            return indent(v:lnum)
201388a5d4fSBram Moolenaar        endif
20261d35bd0SBram Moolenaar    endif
203f1568ecaSBram Moolenaar
204f1568ecaSBram Moolenaar    if lnum == 0
205f1568ecaSBram Moolenaar        return 0
206f1568ecaSBram Moolenaar    endif
207f1568ecaSBram Moolenaar
208f1568ecaSBram Moolenaar    let ind = indent(lnum)
209328da0dcSBram Moolenaar    let stay = 1
210f1568ecaSBram Moolenaar
211f1568ecaSBram Moolenaar    " New code for comment: retain the indent of current line
212f1568ecaSBram Moolenaar    if cline =~ '^\s*%'
213f1568ecaSBram Moolenaar        return indent(v:lnum)
214f1568ecaSBram Moolenaar    endif
215f1568ecaSBram Moolenaar
216eb3dc87fSBram Moolenaar    " Add a 'shiftwidth' after beginning of environments.
217eb3dc87fSBram Moolenaar    " Don't add it for \begin{document} and \begin{verbatim}
218eb3dc87fSBram Moolenaar    " if line =~ '^\s*\\begin{\(.*\)}'  && line !~ 'verbatim'
219eb3dc87fSBram Moolenaar    " LH modification : \begin does not always start a line
220eb3dc87fSBram Moolenaar    " ZYC modification : \end after \begin won't cause wrong indent anymore
221eb3dc87fSBram Moolenaar    if line =~ '\\begin{.*}'
222eb3dc87fSBram Moolenaar        if line !~ g:tex_noindent_env
2233ec574f2SBram Moolenaar            let ind = ind + shiftwidth()
224328da0dcSBram Moolenaar            let stay = 0
225eb3dc87fSBram Moolenaar        endif
226f1568ecaSBram Moolenaar
227f1568ecaSBram Moolenaar        if g:tex_indent_items
228f1568ecaSBram Moolenaar            " Add another sw for item-environments
229f1568ecaSBram Moolenaar            if line =~ g:tex_itemize_env
2303ec574f2SBram Moolenaar                let ind = ind + shiftwidth()
231328da0dcSBram Moolenaar                let stay = 0
232f1568ecaSBram Moolenaar            endif
233f1568ecaSBram Moolenaar        endif
234f1568ecaSBram Moolenaar    endif
235f1568ecaSBram Moolenaar
236328da0dcSBram Moolenaar    if cline =~ '\\end{.*}'
237328da0dcSBram Moolenaar        let retn = s:GetEndIndentation(v:lnum)
238328da0dcSBram Moolenaar        if retn != -1
239328da0dcSBram Moolenaar            return retn
240328da0dcSBram Moolenaar        endif
241328da0dcSBram Moolenaar    end
242f1568ecaSBram Moolenaar    " Subtract a 'shiftwidth' when an environment ends
243328da0dcSBram Moolenaar    if cline =~ '\\end{.*}'
244328da0dcSBram Moolenaar                \ && cline !~ g:tex_noindent_env
245328da0dcSBram Moolenaar                \ && cline !~ '\\begin{.*}.*\\end{.*}'
246f1568ecaSBram Moolenaar        if g:tex_indent_items
247f1568ecaSBram Moolenaar            " Remove another sw for item-environments
248f1568ecaSBram Moolenaar            if cline =~ g:tex_itemize_env
2493ec574f2SBram Moolenaar                let ind = ind - shiftwidth()
250328da0dcSBram Moolenaar                let stay = 0
251f1568ecaSBram Moolenaar            endif
252f1568ecaSBram Moolenaar        endif
253f1568ecaSBram Moolenaar
2543ec574f2SBram Moolenaar        let ind = ind - shiftwidth()
255328da0dcSBram Moolenaar        let stay = 0
256f1568ecaSBram Moolenaar    endif
257f1568ecaSBram Moolenaar
258f1568ecaSBram Moolenaar    if g:tex_indent_brace
259eb3dc87fSBram Moolenaar        if line =~ '[[{]$'
2603ec574f2SBram Moolenaar            let ind += shiftwidth()
261328da0dcSBram Moolenaar            let stay = 0
262f1568ecaSBram Moolenaar        endif
263328da0dcSBram Moolenaar
264388a5d4fSBram Moolenaar        if cline =~ '^\s*\\\?[\]}]' && s:CheckPairedIsLastCharacter(v:lnum, ccol)
2653ec574f2SBram Moolenaar            let ind -= shiftwidth()
266328da0dcSBram Moolenaar            let stay = 0
267328da0dcSBram Moolenaar        endif
268328da0dcSBram Moolenaar
269eb3dc87fSBram Moolenaar        if line !~ '^\s*\\\?[\]}]'
270388a5d4fSBram Moolenaar            for i in range(1, strlen(line)-1)
271328da0dcSBram Moolenaar                let char = line[i]
272328da0dcSBram Moolenaar                if char == ']' || char == '}'
273328da0dcSBram Moolenaar                    if s:CheckPairedIsLastCharacter(lnum, i)
2743ec574f2SBram Moolenaar                        let ind -= shiftwidth()
275328da0dcSBram Moolenaar                        let stay = 0
276328da0dcSBram Moolenaar                    endif
277f1568ecaSBram Moolenaar                endif
278f1568ecaSBram Moolenaar            endfor
27961d35bd0SBram Moolenaar        endif
280eb3dc87fSBram Moolenaar    endif
281f1568ecaSBram Moolenaar
282f1568ecaSBram Moolenaar    " Special treatment for 'item'
283f1568ecaSBram Moolenaar    " ----------------------------
284f1568ecaSBram Moolenaar
285f1568ecaSBram Moolenaar    if g:tex_indent_items
286f1568ecaSBram Moolenaar        " '\item' or '\bibitem' itself:
287f1568ecaSBram Moolenaar        if cline =~ g:tex_items
2883ec574f2SBram Moolenaar            let ind = ind - shiftwidth()
289328da0dcSBram Moolenaar            let stay = 0
290f1568ecaSBram Moolenaar        endif
291*6c391a74SBram Moolenaar        " lines following to '\item' are indented once again:
292f1568ecaSBram Moolenaar        if line =~ g:tex_items
2933ec574f2SBram Moolenaar            let ind = ind + shiftwidth()
294328da0dcSBram Moolenaar            let stay = 0
295328da0dcSBram Moolenaar        endif
296f1568ecaSBram Moolenaar    endif
297f1568ecaSBram Moolenaar
298eb3dc87fSBram Moolenaar    if stay && mode() == 'i'
299eb3dc87fSBram Moolenaar        " If there is no obvious indentation hint, and indentation is triggered
300eb3dc87fSBram Moolenaar        " in insert mode, we trust our user.
301328da0dcSBram Moolenaar        if empty(cline)
302f1568ecaSBram Moolenaar            return ind
303328da0dcSBram Moolenaar        else
304328da0dcSBram Moolenaar            return max([indent(v:lnum), s:GetLastBeginIndentation(v:lnum)])
305328da0dcSBram Moolenaar        endif
306328da0dcSBram Moolenaar    else
307328da0dcSBram Moolenaar        return ind
308328da0dcSBram Moolenaar    endif
309328da0dcSBram Moolenaarendfunction "}}}
310eb3dc87fSBram Moolenaar
311eb3dc87fSBram Moolenaarfunction! s:GetLastBeginIndentation(lnum) " {{{
312328da0dcSBram Moolenaar    let matchend = 1
313328da0dcSBram Moolenaar    for lnum in range(a:lnum-1, max([a:lnum - g:tex_max_scan_line, 1]), -1)
314328da0dcSBram Moolenaar        let line = getline(lnum)
315328da0dcSBram Moolenaar        if line =~ '\\end{.*}'
316328da0dcSBram Moolenaar            let matchend += 1
317328da0dcSBram Moolenaar        endif
318328da0dcSBram Moolenaar        if line =~ '\\begin{.*}'
319328da0dcSBram Moolenaar            let matchend -= 1
320328da0dcSBram Moolenaar        endif
321328da0dcSBram Moolenaar        if matchend == 0
3227db25fedSBram Moolenaar            if line =~ g:tex_noindent_env
3237db25fedSBram Moolenaar                return indent(lnum)
3247db25fedSBram Moolenaar            endif
325eb3dc87fSBram Moolenaar            if line =~ g:tex_itemize_env
326eb3dc87fSBram Moolenaar                return indent(lnum) + 2 * shiftwidth()
327eb3dc87fSBram Moolenaar            endif
3283ec574f2SBram Moolenaar            return indent(lnum) + shiftwidth()
329328da0dcSBram Moolenaar        endif
330328da0dcSBram Moolenaar    endfor
331328da0dcSBram Moolenaar    return -1
332328da0dcSBram Moolenaarendfunction
333328da0dcSBram Moolenaar
334eb3dc87fSBram Moolenaarfunction! s:GetEndIndentation(lnum) " {{{
335328da0dcSBram Moolenaar    if getline(a:lnum) =~ '\\begin{.*}.*\\end{.*}'
336328da0dcSBram Moolenaar        return -1
337328da0dcSBram Moolenaar    endif
338328da0dcSBram Moolenaar
339328da0dcSBram Moolenaar    let min_indent = 100
340328da0dcSBram Moolenaar    let matchend = 1
341328da0dcSBram Moolenaar    for lnum in range(a:lnum-1, max([a:lnum-g:tex_max_scan_line, 1]), -1)
342328da0dcSBram Moolenaar        let line = getline(lnum)
343328da0dcSBram Moolenaar        if line =~ '\\end{.*}'
344328da0dcSBram Moolenaar            let matchend += 1
345328da0dcSBram Moolenaar        endif
346328da0dcSBram Moolenaar        if line =~ '\\begin{.*}'
347328da0dcSBram Moolenaar            let matchend -= 1
348328da0dcSBram Moolenaar        endif
349328da0dcSBram Moolenaar        if matchend == 0
350328da0dcSBram Moolenaar            return indent(lnum)
351328da0dcSBram Moolenaar        endif
352328da0dcSBram Moolenaar        if !empty(line)
353328da0dcSBram Moolenaar            let min_indent = min([min_indent, indent(lnum)])
354328da0dcSBram Moolenaar        endif
355328da0dcSBram Moolenaar    endfor
3563ec574f2SBram Moolenaar    return min_indent - shiftwidth()
357328da0dcSBram Moolenaarendfunction
358328da0dcSBram Moolenaar
359328da0dcSBram Moolenaar" Most of the code is from matchparen.vim
360328da0dcSBram Moolenaarfunction! s:CheckPairedIsLastCharacter(lnum, col) "{{{
361328da0dcSBram Moolenaar    let c_lnum = a:lnum
362328da0dcSBram Moolenaar    let c_col = a:col+1
363328da0dcSBram Moolenaar
364eb3dc87fSBram Moolenaar    let line = getline(c_lnum)
365eb3dc87fSBram Moolenaar    if line[c_col-1] == '\'
366eb3dc87fSBram Moolenaar        let c_col = c_col + 1
367eb3dc87fSBram Moolenaar    endif
368eb3dc87fSBram Moolenaar    let c = line[c_col-1]
369328da0dcSBram Moolenaar
370328da0dcSBram Moolenaar    let plist = split(&matchpairs, '.\zs[:,]')
371328da0dcSBram Moolenaar    let i = index(plist, c)
372328da0dcSBram Moolenaar    if i < 0
373328da0dcSBram Moolenaar        return 0
374328da0dcSBram Moolenaar    endif
375328da0dcSBram Moolenaar
376328da0dcSBram Moolenaar    " Figure out the arguments for searchpairpos().
377328da0dcSBram Moolenaar    if i % 2 == 0
378328da0dcSBram Moolenaar        let s_flags = 'nW'
379328da0dcSBram Moolenaar        let c2 = plist[i + 1]
380328da0dcSBram Moolenaar    else
381328da0dcSBram Moolenaar        let s_flags = 'nbW'
382328da0dcSBram Moolenaar        let c2 = c
383328da0dcSBram Moolenaar        let c = plist[i - 1]
384328da0dcSBram Moolenaar    endif
385328da0dcSBram Moolenaar    if c == '['
386328da0dcSBram Moolenaar        let c = '\['
387328da0dcSBram Moolenaar        let c2 = '\]'
388328da0dcSBram Moolenaar    endif
389328da0dcSBram Moolenaar
390328da0dcSBram Moolenaar    " Find the match.  When it was just before the cursor move it there for a
391328da0dcSBram Moolenaar    " moment.
392328da0dcSBram Moolenaar    let save_cursor = winsaveview()
393328da0dcSBram Moolenaar    call cursor(c_lnum, c_col)
394328da0dcSBram Moolenaar
395328da0dcSBram Moolenaar    " When not in a string or comment ignore matches inside them.
396328da0dcSBram Moolenaar    " We match "escape" for special items, such as lispEscapeSpecial.
397328da0dcSBram Moolenaar    let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' .
398328da0dcSBram Moolenaar                \ '=~?  "string\\|character\\|singlequote\\|escape\\|comment"'
399328da0dcSBram Moolenaar    execute 'if' s_skip '| let s_skip = 0 | endif'
400328da0dcSBram Moolenaar
401328da0dcSBram Moolenaar    let stopline = max([0, c_lnum - g:tex_max_scan_line])
402328da0dcSBram Moolenaar
403328da0dcSBram Moolenaar    " Limit the search time to 300 msec to avoid a hang on very long lines.
404328da0dcSBram Moolenaar    " This fails when a timeout is not supported.
405328da0dcSBram Moolenaar    try
406328da0dcSBram Moolenaar        let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 100)
407328da0dcSBram Moolenaar    catch /E118/
408328da0dcSBram Moolenaar    endtry
409328da0dcSBram Moolenaar
410328da0dcSBram Moolenaar    call winrestview(save_cursor)
411328da0dcSBram Moolenaar
412328da0dcSBram Moolenaar    if m_lnum > 0
413328da0dcSBram Moolenaar        let line = getline(m_lnum)
414328da0dcSBram Moolenaar        return strlen(line) == m_col
415328da0dcSBram Moolenaar    endif
416328da0dcSBram Moolenaar
417328da0dcSBram Moolenaar    return 0
418eb3dc87fSBram Moolenaarendfunction "}}}
419eb3dc87fSBram Moolenaar
420b6b046b2SBram Moolenaarlet &cpo = s:cpo_save
421b6b046b2SBram Moolenaarunlet s:cpo_save
422b6b046b2SBram Moolenaar
423f1568ecaSBram Moolenaar" vim: set sw=4 textwidth=80:
424