From 7db25fed5de1be922b8cbb0328149469606a0424 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Sun, 13 May 2018 00:02:36 +0200 Subject: Update runtime files. --- runtime/indent/sh.vim | 79 +++++++++++++++++--- runtime/indent/tex.vim | 199 +++++++++++++++++-------------------------------- 2 files changed, 137 insertions(+), 141 deletions(-) (limited to 'runtime/indent') diff --git a/runtime/indent/sh.vim b/runtime/indent/sh.vim index fd9a6a9c92..2a9688a4d7 100644 --- a/runtime/indent/sh.vim +++ b/runtime/indent/sh.vim @@ -3,7 +3,7 @@ " Maintainer: Christian Brabandt " Previous Maintainer: Peter Aronoff " Original Author: Nikolai Weibull -" Latest Revision: 2017-08-08 +" Latest Revision: 2018-05-12 " License: Vim (see :h license) " Repository: https://github.com/chrisbra/vim-sh-indent " Changelog: @@ -59,12 +59,15 @@ function! GetShIndent() if lnum == 0 return 0 endif + let line = getline(lnum) let pnum = prevnonblank(lnum - 1) - + let pline = getline(pnum) let ind = indent(lnum) - let line = getline(lnum) - if line =~ '^\s*\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>' + + " Check contents of previous lines + if line =~ '^\s*\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>' || + \ (&ft is# 'zsh' && line =~ '\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>') if line !~ '\<\%(fi\|esac\|done\|end\)\>\s*\%(#.*\)\=$' let ind += s:indent_value('default') endif @@ -72,21 +75,35 @@ function! GetShIndent() if !s:is_case_ended(line) let ind += s:indent_value('case-statements') endif - elseif line =~ '^\s*\<\k\+\>\s*()\s*{' || line =~ '^\s*{' || line =~ '^\s*function\s*\w\S\+\s*\%(()\)\?\s*{' + " function definition + elseif s:is_function_definition(line) if line !~ '}\s*\%(#.*\)\=$' let ind += s:indent_value('default') endif elseif s:is_continuation_line(line) - if pnum == 0 || !s:is_continuation_line(getline(pnum)) + if pnum == 0 || !s:is_continuation_line(pline) let ind += s:indent_value('continuation-line') endif - elseif pnum != 0 && s:is_continuation_line(getline(pnum)) - let ind = indent(s:find_continued_lnum(pnum)) + elseif s:end_block(line) && !s:start_block(line) + let ind -= s:indent_value('default') + elseif pnum != 0 && s:is_continuation_line(pline) && !s:end_block(getline(v:lnum)) + " only add indent, if line and pline is in the same block + let i = v:lnum + let ind2 = indent(s:find_continued_lnum(pnum)) + while !s:is_empty(getline(i)) && i > pnum + let i -= 1 + endw + if i == pnum + let ind += ind2 + else + let ind = ind2 + endif endif let pine = line + " Check content of current line let line = getline(v:lnum) - if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\|end\)\>' || line =~ '^\s*}' + if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\|end\)\>' || s:end_block(line) let ind -= s:indent_value('default') elseif line =~ '^\s*esac\>' && s:is_case_empty(getline(v:lnum - 1)) let ind -= s:indent_value('default') @@ -112,14 +129,24 @@ function! GetShIndent() " statements, executed within a here document. Keep the current indent elseif match(map(synstack(v:lnum, 1), 'synIDattr(v:val, "name")'), '\c\mheredoc') > -1 return indent(v:lnum) + elseif s:is_comment(line) && s:is_empty(getline(v:lnum-1)) + return indent(v:lnum) endif - return ind + return ind > 0 ? ind : 0 endfunction function! s:is_continuation_line(line) - return a:line =~ '\%(\%(^\|[^\\]\)\\\|&&\|||\||\)' . + " Comment, cannot be a line continuation + if a:line =~ '^\s*#' + return 0 + else + " start-of-line + " \\ or && or || or | + " followed optionally by { or # + return a:line =~ '\%(\%(^\|[^\\]\)\\\|&&\|||\||\)' . \ '\s*\({\s*\)\=\(#.*\)\=$' + endif endfunction function! s:find_continued_lnum(lnum) @@ -130,6 +157,12 @@ function! s:find_continued_lnum(lnum) return i endfunction +function! s:is_function_definition(line) + return a:line =~ '^\s*\<\k\+\>\s*()\s*{' || + \ a:line =~ '^\s*{' || + \ a:line =~ '^\s*function\s*\w\S\+\s*\%(()\)\?\s*{' +endfunction + function! s:is_case_label(line, pnum) if a:line !~ '^\s*(\=.*)' return 0 @@ -195,5 +228,29 @@ function! s:escape(pattern) return '\V'. escape(a:pattern, '\\') endfunction +function! s:is_empty(line) + return a:line =~ '^\s*$' +endfunction + +function! s:end_block(line) + return a:line =~ '^\s*}' +endfunction + +function! s:start_block(line) + return a:line =~ '{\s*\(#.*\)\?$' +endfunction + +function! s:find_start_block(lnum) + let i = a:lnum + while i > 1 && !s:start_block(getline(i)) + let i -= 1 + endwhile + return i +endfunction + +function! s:is_comment(line) + return a:line =~ '^\s*#' +endfunction + let &cpo = s:cpo_save unlet s:cpo_save diff --git a/runtime/indent/tex.vim b/runtime/indent/tex.vim index a748cfbb40..119a66c1b8 100644 --- a/runtime/indent/tex.vim +++ b/runtime/indent/tex.vim @@ -1,12 +1,16 @@ -" Vim indent file -" Language: LaTeX -" Maintainer: Yichao Zhou -" Created: Sat, 16 Feb 2002 16:50:19 +0100 -" Version: 1.0.0 +" Vim indent file for TeX +" Language: TeX +" Maintainer: Christian Brabandt +" Previous Maintainer: YiChao Zhou +" Latest Revision: 2017-05-03 +" Version: 0.9.3 +" Repository: https://github.com/chrisbra/vim-tex-indent +" Documention: :h ft-tex-indent +" Created: Sat, 16 Feb 2002 16:50:19 +0100 " Please email me if you found something I can do. Comments, bug report and " feature request are welcome. -" Last Update: {{{ +" Last Update: {{{1 " 25th Sep 2002, by LH : " (*) better support for the option " (*) use some regex instead of several '||'. @@ -15,122 +19,64 @@ " 2005/06/15, Moshe Kaminsky " (*) New variables: " g:tex_items, g:tex_itemize_env, g:tex_noindent_env -" 2011/3/6, by Yichao Zhou +" 2011/3/6, by Zhou YiChao " (*) 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 -" 2011/9/25, by Yichao Zhou +" 2011/9/25, by Zhou Yichao " (*) Bug fix: smartindent-like indent for "[]" " (*) New features: Align with "&". " (*) New variable: g:tex_indent_and. -" 2011/10/23 by Yichao Zhou +" 2011/10/23 by Zhou Yichao " (*) Bug fix: improve the smartindent-like indent for "{}" and " "[]". -" 2012/02/27 by Yichao Zhou +" 2012/02/27 by Zhou Yichao " (*) Bug fix: support default folding marker. " (*) Indent with "&" is not very handy. Make it not enable by " default. -" 2012/03/06 by Yichao Zhou +" 2012/03/06 by Zhou Yichao " (*) Modify "&" behavior and make it default again. Now "&" " won't align when there are more then one "&" in the previous " line. " (*) Add indent "\left(" and "\right)" " (*) Trust user when in "verbatim" and "lstlisting" -" 2012/03/11 by Yichao Zhou +" 2012/03/11 by Zhou Yichao " (*) Modify "&" so that only indent when current line start with " "&". -" 2012/03/12 by Yichao Zhou +" 2012/03/12 by Zhou Yichao " (*) Modify indentkeys. -" 2012/03/18 by Yichao Zhou +" 2012/03/18 by Zhou Yichao " (*) Add &cpo -" 2013/05/02 by Yichao Zhou +" 2013/05/02 by Zhou Yichao " (*) Fix problem about GetTeXIndent checker. Thank Albert Netymk " for reporting this. -" 2014/06/23 by Yichao Zhou +" 2014/06/23 by Zhou Yichao " (*) Remove the feature g:tex_indent_and because it is buggy. " (*) If there is not any obvious indentation hints, we do not " alert our user's current indentation. " (*) g:tex_indent_brace now only works if the open brace is the " last character of that line. -" 2014/08/03 by Yichao Zhou +" 2014/08/03 by Zhou Yichao " (*) Indent current line if last line has larger indentation -" 2016/11/08 by Yichao Zhou -" (*) Fix problems for \[ and \]. Thanks Bruno for reporting. -" 2017/04/30 by Yichao Zhou -" (*) Fix a bug between g:tex_noindent_env and g:tex_indent_items -" Now g:tex_noindent_env='document\|verbatim\|itemize' (Emacs -" style) is supported. Thanks Miles Wheeler for reporting. -" 2018/02/07 by Yichao Zhou -" (*) Make indentation more smart in the normal mode +" 2014/08/09 by Zhou Yichao +" (*) Add missing return value for s:GetEndIndentation(...) +" 2017/05/02: new maintainer Christian Brabandt +" 2017/05/02: use shiftwidth() function +" 2017/05/02: do not add indent when environment starts and ends +" at previous line +" 2017/05/03: release 0.9.3 submitted for inclusion with Vim " " }}} - -" Document: {{{ -" -" 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 "[]". Now this only works if the open brace is the last -" character of that line. -" -" % Example 1 -" \usetikzlibrary{ -" external -" } -" -" % Example 2 -" \tikzexternalize[ -" prefix=tikz] -" -" * 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. -" -" 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'. -" }}} - -" Only define the function once +" Only define the function once {{{1 if exists("b:did_indent") finish endif let s:cpo_save = &cpo set cpo&vim - -" Define global variable {{{ - +" Define global variable {{{1 let b:did_indent = 1 if !exists("g:tex_indent_items") @@ -147,7 +93,7 @@ if g:tex_indent_items let g:tex_itemize_env = 'itemize\|description\|enumerate\|thebibliography' endif if !exists('g:tex_items') - let g:tex_items = '\\bibitem\|\\item' + let g:tex_items = '\\bibitem\|\\item' endif else let g:tex_items = '' @@ -156,17 +102,17 @@ endif if !exists("g:tex_noindent_env") let g:tex_noindent_env = 'document\|verbatim\|lstlisting' endif "}}} - -" VIM Setting " {{{ +" VIM Setting " {{{1 setlocal autoindent setlocal nosmartindent setlocal indentexpr=GetTeXIndent() setlocal indentkeys& exec 'setlocal indentkeys+=[,(,{,),},],\&' . substitute(g:tex_items, '^\|\(\\|\)', ',=', 'g') let g:tex_items = '^\s*' . substitute(g:tex_items, '^\(\^\\s\*\)*', '', '') -" }}} -function! GetTeXIndent() " {{{ +let b:undo_indent = 'setlocal indentexpr< indentkeys< smartindent< autoindent<' +" }}} +function! GetTeXIndent() " {{{1 " Find a non-blank line above the current line. let lnum = prevnonblank(v:lnum - 1) let cnum = v:lnum @@ -178,7 +124,7 @@ function! GetTeXIndent() " {{{ " At the start of the file use zero indent. if lnum == 0 - return 0 + return 0 endif let line = substitute(getline(lnum), '\s*%.*', '','g') " last line @@ -192,9 +138,9 @@ function! GetTeXIndent() " {{{ return indent(v:lnum) end endif - + if lnum == 0 - return 0 + return 0 endif let ind = indent(lnum) @@ -205,16 +151,12 @@ function! GetTeXIndent() " {{{ return indent(v:lnum) endif - " Add a 'shiftwidth' after beginning of environments. - " Don't add it for \begin{document} and \begin{verbatim} - " if line =~ '^\s*\\begin{\(.*\)}' && line !~ 'verbatim' - " LH modification : \begin does not always start a line - " ZYC modification : \end after \begin won't cause wrong indent anymore - if line =~ '\\begin{.*}' - if line !~ g:tex_noindent_env - let ind = ind + shiftwidth() - let stay = 0 - endif + " Add a 'shiftwidth' after beginning of environments + " But don't do it for g:tex_noindent_env or when it also ends at the + " previous line. + if line =~ '\\begin{.*}' && line !~ '\\end{.*}' && line !~ g:tex_noindent_env + let ind = ind + shiftwidth() + let stay = 0 if g:tex_indent_items " Add another sw for item-environments @@ -248,27 +190,29 @@ function! GetTeXIndent() " {{{ endif if g:tex_indent_brace - if line =~ '[[{]$' + let char = line[strlen(line)-1] + if char == '[' || char == '{' let ind += shiftwidth() let stay = 0 endif - if cline =~ '^\s*\\\?[\]}]' && s:CheckPairedIsLastCharacter(v:lnum, indent(v:lnum)) + let cind = indent(v:lnum) + let char = cline[cind] + if (char == ']' || char == '}') && + \ s:CheckPairedIsLastCharacter(v:lnum, cind) let ind -= shiftwidth() let stay = 0 endif - if line !~ '^\s*\\\?[\]}]' - for i in range(indent(lnum)+1, strlen(line)-1) - let char = line[i] - if char == ']' || char == '}' - if s:CheckPairedIsLastCharacter(lnum, i) - let ind -= shiftwidth() - let stay = 0 - endif + for i in range(indent(lnum)+1, strlen(line)-1) + let char = line[i] + if char == ']' || char == '}' + if s:CheckPairedIsLastCharacter(lnum, i) + let ind -= shiftwidth() + let stay = 0 endif - endfor - endif + endif + endfor endif " Special treatment for 'item' @@ -287,9 +231,8 @@ function! GetTeXIndent() " {{{ endif endif - if stay && mode() == 'i' - " If there is no obvious indentation hint, and indentation is triggered - " in insert mode, we trust our user. + if stay + " If there is no obvious indentation hint, we trust our user. if empty(cline) return ind else @@ -299,8 +242,7 @@ function! GetTeXIndent() " {{{ return ind endif endfunction "}}} - -function! s:GetLastBeginIndentation(lnum) " {{{ +function! s:GetLastBeginIndentation(lnum) " {{{1 let matchend = 1 for lnum in range(a:lnum-1, max([a:lnum - g:tex_max_scan_line, 1]), -1) let line = getline(lnum) @@ -311,19 +253,19 @@ function! s:GetLastBeginIndentation(lnum) " {{{ let matchend -= 1 endif if matchend == 0 - if line =~ g:tex_noindent_env - return indent(lnum) - endif if line =~ g:tex_itemize_env return indent(lnum) + 2 * shiftwidth() endif + if line =~ g:tex_noindent_env + return indent(lnum) + endif return indent(lnum) + shiftwidth() endif endfor return -1 endfunction -function! s:GetEndIndentation(lnum) " {{{ +function! s:GetEndIndentation(lnum) " {{{1 if getline(a:lnum) =~ '\\begin{.*}.*\\end{.*}' return -1 endif @@ -350,15 +292,12 @@ endfunction " Most of the code is from matchparen.vim function! s:CheckPairedIsLastCharacter(lnum, col) "{{{ + " Get the character under the cursor and check if it's in 'matchpairs'. let c_lnum = a:lnum let c_col = a:col+1 - let line = getline(c_lnum) - if line[c_col-1] == '\' - let c_col = c_col + 1 - endif - let c = line[c_col-1] + let c = getline(c_lnum)[c_col-1] let plist = split(&matchpairs, '.\zs[:,]') let i = index(plist, c) if i < 0 @@ -407,8 +346,8 @@ function! s:CheckPairedIsLastCharacter(lnum, col) "{{{ endif return 0 -endfunction "}}} - +endfunction +" Reset cpo setting {{{1 let &cpo = s:cpo_save unlet s:cpo_save -- cgit v1.2.3