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