diff options
Diffstat (limited to 'runtime/indent')
-rw-r--r-- | runtime/indent/php.vim | 126 | ||||
-rw-r--r-- | runtime/indent/sh.vim | 11 | ||||
-rw-r--r-- | runtime/indent/xml.vim | 31 |
3 files changed, 115 insertions, 53 deletions
diff --git a/runtime/indent/php.vim b/runtime/indent/php.vim index 5dee6c9f47..67a1327dc9 100644 --- a/runtime/indent/php.vim +++ b/runtime/indent/php.vim @@ -1,10 +1,10 @@ " Vim indent file " Language: PHP -" Author: John Wellesz <John.wellesz (AT) teaser (DOT) fr> -" URL: http://www.2072productions.com/vim/indent/php.vim +" Author: John Wellesz <John.wellesz (AT) gmail (DOT) com> +" URL: https://www.2072productions.com/vim/indent/php.vim " Home: https://github.com/2072/PHP-Indenting-for-VIm -" Last Change: 2018 May 18th -" Version: 1.66 +" Last Change: 2019 Jully 21st +" Version: 1.70 " " " Type :help php-indent for available options @@ -19,7 +19,7 @@ " NOTE: This script must be used with PHP syntax ON and with the php syntax " script by Lutz Eymers (http://www.isp.de/data/php.vim ) or with the -" script by Peter Hodge (http://www.vim.org/scripts/script.php?script_id=1571 ) +" script by Peter Hodge (https://www.vim.org/scripts/script.php?script_id=1571 ) " the later is bunbdled by default with Vim 7. " " @@ -41,7 +41,6 @@ " silently remove them when VIM load this script (at each bufread). - if exists("b:did_indent") finish endif @@ -95,7 +94,17 @@ else let b:PHP_vintage_case_default_indent = 0 endif +if exists("PHP_IndentFunctionCallParameters") + let b:PHP_IndentFunctionCallParameters = PHP_IndentFunctionCallParameters +else + let b:PHP_IndentFunctionCallParameters = 0 +endif +if exists("PHP_IndentFunctionDeclarationParameters") + let b:PHP_IndentFunctionDeclarationParameters = PHP_IndentFunctionDeclarationParameters +else + let b:PHP_IndentFunctionDeclarationParameters = 0 +endif let b:PHP_lastindented = 0 let b:PHP_indentbeforelast = 0 @@ -129,15 +138,19 @@ endif if exists("*GetPhpIndent") call ResetPhpOptions() - finish + finish " XXX -- comment this line for easy dev endif -let s:PHP_validVariable = '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' -let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|die\|else\)' -let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|\%(}\s*\)\?else\>\|do\>\|while\>\|switch\>\|case\>\|default\>\|for\%(each\)\=\>\|declare\>\|class\>\|trait\>\|use\>\|interface\>\|abstract\>\|final\>\|try\>\|\%(}\s*\)\=catch\>\|\%(}\s*\)\=finally\>\)' -let s:functionDecl = '\<function\>\%(\s\+&\='.s:PHP_validVariable.'\)\=\s*(.*' let s:endline = '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$' +let s:PHP_validVariable = '[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*' +let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|die\|else\|end\%(if\|while\|for\|foreach\|switch\)\)' +let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|\%(}\s*\)\?else\>\|do\>\|while\>\|switch\>\|case\>\|default\>\|for\%(each\)\=\>\|declare\>\|class\>\|trait\>\|\%()\s*\)\=use\>\|interface\>\|abstract\>\|final\>\|try\>\|\%(}\s*\)\=catch\>\|\%(}\s*\)\=finally\>\)' +let s:functionDeclPrefix = '\<function\>\%(\s\+&\='.s:PHP_validVariable.'\)\=\s*(' +let s:functionDecl = s:functionDeclPrefix.'.*' +let s:multilineFunctionDecl = s:functionDeclPrefix.s:endline +let s:arrayDecl = '\<array\>\s*(.*' +let s:multilineFunctionCall = s:PHP_validVariable.'\s*('.s:endline let s:unstated = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.s:endline @@ -210,7 +223,7 @@ function! GetLastRealCodeLNum(startline) " {{{ while getline(lnum) !~? tofind && lnum > 1 let lnum = lnum - 1 endwhile - elseif lastline =~ '^[^''"`]*[''"`][;,]'.s:endline + elseif lastline =~ '^\s*[''"`][;,]' || (lastline =~ '^[^''"`]*[''"`][;,]'.s:endline && IslinePHP(lnum, "") == "SpecStringEntrails") let tofind=substitute( lastline, '^.*\([''"`]\)[;,].*$', '^[^\1]\\+[\1]$\\|^[^\1]\\+[=([]\\s*[\1]', '') let trylnum = lnum @@ -289,17 +302,23 @@ function! FindOpenBracket(lnum, blockStarter) " {{{ endfun " }}} let s:blockChars = {'{':1, '[': 1, '(': 1, ')':-1, ']':-1, '}':-1} +let s:blockCharsLUT = {'{':'{', '}':'{', '[':'[', ']':'[', '(':'(', ')':'('} function! BalanceDirection (str) - let balance = 0 + let balance = {'{':0, '[': 0, '(': 0, 'none':0} + let director = 'none' for c in split(a:str, '\zs') if has_key(s:blockChars, c) - let balance += s:blockChars[c] + let balance[s:blockCharsLUT[c]] += s:blockChars[c] + + if balance[s:blockCharsLUT[c]] + let director = s:blockCharsLUT[c] + endif endif endfor - return balance + return balance[director] endfun function! StripEndlineComments (line) @@ -308,7 +327,8 @@ endfun function! FindArrowIndent (lnum) " {{{ - let parrentArrowPos = 0 + let parrentArrowPos = -1 + let cursorPos = -1 let lnum = a:lnum while lnum > 1 let last_line = getline(lnum) @@ -316,31 +336,46 @@ function! FindArrowIndent (lnum) " {{{ let parrentArrowPos = indent(a:lnum) break else - call cursor(lnum, 1) - let cleanedLnum = StripEndlineComments(last_line) - if cleanedLnum =~ '->' - if ! b:PHP_noArrowMatching - let parrentArrowPos = searchpos('->', 'W', lnum)[1] - 1 - else - let parrentArrowPos = indent(lnum) + shiftwidth() - endif + + if b:PHP_noArrowMatching break - elseif cleanedLnum =~ ')'.s:endline && BalanceDirection(last_line) < 0 - call searchpos(')'.s:endline, 'cW', lnum) - let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()') - if openedparent != lnum - let lnum = openedparent + endif + + let cleanedLnum = StripEndlineComments(last_line) + + if cleanedLnum =~ ')'.s:endline + if BalanceDirection(cleanedLnum) <= 0 + call cursor(lnum, 1) + call searchpos(')'.s:endline, 'cW', lnum) + let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()') + let cursorPos = col(".") + if openedparent != lnum + let lnum = openedparent + continue + else + endif else - let openedparent = -1 - endif + let parrentArrowPos = -1 + break + end + endif + + if cleanedLnum =~ '->' + call cursor(lnum, cursorPos == -1 ? strwidth(cleanedLnum) : cursorPos) + let parrentArrowPos = searchpos('->', 'cWb', lnum)[1] - 1 + break else - let parrentArrowPos = indent(lnum) + shiftwidth() + let parrentArrowPos = -1 break endif endif endwhile + if parrentArrowPos == -1 + let parrentArrowPos = indent(lnum) + shiftwidth() + end + return parrentArrowPos endfun "}}} @@ -432,7 +467,7 @@ function! IslinePHP (lnum, tofind) " {{{ let synname = synIDattr(synID(a:lnum, coltotest, 0), "name") if synname ==? 'phpStringSingle' || synname ==? 'phpStringDouble' || synname ==? 'phpBacktick' - if cline !~ '^\s*[''"`]' + if cline !~ '^\s*[''"`]' " ??? XXX return "SpecStringEntrails" else return synname @@ -471,7 +506,7 @@ endfunc call ResetPhpOptions() function! GetPhpIndentVersion() - return "1.66-bundle" + return "1.70-bundle" endfun function! GetPhpIndent() @@ -615,7 +650,7 @@ function! GetPhpIndent() let b:InPHPcode_and_script = 1 endif - elseif last_line =~ '^[^''"`]\+[''"`]$' " a string identifier with nothing after it and no other string identifier before + elseif last_line =~ '^[^''"`]\+[''"`]$' && last_line !~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)' " a string identifier with nothing after it and no other string identifier before let b:InPHPcode = -1 let b:InPHPcode_tofind = substitute( last_line, '^.*\([''"`]\).*$', '^[^\1]*\1[;,]$', '') elseif last_line =~? '<<<\s*[''"]\=\a\w*[''"]\=$' @@ -723,7 +758,7 @@ function! GetPhpIndent() endif - if last_line =~ '[;}]'.endline && last_line !~ '^[)\]]' && last_line !~# s:defaultORcase + if last_line =~ '[;}]'.endline && last_line !~ '^[)\]]' && last_line !~# s:defaultORcase && last_line !~ '^\s*[''"`][;,]' if ind==b:PHP_default_indenting return b:PHP_default_indenting + addSpecial elseif b:PHP_indentinghuge && ind==b:PHP_CurrentIndentLevel && cline !~# '^\s*\%(else\|\%(case\|default\).*:\|[})];\=\)' && last_line !~# '^\s*\%(\%(}\s*\)\=else\)' && getline(GetLastRealCodeLNum(lnum - 1))=~';'.endline @@ -869,6 +904,14 @@ function! GetPhpIndent() let ind = ind + shiftwidth() endif + if b:PHP_IndentFunctionCallParameters && last_line =~ s:multilineFunctionCall && last_line !~ s:structureHead && last_line !~ s:arrayDecl + let ind = ind + b:PHP_IndentFunctionCallParameters * shiftwidth() + endif + + if b:PHP_IndentFunctionDeclarationParameters && last_line =~ s:multilineFunctionDecl + let ind = ind + b:PHP_IndentFunctionDeclarationParameters * shiftwidth() + endif + if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1 let b:PHP_CurrentIndentLevel = ind @@ -897,10 +940,15 @@ function! GetPhpIndent() endif if cline =~ '^\s*[)\]];\=' - let ind = ind - shiftwidth() - endif + call cursor(v:lnum, 1) + call searchpos('[)\]]', 'cW') + let matchedBlockChar = cline[col('.')-1] + let openedparent = searchpair('\M'.s:blockCharsLUT[matchedBlockChar], '', '\M'.matchedBlockChar, 'bW', 'Skippmatch()') + if openedparent != v:lnum + let ind = indent(openedparent) + endif - if last_line =~ '^\s*->' && last_line !~? s:structureHead && BalanceDirection(last_line) <= 0 + elseif last_line =~ '^\s*->' && last_line !~? s:structureHead && BalanceDirection(last_line) <= 0 let ind = ind - shiftwidth() endif diff --git a/runtime/indent/sh.vim b/runtime/indent/sh.vim index 148a86ed67..3df6abbf97 100644 --- a/runtime/indent/sh.vim +++ b/runtime/indent/sh.vim @@ -3,10 +3,13 @@ " Maintainer: Christian Brabandt <cb@256bit.org> " Original Author: Nikolai Weibull <now@bitwi.se> " Previous Maintainer: Peter Aronoff <telemachus@arpinum.org> -" Latest Revision: 2019-04-27 +" Latest Revision: 2019-07-26 " License: Vim (see :h license) " Repository: https://github.com/chrisbra/vim-sh-indent " Changelog: +" 20190726 - Correctly skip if keywords in syntax comments +" (issue #17) +" 20190603 - Do not indent in zsh filetypes with an `if` in comments " 20190428 - De-indent fi correctly when typing with " https://github.com/chrisbra/vim-sh-indent/issues/15 " 20190325 - Indent fi; correctly @@ -80,8 +83,9 @@ function! GetShIndent() let ind = indent(lnum) " Check contents of previous lines + " should not apply to e.g. commented 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\)\>') + \ (&ft is# 'zsh' && line =~ '^\s*\<\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\|foreach\)\>') if !s:is_end_expression(line) let ind += s:indent_value('default') endif @@ -129,7 +133,8 @@ function! GetShIndent() " Current line is a endif line, so get indent from start of "if condition" line " TODO: should we do the same for other "end" lines? if curline =~ '^\s*\%(fi\);\?\s*\%(#.*\)\=$' - let previous_line = searchpair('\<if\>', '', '\<fi\>\zs', 'bnW') + let ind = indent(v:lnum) + let previous_line = searchpair('\<if\>', '', '\<fi\>\zs', 'bnW', 'synIDattr(synID(line("."),col("."), 1),"name") =~? "comment"') if previous_line > 0 let ind = indent(previous_line) endif diff --git a/runtime/indent/xml.vim b/runtime/indent/xml.vim index ad22de1d50..883af98563 100644 --- a/runtime/indent/xml.vim +++ b/runtime/indent/xml.vim @@ -1,9 +1,10 @@ " Language: xml " Repository: https://github.com/chrisbra/vim-xml-ftplugin -" Last Changed: Feb 04, 2019 +" Last Changed: July 27, 2019 " Maintainer: Christian Brabandt <cb@256bit.org> " Previous Maintainer: Johannes Zellner <johannes@zellner.org> " Last Change: +" 20190726 - Correctly handle non-tagged data " 20190204 - correctly handle wrap tags " https://github.com/chrisbra/vim-xml-ftplugin/issues/5 " 20190128 - Make sure to find previous tag @@ -33,6 +34,8 @@ set cpo&vim " Attention: Parameter use_syntax_check is used by the docbk.vim indent script setlocal indentexpr=XmlIndentGet(v:lnum,1) setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,},!^F +" autoindent: used when the indentexpr returns -1 +setlocal autoindent if !exists('b:xml_indent_open') let b:xml_indent_open = '.\{-}<[:A-Z_a-z]' @@ -103,37 +106,43 @@ fun! XmlIndentGet(lnum, use_syntax_check) return 0 endif " Find previous line with a tag (regardless whether open or closed, - " but always start restrict the match to a line before the current one + " but always restrict the match to a line before the current one " Note: xml declaration: <?xml version="1.0"?> " won't be found, as it is not a legal tag name - let ptag_pattern = '\%(.\{-}<[/:A-Z_a-z]\)'. '\%(\&\%<'. line('.').'l\)' + let ptag_pattern = '\%(.\{-}<[/:A-Z_a-z]\)'. '\%(\&\%<'. a:lnum .'l\)' let ptag = search(ptag_pattern, 'bnW') " no previous tag if ptag == 0 return 0 endif - let syn_name = '' + let pline = getline(ptag) + let pind = indent(ptag) + + let syn_name_start = '' " Syntax element at start of line (excluding whitespace) + let syn_name_end = '' " Syntax element at end of line + let curline = getline(a:lnum) if a:use_syntax_check let check_lnum = <SID>XmlIndentSynCheck(ptag) let check_alnum = <SID>XmlIndentSynCheck(a:lnum) if check_lnum == 0 || check_alnum == 0 return indent(a:lnum) endif - let syn_name = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name') + let syn_name_end = synIDattr(synID(a:lnum, strlen(curline) - 1, 1), 'name') + let syn_name_start = synIDattr(synID(a:lnum, match(curline, '\S') + 1, 1), 'name') endif - if syn_name =~ 'Comment' + if syn_name_end =~ 'Comment' && syn_name_start =~ 'Comment' return <SID>XmlIndentComment(a:lnum) + elseif empty(syn_name_start) && empty(syn_name_end) + " non-xml tag content: use indent from 'autoindent' + return pind + shiftwidth() endif - let pline = getline(ptag) - let pind = indent(ptag) " Get indent from previous tag line let ind = <SID>XmlIndentSum(pline, -1, pind) - let t_ind = ind " Determine indent from current line - let ind = <SID>XmlIndentSum(getline(a:lnum), 0, ind) + let ind = <SID>XmlIndentSum(curline, 0, ind) return ind endfun @@ -148,7 +157,7 @@ func! <SID>HasNoTagEnd(line) endfunc " return indent for a commented line, -" the middle part might be indented on additional level +" the middle part might be indented one additional level func! <SID>XmlIndentComment(lnum) let ptagopen = search(b:xml_indent_open, 'bnW') let ptagclose = search(b:xml_indent_close, 'bnW') |