diff options
Diffstat (limited to 'indent')
121 files changed, 14 insertions, 17052 deletions
diff --git a/indent/aap.vim b/indent/aap.vim deleted file mode 100644 index cddf5225..00000000 --- a/indent/aap.vim +++ /dev/null @@ -1,16 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Aap recipe -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2005 Jun 24 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Works mostly like Python. -runtime! indent/python.vim - -endif diff --git a/indent/ada.vim b/indent/ada.vim deleted file mode 100644 index 76d2395a..00000000 --- a/indent/ada.vim +++ /dev/null @@ -1,312 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -"------------------------------------------------------------------------------ -" Description: Vim Ada indent file -" Language: Ada (2005) -" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $ -" Copyright: Copyright (C) 2006 Martin Krischik -" Maintainer: Martin Krischik <krischik@users.sourceforge.net> -" Neil Bird <neil@fnxweb.com> -" Ned Okie <nokie@radford.edu> -" $Author: krischik $ -" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $ -" Version: 4.6 -" $Revision: 887 $ -" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $ -" History: 24.05.2006 MK Unified Headers -" 16.07.2006 MK Ada-Mode as vim-ball -" 15.10.2006 MK Bram's suggestion for runtime integration -" 05.11.2006 MK Bram suggested to save on spaces -" 19.09.2007 NO g: missing before ada#Comment -" Help Page: ft-vim-indent -"------------------------------------------------------------------------------ -" ToDo: -" Verify handling of multi-line exprs. and recovery upon the final ';'. -" Correctly find comments given '"' and "" ==> " syntax. -" Combine the two large block-indent functions into one? -"------------------------------------------------------------------------------ - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") || version < 700 - finish -endif - -let b:did_indent = 45 - -setlocal indentexpr=GetAdaIndent() -setlocal indentkeys-=0{,0} -setlocal indentkeys+=0=~then,0=~end,0=~elsif,0=~when,0=~exception,0=~begin,0=~is,0=~record - -" Only define the functions once. -if exists("*GetAdaIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -if exists("g:ada_with_gnat_project_files") - let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\<is\>[^;]*$\|\(type\>.*\)\=\<record\>\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|project\>\|then\>\|when\>\|is\>\)' -else - let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\<is\>[^;]*$\|\(type\>.*\)\=\<record\>\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|then\>\|when\>\|is\>\)' -endif - -" Section: s:MainBlockIndent {{{1 -" -" Try to find indent of the block we're in -" prev_indent = the previous line's indent -" prev_lnum = previous line (to start looking on) -" blockstart = expr. that indicates a possible start of this block -" stop_at = if non-null, if a matching line is found, gives up! -" No recursive previous block analysis: simply look for a valid line -" with a lesser or equal indent than we currently (on prev_lnum) have. -" This shouldn't work as well as it appears to with lines that are currently -" nowhere near the correct indent (e.g., start of line)! -" Seems to work OK as it 'starts' with the indent of the /previous/ line. -function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at) - let lnum = a:prev_lnum - let line = substitute( getline(lnum), g:ada#Comment, '', '' ) - while lnum > 1 - if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent - return a:prev_indent - elseif line =~ '^\s*' . a:blockstart - let ind = indent(lnum) - if ind < a:prev_indent - return ind - endif - endif - - let lnum = prevnonblank(lnum - 1) - " Get previous non-blank/non-comment-only line - while 1 - let line = substitute( getline(lnum), g:ada#Comment, '', '' ) - if line !~ '^\s*$' && line !~ '^\s*#' - break - endif - let lnum = prevnonblank(lnum - 1) - if lnum <= 0 - return a:prev_indent - endif - endwhile - endwhile - " Fallback - just move back one - return a:prev_indent - shiftwidth() -endfunction MainBlockIndent - -" Section: s:EndBlockIndent {{{1 -" -" Try to find indent of the block we're in (and about to complete), -" including handling of nested blocks. Works on the 'end' of a block. -" prev_indent = the previous line's indent -" prev_lnum = previous line (to start looking on) -" blockstart = expr. that indicates a possible start of this block -" blockend = expr. that indicates a possible end of this block -function s:EndBlockIndent( prev_indent, prev_lnum, blockstart, blockend ) - let lnum = a:prev_lnum - let line = getline(lnum) - let ends = 0 - while lnum > 1 - if getline(lnum) =~ '^\s*' . a:blockstart - let ind = indent(lnum) - if ends <= 0 - if ind < a:prev_indent - return ind - endif - else - let ends = ends - 1 - endif - elseif getline(lnum) =~ '^\s*' . a:blockend - let ends = ends + 1 - endif - - let lnum = prevnonblank(lnum - 1) - " Get previous non-blank/non-comment-only line - while 1 - let line = getline(lnum) - let line = substitute( line, g:ada#Comment, '', '' ) - if line !~ '^\s*$' - break - endif - let lnum = prevnonblank(lnum - 1) - if lnum <= 0 - return a:prev_indent - endif - endwhile - endwhile - " Fallback - just move back one - return a:prev_indent - shiftwidth() -endfunction EndBlockIndent - -" Section: s:StatementIndent {{{1 -" -" Return indent of previous statement-start -" (after we've indented due to multi-line statements). -" This time, we start searching on the line *before* the one given (which is -" the end of a statement - we want the previous beginning). -function s:StatementIndent( current_indent, prev_lnum ) - let lnum = a:prev_lnum - while lnum > 0 - let prev_lnum = lnum - let lnum = prevnonblank(lnum - 1) - " Get previous non-blank/non-comment-only line - while 1 - let line = substitute( getline(lnum), g:ada#Comment, '', '' ) - - if line !~ '^\s*$' && line !~ '^\s*#' - break - endif - let lnum = prevnonblank(lnum - 1) - if lnum <= 0 - return a:current_indent - endif - endwhile - " Leave indent alone if our ';' line is part of a ';'-delineated - " aggregate (e.g., procedure args.) or first line after a block start. - if line =~ s:AdaBlockStart || line =~ '(\s*$' - return a:current_indent - endif - if line !~ '[.=(]\s*$' - let ind = indent(prev_lnum) - if ind < a:current_indent - return ind - endif - endif - endwhile - " Fallback - just use current one - return a:current_indent -endfunction StatementIndent - - -" Section: GetAdaIndent {{{1 -" -" Find correct indent of a new line based upon what went before -" -function GetAdaIndent() - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - let ind = indent(lnum) - let package_line = 0 - - " Get previous non-blank/non-comment-only/non-cpp line - while 1 - let line = substitute( getline(lnum), g:ada#Comment, '', '' ) - if line !~ '^\s*$' && line !~ '^\s*#' - break - endif - let lnum = prevnonblank(lnum - 1) - if lnum <= 0 - return ind - endif - endwhile - - " Get default indent (from prev. line) - let ind = indent(lnum) - let initind = ind - - " Now check what's on the previous line - if line =~ s:AdaBlockStart || line =~ '(\s*$' - " Check for false matches to AdaBlockStart - let false_match = 0 - if line =~ '^\s*\(procedure\|function\|package\)\>.*\<is\s*new\>' - " Generic instantiation - let false_match = 1 - elseif line =~ ')\s*;\s*$' || line =~ '^\([^(]*([^)]*)\)*[^(]*;\s*$' - " forward declaration - let false_match = 1 - endif - " Move indent in - if ! false_match - let ind = ind + shiftwidth() - endif - elseif line =~ '^\s*\(case\|exception\)\>' - " Move indent in twice (next 'when' will move back) - let ind = ind + 2 * shiftwidth() - elseif line =~ '^\s*end\s*record\>' - " Move indent back to tallying 'type' preceeding the 'record'. - " Allow indent to be equal to 'end record's. - let ind = s:MainBlockIndent( ind+shiftwidth(), lnum, 'type\>', '' ) - elseif line =~ '\(^\s*new\>.*\)\@<!)\s*[;,]\s*$' - " Revert to indent of line that started this parenthesis pair - exe lnum - exe 'normal! $F)%' - if getline('.') =~ '^\s*(' - " Dire layout - use previous indent (could check for g:ada#Comment here) - let ind = indent( prevnonblank( line('.')-1 ) ) - else - let ind = indent('.') - endif - exe v:lnum - elseif line =~ '[.=(]\s*$' - " A statement continuation - move in one - let ind = ind + shiftwidth() - elseif line =~ '^\s*new\>' - " Multiple line generic instantiation ('package blah is\nnew thingy') - let ind = s:StatementIndent( ind - shiftwidth(), lnum ) - elseif line =~ ';\s*$' - " Statement end (but not 'end' ) - try to find current statement-start indent - let ind = s:StatementIndent( ind, lnum ) - endif - - " Check for potential argument list on next line - let continuation = (line =~ '[A-Za-z0-9_]\s*$') - - - " Check current line; search for simplistic matching start-of-block - let line = getline(v:lnum) - if line =~ '^\s*#' - " Start of line for ada-pp - let ind = 0 - elseif continuation && line =~ '^\s*(' - " Don't do this if we've already indented due to the previous line - if ind == initind - let ind = ind + shiftwidth() - endif - elseif line =~ '^\s*\(begin\|is\)\>' - let ind = s:MainBlockIndent( ind, lnum, '\(procedure\|function\|declare\|package\|task\)\>', 'begin\>' ) - elseif line =~ '^\s*record\>' - let ind = s:MainBlockIndent( ind, lnum, 'type\>\|for\>.*\<use\>', '' ) + shiftwidth() - elseif line =~ '^\s*\(else\|elsif\)\>' - let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) - elseif line =~ '^\s*when\>' - " Align 'when' one /in/ from matching block start - let ind = s:MainBlockIndent( ind, lnum, '\(case\|exception\)\>', '' ) + shiftwidth() - elseif line =~ '^\s*end\>\s*\<if\>' - " End of if statements - let ind = s:EndBlockIndent( ind, lnum, 'if\>', 'end\>\s*\<if\>' ) - elseif line =~ '^\s*end\>\s*\<loop\>' - " End of loops - let ind = s:EndBlockIndent( ind, lnum, '\(\(while\|for\)\>.*\)\?\<loop\>', 'end\>\s*\<loop\>' ) - elseif line =~ '^\s*end\>\s*\<record\>' - " End of records - let ind = s:EndBlockIndent( ind, lnum, '\(type\>.*\)\=\<record\>', 'end\>\s*\<record\>' ) - elseif line =~ '^\s*end\>\s*\<procedure\>' - " End of procedures - let ind = s:EndBlockIndent( ind, lnum, 'procedure\>.*\<is\>', 'end\>\s*\<procedure\>' ) - elseif line =~ '^\s*end\>\s*\<case\>' - " End of case statement - let ind = s:EndBlockIndent( ind, lnum, 'case\>.*\<is\>', 'end\>\s*\<case\>' ) - elseif line =~ '^\s*end\>' - " General case for end - let ind = s:MainBlockIndent( ind, lnum, '\(if\|while\|for\|loop\|accept\|begin\|record\|case\|exception\|package\)\>', '' ) - elseif line =~ '^\s*exception\>' - let ind = s:MainBlockIndent( ind, lnum, 'begin\>', '' ) - elseif line =~ '^\s*then\>' - let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' ) - endif - - return ind -endfunction GetAdaIndent - -let &cpo = s:keepcpo -unlet s:keepcpo - -finish " 1}}} - -"------------------------------------------------------------------------------ -" Copyright (C) 2006 Martin Krischik -" -" Vim is Charityware - see ":help license" or uganda.txt for licence details. -"------------------------------------------------------------------------------ -" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab -" vim: foldmethod=marker - -endif diff --git a/indent/ant.vim b/indent/ant.vim deleted file mode 100644 index b555c6a2..00000000 --- a/indent/ant.vim +++ /dev/null @@ -1,16 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: ANT files -" Maintainer: David Fishburn <fishburn@ianywhere.com> -" Last Change: Thu May 15 2003 10:02:54 PM - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Use XML formatting rules -runtime! indent/xml.vim - -endif diff --git a/indent/automake.vim b/indent/automake.vim deleted file mode 100644 index 3ec6f83c..00000000 --- a/indent/automake.vim +++ /dev/null @@ -1,15 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: automake -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-04-19 - -if exists("b:did_indent") - finish -endif - -" same as makefile indenting for now. -runtime! indent/make.vim - -endif diff --git a/indent/awk.vim b/indent/awk.vim deleted file mode 100644 index 8637dd53..00000000 --- a/indent/awk.vim +++ /dev/null @@ -1,236 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" vim: set sw=3 sts=3: - -" Awk indent script. It can handle multi-line statements and expressions. -" It works up to the point where the distinction between correct/incorrect -" and personal taste gets fuzzy. Drop me an e-mail for bug reports and -" reasonable style suggestions. -" -" Bugs: -" ===== -" - Some syntax errors may cause erratic indentation. -" - Same for very unusual but syntacticly correct use of { } -" - In some cases it's confused by the use of ( and { in strings constants -" - This version likes the closing brace of a multiline pattern-action be on -" character position 1 before the following pattern-action combination is -" formatted - -" Author: -" ======= -" Erik Janssen, ejanssen@itmatters.nl -" -" History: -" ======== -" 26-04-2002 Got initial version working reasonably well -" 29-04-2002 Fixed problems in function headers and max line width -" Added support for two-line if's without curly braces -" Fixed hang: 2011 Aug 31 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -let b:did_indent = 1 - -setlocal indentexpr=GetAwkIndent() -" Mmm, copied from the tcl indent program. Is this okay? -setlocal indentkeys-=:,0# - -" Only define the function once. -if exists("*GetAwkIndent") - finish -endif - -" This function contains a lot of exit points. It checks for simple cases -" first to get out of the function as soon as possible, thereby reducing the -" number of possibilities later on in the difficult parts - -function! GetAwkIndent() - - " Find previous line and get it's indentation - let prev_lineno = s:Get_prev_line( v:lnum ) - if prev_lineno == 0 - return 0 - endif - let prev_data = getline( prev_lineno ) - let ind = indent( prev_lineno ) - - " Increase indent if the previous line contains an opening brace. Search - " for this brace the hard way to prevent errors if the previous line is a - " 'pattern { action }' (simple check match on /{/ increases the indent then) - - if s:Get_brace_balance( prev_data, '{', '}' ) > 0 - return ind + shiftwidth() - endif - - let brace_balance = s:Get_brace_balance( prev_data, '(', ')' ) - - " If prev line has positive brace_balance and starts with a word (keyword - " or function name), align the current line on the first '(' of the prev - " line - - if brace_balance > 0 && s:Starts_with_word( prev_data ) - return s:Safe_indent( ind, s:First_word_len(prev_data), getline(v:lnum)) - endif - - " If this line starts with an open brace bail out now before the line - " continuation checks. - - if getline( v:lnum ) =~ '^\s*{' - return ind - endif - - " If prev line seems to be part of multiline statement: - " 1. Prev line is first line of a multiline statement - " -> attempt to indent on first ' ' or '(' of prev line, just like we - " indented the positive brace balance case above - " 2. Prev line is not first line of a multiline statement - " -> copy indent of prev line - - let continue_mode = s:Seems_continuing( prev_data ) - if continue_mode > 0 - if s:Seems_continuing( getline(s:Get_prev_line( prev_lineno )) ) - " Case 2 - return ind - else - " Case 1 - if continue_mode == 1 - " Need continuation due to comma, backslash, etc - return s:Safe_indent( ind, s:First_word_len(prev_data), getline(v:lnum)) - else - " if/for/while without '{' - return ind + shiftwidth() - endif - endif - endif - - " If the previous line doesn't need continuation on the current line we are - " on the start of a new statement. We have to make sure we align with the - " previous statement instead of just the previous line. This is a bit - " complicated because the previous statement might be multi-line. - " - " The start of a multiline statement can be found by: - " - " 1 If the previous line contains closing braces and has negative brace - " balance, search backwards until cumulative brace balance becomes zero, - " take indent of that line - " 2 If the line before the previous needs continuation search backward - " until that's not the case anymore. Take indent of one line down. - - " Case 1 - if prev_data =~ ')' && brace_balance < 0 - while brace_balance != 0 && prev_lineno > 0 - let prev_lineno = s:Get_prev_line( prev_lineno ) - let prev_data = getline( prev_lineno ) - let brace_balance=brace_balance+s:Get_brace_balance(prev_data,'(',')' ) - endwhile - let ind = indent( prev_lineno ) - else - " Case 2 - if s:Seems_continuing( getline( prev_lineno - 1 ) ) - let prev_lineno = prev_lineno - 2 - let prev_data = getline( prev_lineno ) - while prev_lineno > 0 && (s:Seems_continuing( prev_data ) > 0) - let prev_lineno = s:Get_prev_line( prev_lineno ) - let prev_data = getline( prev_lineno ) - endwhile - let ind = indent( prev_lineno + 1 ) - endif - endif - - " Decrease indent if this line contains a '}'. - if getline(v:lnum) =~ '^\s*}' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -" Find the open and close braces in this line and return how many more open- -" than close braces there are. It's also used to determine cumulative balance -" across multiple lines. - -function! s:Get_brace_balance( line, b_open, b_close ) - let line2 = substitute( a:line, a:b_open, "", "g" ) - let openb = strlen( a:line ) - strlen( line2 ) - let line3 = substitute( line2, a:b_close, "", "g" ) - let closeb = strlen( line2 ) - strlen( line3 ) - return openb - closeb -endfunction - -" Find out whether the line starts with a word (i.e. keyword or function -" call). Might need enhancements here. - -function! s:Starts_with_word( line ) - if a:line =~ '^\s*[a-zA-Z_0-9]\+\s*(' - return 1 - endif - return 0 -endfunction - -" Find the length of the first word in a line. This is used to be able to -" align a line relative to the 'print ' or 'if (' on the previous line in case -" such a statement spans multiple lines. -" Precondition: only to be used on lines where 'Starts_with_word' returns 1. - -function! s:First_word_len( line ) - let white_end = matchend( a:line, '^\s*' ) - if match( a:line, '^\s*func' ) != -1 - let word_end = matchend( a:line, '[a-z]\+\s\+[a-zA-Z_0-9]\+[ (]*' ) - else - let word_end = matchend( a:line, '[a-zA-Z_0-9]\+[ (]*' ) - endif - return word_end - white_end -endfunction - -" Determine if 'line' completes a statement or is continued on the next line. -" This one is far from complete and accepts illegal code. Not important for -" indenting, however. - -function! s:Seems_continuing( line ) - " Unfinished lines - if a:line =~ '\(--\|++\)\s*$' - return 0 - endif - if a:line =~ '[\\,\|\&\+\-\*\%\^]\s*$' - return 1 - endif - " if/for/while (cond) eol - if a:line =~ '^\s*\(if\|while\|for\)\s*(.*)\s*$' || a:line =~ '^\s*else\s*' - return 2 - endif - return 0 -endfunction - -" Get previous relevant line. Search back until a line is that is no -" comment or blank and return the line number - -function! s:Get_prev_line( lineno ) - let lnum = a:lineno - 1 - let data = getline( lnum ) - while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$') - let lnum = lnum - 1 - let data = getline( lnum ) - endwhile - return lnum -endfunction - -" This function checks whether an indented line exceeds a maximum linewidth -" (hardcoded 80). If so and it is possible to stay within 80 positions (or -" limit num of characters beyond linewidth) by decreasing the indent (keeping -" it > base_indent), do so. - -function! s:Safe_indent( base, wordlen, this_line ) - let line_base = matchend( a:this_line, '^\s*' ) - let line_len = strlen( a:this_line ) - line_base - let indent = a:base - if (indent + a:wordlen + line_len) > 80 - " Simple implementation good enough for the time being - let indent = indent + 3 - endif - return indent + a:wordlen -endfunction - -endif diff --git a/indent/bib.vim b/indent/bib.vim deleted file mode 100644 index 413591f6..00000000 --- a/indent/bib.vim +++ /dev/null @@ -1,19 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: BibTeX -" Maintainer: Dorai Sitaram <ds26@gte.com> -" URL: http://www.ccs.neu.edu/~dorai/vimplugins/vimplugins.html -" Last Change: 2005 Mar 28 - -" Only do this when not done yet for this buffer -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal cindent - -let b:undo_indent = "setl cin<" - -endif diff --git a/indent/bst.vim b/indent/bst.vim deleted file mode 100644 index b11924b9..00000000 --- a/indent/bst.vim +++ /dev/null @@ -1,79 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: bst -" Author: Tim Pope <vimNOSPAM@tpope.info> -" $Id: bst.vim,v 1.1 2007/05/05 18:11:12 vimboss Exp $ - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal expandtab -setlocal indentexpr=GetBstIndent(v:lnum) -"setlocal smartindent -setlocal cinkeys& -setlocal cinkeys-=0# -setlocal indentkeys& -"setlocal indentkeys+=0% - -" Only define the function once. -if exists("*GetBstIndent") - finish -endif - -function! s:prevgood(lnum) - " Find a non-blank line above the current line. - " Skip over comments. - let lnum = a:lnum - while lnum > 0 - let lnum = prevnonblank(lnum - 1) - if getline(lnum) !~ '^\s*%.*$' - break - endif - endwhile - return lnum -endfunction - -function! s:strip(lnum) - let line = getline(a:lnum) - let line = substitute(line,'"[^"]*"','""','g') - let line = substitute(line,'%.*','','') - let line = substitute(line,'^\s\+','','') - return line -endfunction - -function! s:count(string,char) - let str = substitute(a:string,'[^'.a:char.']','','g') - return strlen(str) -endfunction - -function! GetBstIndent(lnum) abort - if a:lnum == 1 - return 0 - endif - let lnum = s:prevgood(a:lnum) - if lnum <= 0 - return indent(a:lnum - 1) - endif - let line = s:strip(lnum) - let cline = s:strip(a:lnum) - if cline =~ '^}' && exists("b:current_syntax") - call cursor(a:lnum,indent(a:lnum)) - if searchpair('{','','}','bW',"synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment\\|string'") - if col('.')+1 == col('$') - return indent('.') - else - return virtcol('.')-1 - endif - endif - endif - let fakeline = substitute(line,'^}','','').matchstr(cline,'^}') - let ind = indent(lnum) - let ind = ind + shiftwidth() * s:count(line,'{') - let ind = ind - shiftwidth() * s:count(fakeline,'}') - return ind -endfunction - -endif diff --git a/indent/bzl.vim b/indent/bzl.vim deleted file mode 100644 index 838cf006..00000000 --- a/indent/bzl.vim +++ /dev/null @@ -1,98 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Bazel (http://bazel.io) -" Maintainer: David Barnett (https://github.com/google/vim-ft-bzl) -" Last Change: 2017 Jun 13 - -if exists('b:did_indent') - finish -endif - -" Load base python indent. -if !exists('*GetPythonIndent') - runtime! indent/python.vim -endif - -let b:did_indent = 1 - -" Only enable bzl google indent if python google indent is enabled. -if !get(g:, 'no_google_python_indent') - setlocal indentexpr=GetBzlIndent(v:lnum) -endif - -if exists('*GetBzlIndent') - finish -endif - -let s:save_cpo = &cpo -set cpo-=C - -" Maximum number of lines to look backwards. -let s:maxoff = 50 - -"" -" Determine the correct indent level given an {lnum} in the current buffer. -function GetBzlIndent(lnum) abort - let l:use_recursive_indent = !get(g:, 'no_google_python_recursive_indent') - if l:use_recursive_indent - " Backup and override indent setting variables. - if exists('g:pyindent_nested_paren') - let l:pyindent_nested_paren = g:pyindent_nested_paren - endif - if exists('g:pyindent_open_paren') - let l:pyindent_open_paren = g:pyindent_open_paren - endif - let g:pyindent_nested_paren = 'shiftwidth() * 2' - let g:pyindent_open_paren = 'shiftwidth() * 2' - endif - - let l:indent = -1 - - " Indent inside parens. - " Align with the open paren unless it is at the end of the line. - " E.g. - " open_paren_not_at_EOL(100, - " (200, - " 300), - " 400) - " open_paren_at_EOL( - " 100, 200, 300, 400) - call cursor(a:lnum, 1) - let [l:par_line, l:par_col] = searchpairpos('(\|{\|\[', '', ')\|}\|\]', 'bW', - \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" . - \ " synIDattr(synID(line('.'), col('.'), 1), 'name')" . - \ " =~ '\\(Comment\\|String\\)$'") - if l:par_line > 0 - call cursor(l:par_line, 1) - if l:par_col != col('$') - 1 - let l:indent = l:par_col - endif - endif - - " Delegate the rest to the original function. - if l:indent == -1 - let l:indent = GetPythonIndent(a:lnum) - endif - - if l:use_recursive_indent - " Restore global variables. - if exists('l:pyindent_nested_paren') - let g:pyindent_nested_paren = l:pyindent_nested_paren - else - unlet g:pyindent_nested_paren - endif - if exists('l:pyindent_open_paren') - let g:pyindent_open_paren = l:pyindent_open_paren - else - unlet g:pyindent_open_paren - endif - endif - - return l:indent -endfunction - -let &cpo = s:save_cpo -unlet s:save_cpo - -endif diff --git a/indent/c.vim b/indent/c.vim deleted file mode 100644 index 2237af3e..00000000 --- a/indent/c.vim +++ /dev/null @@ -1,19 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: C -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2005 Mar 27 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" C indenting is built-in, thus this is very simple -setlocal cindent - -let b:undo_indent = "setl cin<" - -endif diff --git a/indent/cdl.vim b/indent/cdl.vim deleted file mode 100644 index 76716666..00000000 --- a/indent/cdl.vim +++ /dev/null @@ -1,133 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Description: Comshare Dimension Definition Language (CDL) -" Author: Raul Segura Acevedo <raulseguraaceved@netscape.net> -" Last Change: Fri Nov 30 13:35:48 2001 CST - -if exists("b:did_indent") - "finish -endif -let b:did_indent = 1 - -setlocal indentexpr=CdlGetIndent(v:lnum) -setlocal indentkeys& -setlocal indentkeys+==~else,=~endif,=~then,;,),= - -" Only define the function once. -if exists("*CdlGetIndent") - "finish -endif - -" find out if an "...=..." expresion is an assignment (or a conditional) -" it scans 'line' first, and then the previos lines -fun! CdlAsignment(lnum, line) - let f = -1 - let lnum = a:lnum - let line = a:line - while lnum > 0 && f == -1 - " line without members [a] of [b]:[c]... - let inicio = 0 - while 1 - " keywords that help to decide - let inicio = matchend(line, '\c\<\(expr\|\a*if\|and\|or\|not\|else\|then\|memberis\|\k\+of\)\>\|[<>;]', inicio) - if inicio < 0 - break - endif - " it's formula if there's a ';', 'elsE', 'theN', 'enDif' or 'expr' - " conditional if there's a '<', '>', 'elseif', 'if', 'and', 'or', 'not', - " 'memberis', 'childrenof' and other \k\+of funcions - let f = line[inicio-1] =~? '[en;]' || strpart(line, inicio-4, 4) =~? 'ndif\|expr' - endw - let lnum = prevnonblank(lnum-1) - let line = substitute(getline(lnum), '\c\(\[[^]]*]\(\s*of\s*\|:\)*\)\+', ' ', 'g') - endw - " if we hit the start of the file then f = -1, return 1 (formula) - return f != 0 -endf - -fun! CdlGetIndent(lnum) - let thisline = getline(a:lnum) - if match(thisline, '^\s*\(\k\+\|\[[^]]*]\)\s*\(,\|;\s*$\)') >= 0 - " it's an attributes line - return shiftwidth() - elseif match(thisline, '^\c\s*\([{}]\|\/[*/]\|dimension\|schedule\|group\|hierarchy\|class\)') >= 0 - " it's a header or '{' or '}' or a comment - return 0 - end - - let lnum = prevnonblank(a:lnum-1) - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - " PREVIOUS LINE - let ind = indent(lnum) - let line = getline(lnum) - let f = -1 " wether a '=' is a conditional or a asignment, -1 means we don't know yet - " one 'closing' element at the beginning of the line has already reduced the - " indent, but 'else', 'elseif' & 'then' increment it for the next line - " '=' at the beginning has already de right indent (increased for asignments) - let inicio = matchend(line, '^\c\s*\(else\a*\|then\|endif\|/[*/]\|[);={]\)') - if inicio > 0 - let c = line[inicio-1] - " ')' and '=' don't change indent and are useless to set 'f' - if c == '{' - return shiftwidth() - elseif c != ')' && c != '=' - let f = 1 " all but 'elseif' are followed by a formula - if c ==? 'n' || c ==? 'e' " 'then', 'else' - let ind = ind + shiftwidth() - elseif strpart(line, inicio-6, 6) ==? 'elseif' " elseif, set f to conditional - let ind = ind + shiftwidth() - let f = 0 - end - end - end - - " remove members [a] of [b]:[c]... (inicio remainds valid) - let line = substitute(line, '\c\(\[[^]]*]\(\s*of\s*\|:\)*\)\+', ' ', 'g') - while 1 - " search for the next interesting element - let inicio=matchend(line, '\c\<if\|endif\|[()=;]', inicio) - if inicio < 0 - break - end - - let c = line[inicio-1] - " 'expr(...)' containing the formula - if strpart(line, inicio-5, 5) ==? 'expr(' - let ind = 0 - let f = 1 - elseif c == ')' || c== ';' || strpart(line, inicio-5, 5) ==? 'endif' - let ind = ind - shiftwidth() - elseif c == '(' || c ==? 'f' " '(' or 'if' - let ind = ind + shiftwidth() - else " c == '=' - " if it is an asignment increase indent - if f == -1 " we don't know yet, find out - let f = CdlAsignment(lnum, strpart(line, 0, inicio)) - end - if f == 1 " formula increase it - let ind = ind + shiftwidth() - end - end - endw - - " CURRENT LINE, if it starts with a closing element, decrease indent - " or if it starts with '=' (asignment), increase indent - if match(thisline, '^\c\s*\(else\|then\|endif\|[);]\)') >= 0 - let ind = ind - shiftwidth() - elseif match(thisline, '^\s*=') >= 0 - if f == -1 " we don't know yet if is an asignment, find out - let f = CdlAsignment(lnum, "") - end - if f == 1 " formula increase it - let ind = ind + shiftwidth() - end - end - - return ind -endfun - -endif diff --git a/indent/ch.vim b/indent/ch.vim deleted file mode 100644 index bdaf531a..00000000 --- a/indent/ch.vim +++ /dev/null @@ -1,22 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Ch -" Maintainer: SoftIntegration, Inc. <info@softintegration.com> -" URL: http://www.softintegration.com/download/vim/indent/ch.vim -" Last change: 2006 Apr 30 -" Created based on cpp.vim -" -" Ch is a C/C++ interpreter with many high level extensions - - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" Ch indenting is built-in, thus this is very simple -setlocal cindent - -endif diff --git a/indent/chaiscript.vim b/indent/chaiscript.vim deleted file mode 100644 index 9c8b2283..00000000 --- a/indent/chaiscript.vim +++ /dev/null @@ -1,54 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: ChaiScript -" Maintainer: Jason Turner <lefticus 'at' gmail com> - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetChaiScriptIndent() -setlocal autoindent - -" Only define the function once. -if exists("*GetChaiScriptIndent") - finish -endif - -function! GetChaiScriptIndent() - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - " Add a 'shiftwidth' after lines that start a block: - " lines containing a { - let ind = indent(lnum) - let flag = 0 - let prevline = getline(lnum) - if prevline =~ '^.*{.*' - let ind = ind + shiftwidth() - let flag = 1 - endif - - " Subtract a 'shiftwidth' after lines containing a { followed by a } - " to keep it balanced - if flag == 1 && prevline =~ '.*{.*}.*' - let ind = ind - shiftwidth() - endif - - " Subtract a 'shiftwidth' on lines ending with } - if getline(v:lnum) =~ '^\s*\%(}\)' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -endif diff --git a/indent/changelog.vim b/indent/changelog.vim deleted file mode 100644 index 872692dd..00000000 --- a/indent/changelog.vim +++ /dev/null @@ -1,18 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: generic Changelog file -" Maintainer: noone -" Last Change: 2005 Mar 29 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal ai - -let b:undo_indent = "setl ai<" - -endif diff --git a/indent/clojure.vim b/indent/clojure.vim index 5d982e4a..f538195a 100644 --- a/indent/clojure.vim +++ b/indent/clojure.vim @@ -1,401 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Clojure -" Author: Meikel Brandmeyer <mb@kotka.de> -" URL: http://kotka.de/projects/clojure/vimclojure.html -" -" Maintainer: Sung Pae <self@sungpae.com> -" URL: https://github.com/guns/vim-clojure-static -" License: Same as Vim -" Last Change: 18 July 2016 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -let s:save_cpo = &cpo -set cpo&vim - -let b:undo_indent = 'setlocal autoindent< smartindent< expandtab< softtabstop< shiftwidth< indentexpr< indentkeys<' - -setlocal noautoindent nosmartindent -setlocal softtabstop=2 shiftwidth=2 expandtab -setlocal indentkeys=!,o,O - -if exists("*searchpairpos") - - if !exists('g:clojure_maxlines') - let g:clojure_maxlines = 100 - endif - - if !exists('g:clojure_fuzzy_indent') - let g:clojure_fuzzy_indent = 1 - endif - - if !exists('g:clojure_fuzzy_indent_patterns') - let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let'] - endif - - if !exists('g:clojure_fuzzy_indent_blacklist') - let g:clojure_fuzzy_indent_blacklist = ['-fn$', '\v^with-%(meta|out-str|loading-context)$'] - endif - - if !exists('g:clojure_special_indent_words') - let g:clojure_special_indent_words = 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn' - endif - - if !exists('g:clojure_align_multiline_strings') - let g:clojure_align_multiline_strings = 0 - endif - - if !exists('g:clojure_align_subforms') - let g:clojure_align_subforms = 0 - endif - - function! s:syn_id_name() - return synIDattr(synID(line("."), col("."), 0), "name") - endfunction - - function! s:ignored_region() - return s:syn_id_name() =~? '\vstring|regex|comment|character' - endfunction - - function! s:current_char() - return getline('.')[col('.')-1] - endfunction - - function! s:current_word() - return getline('.')[col('.')-1 : searchpos('\v>', 'n', line('.'))[1]-2] - endfunction - - function! s:is_paren() - return s:current_char() =~# '\v[\(\)\[\]\{\}]' && !s:ignored_region() - endfunction - - " Returns 1 if string matches a pattern in 'patterns', which may be a - " list of patterns, or a comma-delimited string of implicitly anchored - " patterns. - function! s:match_one(patterns, string) - let list = type(a:patterns) == type([]) - \ ? a:patterns - \ : map(split(a:patterns, ','), '"^" . v:val . "$"') - for pat in list - if a:string =~# pat | return 1 | endif - endfor - endfunction - - function! s:match_pairs(open, close, stopat) - " Stop only on vector and map [ resp. {. Ignore the ones in strings and - " comments. - if a:stopat == 0 - let stopat = max([line(".") - g:clojure_maxlines, 0]) - else - let stopat = a:stopat - endif - - let pos = searchpairpos(a:open, '', a:close, 'bWn', "!s:is_paren()", stopat) - return [pos[0], col(pos)] - endfunction - - function! s:clojure_check_for_string_worker() - " Check whether there is the last character of the previous line is - " highlighted as a string. If so, we check whether it's a ". In this - " case we have to check also the previous character. The " might be the - " closing one. In case the we are still in the string, we search for the - " opening ". If this is not found we take the indent of the line. - let nb = prevnonblank(v:lnum - 1) - - if nb == 0 - return -1 - endif - - call cursor(nb, 0) - call cursor(0, col("$") - 1) - if s:syn_id_name() !~? "string" - return -1 - endif - - " This will not work for a " in the first column... - if s:current_char() == '"' - call cursor(0, col("$") - 2) - if s:syn_id_name() !~? "string" - return -1 - endif - if s:current_char() != '\\' - return -1 - endif - call cursor(0, col("$") - 1) - endif - - let p = searchpos('\(^\|[^\\]\)\zs"', 'bW') - - if p != [0, 0] - return p[1] - 1 - endif - - return indent(".") - endfunction - - function! s:check_for_string() - let pos = getpos('.') - try - let val = s:clojure_check_for_string_worker() - finally - call setpos('.', pos) - endtry - return val - endfunction - - function! s:strip_namespace_and_macro_chars(word) - return substitute(a:word, "\\v%(.*/|[#'`~@^,]*)(.*)", '\1', '') - endfunction - - function! s:clojure_is_method_special_case_worker(position) - " Find the next enclosing form. - call search('\S', 'Wb') - - " Special case: we are at a '(('. - if s:current_char() == '(' - return 0 - endif - call cursor(a:position) - - let next_paren = s:match_pairs('(', ')', 0) - - " Special case: we are now at toplevel. - if next_paren == [0, 0] - return 0 - endif - call cursor(next_paren) - - call search('\S', 'W') - let w = s:strip_namespace_and_macro_chars(s:current_word()) - if g:clojure_special_indent_words =~# '\V\<' . w . '\>' - return 1 - endif - - return 0 - endfunction - - function! s:is_method_special_case(position) - let pos = getpos('.') - try - let val = s:clojure_is_method_special_case_worker(a:position) - finally - call setpos('.', pos) - endtry - return val - endfunction - - " Check if form is a reader conditional, that is, it is prefixed by #? - " or @#? - function! s:is_reader_conditional_special_case(position) - if getline(a:position[0])[a:position[1] - 3 : a:position[1] - 2] == "#?" - return 1 - endif - - return 0 - endfunction - - " Returns 1 for opening brackets, -1 for _anything else_. - function! s:bracket_type(char) - return stridx('([{', a:char) > -1 ? 1 : -1 - endfunction - - " Returns: [opening-bracket-lnum, indent] - function! s:clojure_indent_pos() - " Get rid of special case. - if line(".") == 1 - return [0, 0] - endif - - " We have to apply some heuristics here to figure out, whether to use - " normal lisp indenting or not. - let i = s:check_for_string() - if i > -1 - return [0, i + !!g:clojure_align_multiline_strings] - endif - - call cursor(0, 1) - - " Find the next enclosing [ or {. We can limit the second search - " to the line, where the [ was found. If no [ was there this is - " zero and we search for an enclosing {. - let paren = s:match_pairs('(', ')', 0) - let bracket = s:match_pairs('\[', '\]', paren[0]) - let curly = s:match_pairs('{', '}', bracket[0]) - - " In case the curly brace is on a line later then the [ or - in - " case they are on the same line - in a higher column, we take the - " curly indent. - if curly[0] > bracket[0] || curly[1] > bracket[1] - if curly[0] > paren[0] || curly[1] > paren[1] - return curly - endif - endif - - " If the curly was not chosen, we take the bracket indent - if - " there was one. - if bracket[0] > paren[0] || bracket[1] > paren[1] - return bracket - endif - - " There are neither { nor [ nor (, ie. we are at the toplevel. - if paren == [0, 0] - return paren - endif - - " Now we have to reimplement lispindent. This is surprisingly easy, as - " soon as one has access to syntax items. - " - " - Check whether we are in a special position after a word in - " g:clojure_special_indent_words. These are special cases. - " - Get the next keyword after the (. - " - If its first character is also a (, we have another sexp and align - " one column to the right of the unmatched (. - " - In case it is in lispwords, we indent the next line to the column of - " the ( + sw. - " - If not, we check whether it is last word in the line. In that case - " we again use ( + sw for indent. - " - In any other case we use the column of the end of the word + 2. - call cursor(paren) - - if s:is_method_special_case(paren) - return [paren[0], paren[1] + shiftwidth() - 1] - endif - - if s:is_reader_conditional_special_case(paren) - return paren - endif - - " In case we are at the last character, we use the paren position. - if col("$") - 1 == paren[1] - return paren - endif - - " In case after the paren is a whitespace, we search for the next word. - call cursor(0, col('.') + 1) - if s:current_char() == ' ' - call search('\v\S', 'W') - endif - - " If we moved to another line, there is no word after the (. We - " use the ( position for indent. - if line(".") > paren[0] - return paren - endif - - " We still have to check, whether the keyword starts with a (, [ or {. - " In that case we use the ( position for indent. - let w = s:current_word() - if s:bracket_type(w[0]) == 1 - return paren - endif - - " Test words without namespace qualifiers and leading reader macro - " metacharacters. - " - " e.g. clojure.core/defn and #'defn should both indent like defn. - let ww = s:strip_namespace_and_macro_chars(w) - - if &lispwords =~# '\V\<' . ww . '\>' - return [paren[0], paren[1] + shiftwidth() - 1] - endif - - if g:clojure_fuzzy_indent - \ && !s:match_one(g:clojure_fuzzy_indent_blacklist, ww) - \ && s:match_one(g:clojure_fuzzy_indent_patterns, ww) - return [paren[0], paren[1] + shiftwidth() - 1] - endif - - call search('\v\_s', 'cW') - call search('\v\S', 'W') - if paren[0] < line(".") - return [paren[0], paren[1] + (g:clojure_align_subforms ? 0 : shiftwidth() - 1)] - endif - - call search('\v\S', 'bW') - return [line('.'), col('.') + 1] - endfunction - - function! GetClojureIndent() - let lnum = line('.') - let orig_lnum = lnum - let orig_col = col('.') - let [opening_lnum, indent] = s:clojure_indent_pos() - - " Account for multibyte characters - if opening_lnum > 0 - let indent -= indent - virtcol([opening_lnum, indent]) - endif - - " Return if there are no previous lines to inherit from - if opening_lnum < 1 || opening_lnum >= lnum - 1 - call cursor(orig_lnum, orig_col) - return indent - endif - - let bracket_count = 0 - - " Take the indent of the first previous non-white line that is - " at the same sexp level. cf. src/misc1.c:get_lisp_indent() - while 1 - let lnum = prevnonblank(lnum - 1) - let col = 1 - - if lnum <= opening_lnum - break - endif - - call cursor(lnum, col) - - " Handle bracket counting edge case - if s:is_paren() - let bracket_count += s:bracket_type(s:current_char()) - endif - - while 1 - if search('\v[(\[{}\])]', '', lnum) < 1 - break - elseif !s:ignored_region() - let bracket_count += s:bracket_type(s:current_char()) - endif - endwhile - - if bracket_count == 0 - " Check if this is part of a multiline string - call cursor(lnum, 1) - if s:syn_id_name() !~? '\vstring|regex' - call cursor(orig_lnum, orig_col) - return indent(lnum) - endif - endif - endwhile - - call cursor(orig_lnum, orig_col) - return indent - endfunction - - setlocal indentexpr=GetClojureIndent() - -else - - " In case we have searchpairpos not available we fall back to - " normal lisp indenting. - setlocal indentexpr= - setlocal lisp - let b:undo_indent .= '| setlocal lisp<' - -endif - -let &cpo = s:save_cpo -unlet! s:save_cpo - -" vim:sts=8:sw=8:ts=8:noet - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'clojure') == -1 " Vim indent file diff --git a/indent/cmake.vim b/indent/cmake.vim deleted file mode 100644 index f67a14d2..00000000 --- a/indent/cmake.vim +++ /dev/null @@ -1,93 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: CMake (ft=cmake) -" Author: Andy Cedilnik <andy.cedilnik@kitware.com> -" Maintainer: Dimitri Merejkowsky <d.merej@gmail.com> -" Former Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com> -" Last Change: 2017 Aug 30 -" -" Licence: The CMake license applies to this file. See -" https://cmake.org/licensing -" This implies that distribution with Vim is allowed - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal et -setlocal indentexpr=CMakeGetIndent(v:lnum) -setlocal indentkeys+==ENDIF(,ENDFOREACH(,ENDMACRO(,ELSE(,ELSEIF(,ENDWHILE( - -" Only define the function once. -if exists("*CMakeGetIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -fun! CMakeGetIndent(lnum) - let this_line = getline(a:lnum) - - " Find a non-blank line above the current line. - let lnum = a:lnum - let lnum = prevnonblank(lnum - 1) - let previous_line = getline(lnum) - - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - - let or = '\|' - " Regular expressions used by line indentation function. - let cmake_regex_comment = '#.*' - let cmake_regex_identifier = '[A-Za-z][A-Za-z0-9_]*' - let cmake_regex_quoted = '"\([^"\\]\|\\.\)*"' - let cmake_regex_arguments = '\(' . cmake_regex_quoted . - \ or . '\$(' . cmake_regex_identifier . ')' . - \ or . '[^()\\#"]' . or . '\\.' . '\)*' - - let cmake_indent_comment_line = '^\s*' . cmake_regex_comment - let cmake_indent_blank_regex = '^\s*$' - let cmake_indent_open_regex = '^\s*' . cmake_regex_identifier . - \ '\s*(' . cmake_regex_arguments . - \ '\(' . cmake_regex_comment . '\)\?$' - - let cmake_indent_close_regex = '^' . cmake_regex_arguments . - \ ')\s*' . - \ '\(' . cmake_regex_comment . '\)\?$' - - let cmake_indent_begin_regex = '^\s*\(IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*(' - let cmake_indent_end_regex = '^\s*\(ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*(' - - " Add - if previous_line =~? cmake_indent_comment_line " Handle comments - let ind = ind - else - if previous_line =~? cmake_indent_begin_regex - let ind = ind + &sw - endif - if previous_line =~? cmake_indent_open_regex - let ind = ind + &sw - endif - endif - - " Subtract - if this_line =~? cmake_indent_end_regex - let ind = ind - &sw - endif - if previous_line =~? cmake_indent_close_regex - let ind = ind - &sw - endif - - return ind -endfun - -let &cpo = s:keepcpo -unlet s:keepcpo - -endif diff --git a/indent/cobol.vim b/indent/cobol.vim deleted file mode 100644 index 3d261f15..00000000 --- a/indent/cobol.vim +++ /dev/null @@ -1,220 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: cobol -" Author: Tim Pope <vimNOSPAM@tpope.info> -" $Id: cobol.vim,v 1.1 2007/05/05 18:08:19 vimboss Exp $ - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal expandtab -setlocal indentexpr=GetCobolIndent(v:lnum) -setlocal indentkeys& -setlocal indentkeys+=0<*>,0/,0$,0=01,=~division,=~section,0=~end,0=~then,0=~else,0=~when,*<Return>,. - -" Only define the function once. -if exists("*GetCobolIndent") - finish -endif - -let s:skip = 'getline(".") =~ "^.\\{6\\}[*/$-]\\|\"[^\"]*\""' - -function! s:prevgood(lnum) - " Find a non-blank line above the current line. - " Skip over comments. - let lnum = a:lnum - while lnum > 0 - let lnum = prevnonblank(lnum - 1) - let line = getline(lnum) - if line !~? '^\s*[*/$-]' && line !~? '^.\{6\}[*/$CD-]' - break - endif - endwhile - return lnum -endfunction - -function! s:stripped(lnum) - return substitute(strpart(getline(a:lnum),0,72),'^\s*','','') -endfunction - -function! s:optionalblock(lnum,ind,blocks,clauses) - let ind = a:ind - let clauses = '\c\<\%(\<NOT\s\+\)\@<!\%(NOT\s\+\)\=\%('.a:clauses.'\)' - let begin = '\c-\@<!\<\%('.a:blocks.'\)\>' - let beginfull = begin.'\ze.*\%(\n\%(\s*\%([*/$-].*\)\=\n\)*\)\=\s*\%('.clauses.'\)' - let end = '\c\<end-\%('.a:blocks.'\)\>\|\%(\.\%( \|$\)\)\@=' - let cline = s:stripped(a:lnum) - let line = s:stripped(s:prevgood(a:lnum)) - if cline =~? clauses "&& line !~? '^search\>' - call cursor(a:lnum,1) - let lastclause = searchpair(beginfull,clauses,end,'bWr',s:skip) - if getline(lastclause) =~? clauses && s:stripped(lastclause) !~? '^'.begin - let ind = indent(lastclause) - elseif lastclause > 0 - let ind = indent(lastclause) + shiftwidth() - "let ind = ind + shiftwidth() - endif - elseif line =~? clauses && cline !~? end - let ind = ind + shiftwidth() - endif - return ind -endfunction - -function! GetCobolIndent(lnum) abort - let minshft = 6 - let ashft = minshft + 1 - let bshft = ashft + 4 - " (Obsolete) numbered lines - if getline(a:lnum) =~? '^\s*\d\{6\}\%($\|[ */$CD-]\)' - return 0 - endif - let cline = s:stripped(a:lnum) - " Comments, etc. must start in the 7th column - if cline =~? '^[*/$-]' - return minshft - elseif cline =~# '^[CD]' && indent(a:lnum) == minshft - return minshft - endif - " Divisions, sections, and file descriptions start in area A - if cline =~? '\<\(DIVISION\|SECTION\)\%($\|\.\)' || cline =~? '^[FS]D\>' - return ashft - endif - " Fields - if cline =~? '^0*\(1\|77\)\>' - return ashft - endif - if cline =~? '^\d\+\>' - let cnum = matchstr(cline,'^\d\+\>') - let default = 0 - let step = -1 - while step < 2 - let lnum = a:lnum - while lnum > 0 && lnum < line('$') && lnum > a:lnum - 500 && lnum < a:lnum + 500 - let lnum = step > 0 ? nextnonblank(lnum + step) : prevnonblank(lnum + step) - let line = getline(lnum) - let lindent = indent(lnum) - if line =~? '^\s*\d\+\>' - let num = matchstr(line,'^\s*\zs\d\+\>') - if 0+cnum == num - return lindent - elseif 0+cnum > num && default < lindent + shiftwidth() - let default = lindent + shiftwidth() - endif - elseif lindent < bshft && lindent >= ashft - break - endif - endwhile - let step = step + 2 - endwhile - return default ? default : bshft - endif - let lnum = s:prevgood(a:lnum) - " Hit the start of the file, use "zero" indent. - if lnum == 0 - return ashft - endif - " Initial spaces are ignored - let line = s:stripped(lnum) - let ind = indent(lnum) - " Paragraphs. There may be some false positives. - if cline =~? '^\(\a[A-Z0-9-]*[A-Z0-9]\|\d[A-Z0-9-]*\a\)\.' "\s*$' - if cline !~? '^EXIT\s*\.' && line =~? '\.\s*$' - return ashft - endif - endif - " Paragraphs in the identification division. - "if cline =~? '^\(PROGRAM-ID\|AUTHOR\|INSTALLATION\|' . - "\ 'DATE-WRITTEN\|DATE-COMPILED\|SECURITY\)\>' - "return ashft - "endif - if line =~? '\.$' - " XXX - return bshft - endif - if line =~? '^PERFORM\>' - let perfline = substitute(line, '\c^PERFORM\s*', "", "") - if perfline =~? '^\%(\k\+\s\+TIMES\)\=\s*$' - let ind = ind + shiftwidth() - elseif perfline =~? '^\%(WITH\s\+TEST\|VARYING\|UNTIL\)\>.*[^.]$' - let ind = ind + shiftwidth() - endif - endif - if line =~? '^\%(IF\|THEN\|ELSE\|READ\|EVALUATE\|SEARCH\|SELECT\)\>' - let ind = ind + shiftwidth() - endif - let ind = s:optionalblock(a:lnum,ind,'ADD\|COMPUTE\|DIVIDE\|MULTIPLY\|SUBTRACT','ON\s\+SIZE\s\+ERROR') - let ind = s:optionalblock(a:lnum,ind,'STRING\|UNSTRING\|ACCEPT\|DISPLAY\|CALL','ON\s\+OVERFLOW\|ON\s\+EXCEPTION') - if cline !~? '^AT\s\+END\>' || line !~? '^SEARCH\>' - let ind = s:optionalblock(a:lnum,ind,'DELETE\|REWRITE\|START\|WRITE\|READ','INVALID\s\+KEY\|AT\s\+END\|NO\s\+DATA\|AT\s\+END-OF-PAGE') - endif - if cline =~? '^WHEN\>' - call cursor(a:lnum,1) - " We also search for READ so that contained AT ENDs are skipped - let lastclause = searchpair('\c-\@<!\<\%(SEARCH\|EVALUATE\|READ\)\>','\c\<\%(WHEN\|AT\s\+END\)\>','\c\<END-\%(SEARCH\|EVALUATE\|READ\)\>','bW',s:skip) - let g:foo = s:stripped(lastclause) - if s:stripped(lastclause) =~? '\c\<\%(WHEN\|AT\s\+END\)\>' - "&& s:stripped(lastclause) !~? '^\%(SEARCH\|EVALUATE\|READ\)\>' - let ind = indent(lastclause) - elseif lastclause > 0 - let ind = indent(lastclause) + shiftwidth() - endif - elseif line =~? '^WHEN\>' - let ind = ind + shiftwidth() - endif - "I'm not sure why I had this - "if line =~? '^ELSE\>-\@!' && line !~? '\.$' - "let ind = indent(s:prevgood(lnum)) - "endif - if cline =~? '^\(END\)\>-\@!' - " On lines with just END, 'guess' a simple shift left - let ind = ind - shiftwidth() - elseif cline =~? '^\(END-IF\|THEN\|ELSE\)\>-\@!' - call cursor(a:lnum,indent(a:lnum)) - let match = searchpair('\c-\@<!\<IF\>','\c-\@<!\%(THEN\|ELSE\)\>','\c-\@<!\<END-IF\>\zs','bnW',s:skip) - if match > 0 - let ind = indent(match) - endif - elseif cline =~? '^END-[A-Z]' - let beginword = matchstr(cline,'\c\<END-\zs[A-Z0-9-]\+') - let endword = 'END-'.beginword - let first = 0 - let suffix = '.*\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*' - if beginword =~? '^\%(ADD\|COMPUTE\|DIVIDE\|MULTIPLY\|SUBTRACT\)$' - let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+SIZE\s\+ERROR' - let g:beginword = beginword - let first = 1 - elseif beginword =~? '^\%(STRING\|UNSTRING\)$' - let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+OVERFLOW' - let first = 1 - elseif beginword =~? '^\%(ACCEPT\|DISPLAY\)$' - let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+EXCEPTION' - let first = 1 - elseif beginword ==? 'CALL' - let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+\%(EXCEPTION\|OVERFLOW\)' - let first = 1 - elseif beginword =~? '^\%(DELETE\|REWRITE\|START\|READ\|WRITE\)$' - let first = 1 - let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=\(INVALID\s\+KEY' - if beginword =~? '^READ' - let first = 0 - let beginword = beginword . '\|AT\s\+END\|NO\s\+DATA' - elseif beginword =~? '^WRITE' - let beginword = beginword . '\|AT\s\+END-OF-PAGE' - endif - let beginword = beginword . '\)' - endif - call cursor(a:lnum,indent(a:lnum)) - let match = searchpair('\c-\@<!\<'.beginword.'\>','','\c\<'.endword.'\>\zs','bnW'.(first? 'r' : ''),s:skip) - if match > 0 - let ind = indent(match) - elseif cline =~? '^\(END-\(READ\|EVALUATE\|SEARCH\|PERFORM\)\)\>' - let ind = ind - shiftwidth() - endif - endif - return ind < bshft ? bshft : ind -endfunction - -endif diff --git a/indent/config.vim b/indent/config.vim deleted file mode 100644 index a49741ca..00000000 --- a/indent/config.vim +++ /dev/null @@ -1,86 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Autoconf configure.{ac,in} file -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 -" TODO: how about nested [()]'s in one line -" what's wrong with '\\\@!'? - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -runtime! indent/sh.vim " will set b:did_indent - -setlocal indentexpr=GetConfigIndent() -setlocal indentkeys=!^F,o,O,=then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done -setlocal nosmartindent - -" Only define the function once. -if exists("*GetConfigIndent") - finish -endif - -" get the offset (indent) of the end of the match of 'regexp' in 'line' -function s:GetOffsetOf(line, regexp) - let end = matchend(a:line, a:regexp) - let width = 0 - let i = 0 - while i < end - if a:line[i] != "\t" - let width = width + 1 - else - let width = width + &ts - (width % &ts) - endif - let i = i + 1 - endwhile - return width -endfunction - -function GetConfigIndent() - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - " where to put this - let ind = GetShIndent() - let line = getline(lnum) - - " if previous line has unmatched, unescaped opening parentheses, - " indent to its position. TODO: not failsafe if multiple ('s - if line =~ '\\\@<!([^)]*$' - let ind = s:GetOffsetOf(line, '\\\@!(') - endif - - " if previous line has unmatched opening bracket, - " indent to its position. TODO: same as above - if line =~ '\[[^]]*$' - let ind = s:GetOffsetOf(line, '\[') - endif - - " if previous line had an unmatched closing parantheses, - " indent to the matching opening parantheses - if line =~ '[^(]\+\\\@<!)$' - call search(')', 'bW') - let lnum = searchpair('\\\@<!(', '', ')', 'bWn') - let ind = indent(lnum) - endif - - " if previous line had an unmatched closing bracket, - " indent to the matching opening bracket - if line =~ '[^[]\+]$' - call search(']', 'bW') - let lnum = searchpair('\[', '', ']', 'bWn') - let ind = indent(lnum) - endif - - return ind -endfunction - -endif diff --git a/indent/context.vim b/indent/context.vim deleted file mode 100644 index 41c98af8..00000000 --- a/indent/context.vim +++ /dev/null @@ -1,40 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" ConTeXt indent file -" Language: ConTeXt typesetting engine -" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com> -" Last Change: 2016 Oct 15 - -if exists("b:did_indent") - finish -endif - -if !get(b:, 'context_metapost', get(g:, 'context_metapost', 1)) - finish -endif - -" Load MetaPost indentation script -runtime! indent/mp.vim - -let s:keepcpo= &cpo -set cpo&vim - -setlocal indentexpr=GetConTeXtIndent() - -let b:undo_indent = "setl indentexpr<" - -function! GetConTeXtIndent() - " Use MetaPost rules inside MetaPost graphic environments - if len(synstack(v:lnum, 1)) > 0 && - \ synIDattr(synstack(v:lnum, 1)[0], "name") ==# 'contextMPGraphic' - return GetMetaPostIndent() - endif - return -1 -endfunc - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:sw=2 - -endif diff --git a/indent/cpp.vim b/indent/cpp.vim deleted file mode 100644 index e6bbfc63..00000000 --- a/indent/cpp.vim +++ /dev/null @@ -1,19 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: C++ -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2008 Nov 29 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" C++ indenting is built-in, thus this is very simple -setlocal cindent - -let b:undo_indent = "setl cin<" - -endif diff --git a/indent/cs.vim b/indent/cs.vim deleted file mode 100644 index bd04c1e9..00000000 --- a/indent/cs.vim +++ /dev/null @@ -1,19 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: C# -" Maintainer: Johannes Zellner <johannes@zellner.org> -" Last Change: Fri, 15 Mar 2002 07:53:54 CET - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" C# is like indenting C -setlocal cindent - -let b:undo_indent = "setl cin<" - -endif diff --git a/indent/css.vim b/indent/css.vim deleted file mode 100644 index bf26f77b..00000000 --- a/indent/css.vim +++ /dev/null @@ -1,88 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: CSS -" Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2012-05-30 -" Use of shiftwidth() added by Oleg Zubchenko. - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetCSSIndent() -setlocal indentkeys=0{,0},!^F,o,O -setlocal nosmartindent - -let b:undo_indent = "setl smartindent< indentkeys< indentexpr<" - -if exists("*GetCSSIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -function s:prevnonblanknoncomment(lnum) - let lnum = a:lnum - while lnum > 1 - let lnum = prevnonblank(lnum) - let line = getline(lnum) - if line =~ '\*/' - while lnum > 1 && line !~ '/\*' - let lnum -= 1 - endwhile - if line =~ '^\s*/\*' - let lnum -= 1 - else - break - endif - else - break - endif - endwhile - return lnum -endfunction - -function s:count_braces(lnum, count_open) - let n_open = 0 - let n_close = 0 - let line = getline(a:lnum) - let pattern = '[{}]' - let i = match(line, pattern) - while i != -1 - if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)' - if line[i] == '{' - let n_open += 1 - elseif line[i] == '}' - if n_open > 0 - let n_open -= 1 - else - let n_close += 1 - endif - endif - endif - let i = match(line, pattern, i + 1) - endwhile - return a:count_open ? n_open : n_close -endfunction - -function GetCSSIndent() - let line = getline(v:lnum) - if line =~ '^\s*\*' - return cindent(v:lnum) - endif - - let pnum = s:prevnonblanknoncomment(v:lnum - 1) - if pnum == 0 - return 0 - endif - - return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth() - \ - s:count_braces(v:lnum, 0) * shiftwidth() -endfunction - -let &cpo = s:keepcpo -unlet s:keepcpo - -endif diff --git a/indent/cucumber.vim b/indent/cucumber.vim index a6b745c0..03f11dc8 100644 --- a/indent/cucumber.vim +++ b/indent/cucumber.vim @@ -1,82 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Cucumber -" Maintainer: Tim Pope <vimNOSPAM@tpope.org> -" Last Change: 2017 Jun 13 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent -setlocal indentexpr=GetCucumberIndent() -setlocal indentkeys=o,O,*<Return>,<:>,0<Bar>,0#,=,!^F - -let b:undo_indent = 'setl ai< inde< indk<' - -" Only define the function once. -if exists("*GetCucumberIndent") - finish -endif - -function! s:syn(lnum) - return synIDattr(synID(a:lnum,1+indent(a:lnum),1),'name') -endfunction - -function! GetCucumberIndent() - let line = getline(prevnonblank(v:lnum-1)) - let cline = getline(v:lnum) - let nline = getline(nextnonblank(v:lnum+1)) - let sw = exists('*shiftwidth') ? shiftwidth() : shiftwidth() - let syn = s:syn(prevnonblank(v:lnum-1)) - let csyn = s:syn(v:lnum) - let nsyn = s:syn(nextnonblank(v:lnum+1)) - if csyn ==# 'cucumberFeature' || cline =~# '^\s*Feature:' - " feature heading - return 0 - elseif csyn ==# 'cucumberExamples' || cline =~# '^\s*\%(Examples\|Scenarios\):' - " examples heading - return 2 * sw - elseif csyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || cline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):' - " background, scenario or outline heading - return sw - elseif syn ==# 'cucumberFeature' || line =~# '^\s*Feature:' - " line after feature heading - return sw - elseif syn ==# 'cucumberExamples' || line =~# '^\s*\%(Examples\|Scenarios\):' - " line after examples heading - return 3 * sw - elseif syn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || line =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):' - " line after background, scenario or outline heading - return 2 * sw - elseif cline =~# '^\s*[@#]' && (nsyn == 'cucumberFeature' || nline =~# '^\s*Feature:' || indent(prevnonblank(v:lnum-1)) <= 0) - " tag or comment before a feature heading - return 0 - elseif cline =~# '^\s*@' - " other tags - return sw - elseif cline =~# '^\s*[#|]' && line =~# '^\s*|' - " mid-table - " preserve indent - return indent(prevnonblank(v:lnum-1)) - elseif cline =~# '^\s*|' && line =~# '^\s*[^|]' - " first line of a table, relative indent - return indent(prevnonblank(v:lnum-1)) + sw - elseif cline =~# '^\s*[^|]' && line =~# '^\s*|' - " line after a table, relative unindent - return indent(prevnonblank(v:lnum-1)) - sw - elseif cline =~# '^\s*#' && getline(v:lnum-1) =~ '^\s*$' && (nsyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || nline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):') - " comments on scenarios - return sw - endif - return indent(prevnonblank(v:lnum-1)) -endfunction - -" vim:set sts=2 sw=2: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cucumber') == -1 " Vim indent file diff --git a/indent/cuda.vim b/indent/cuda.vim deleted file mode 100644 index d120eda7..00000000 --- a/indent/cuda.vim +++ /dev/null @@ -1,19 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: CUDA -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2008 Nov 29 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" It's just like C indenting -setlocal cindent - -let b:undo_indent = "setl cin<" - -endif diff --git a/indent/d.vim b/indent/d.vim deleted file mode 100644 index c44e7352..00000000 --- a/indent/d.vim +++ /dev/null @@ -1,26 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file for the D programming language (version 0.137). -" -" Language: D -" Maintainer: Jason Mills<jmills@cs.mun.ca> -" Last Change: 2005 Nov 22 -" Version: 0.1 -" -" Please email me with bugs, comments, and suggestion. Put vim in the subject -" to ensure the email will not be marked has spam. -" - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -let b:did_indent = 1 - -" D indenting is a lot like the built-in C indenting. -setlocal cindent - -" vim: ts=8 noet - -endif diff --git a/indent/dictconf.vim b/indent/dictconf.vim deleted file mode 100644 index 193d8ba5..00000000 --- a/indent/dictconf.vim +++ /dev/null @@ -1,17 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: dict(1) configuration file -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentkeys=0{,0},!^F,o,O cinwords= autoindent smartindent -setlocal nosmartindent -inoremap <buffer> # X# - -endif diff --git a/indent/dictdconf.vim b/indent/dictdconf.vim deleted file mode 100644 index 1aa5fd3e..00000000 --- a/indent/dictdconf.vim +++ /dev/null @@ -1,17 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: dictd(8) configuration file -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentkeys=0{,0},!^F,o,O cinwords= autoindent smartindent -setlocal nosmartindent -inoremap <buffer> # X# - -endif diff --git a/indent/docbk.vim b/indent/docbk.vim deleted file mode 100644 index 8a671f42..00000000 --- a/indent/docbk.vim +++ /dev/null @@ -1,19 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: DocBook Documentation Format -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-04-19 - -if exists("b:did_indent") - finish -endif - -" Same as XML indenting for now. -runtime! indent/xml.vim - -if exists('*XmlIndentGet') - setlocal indentexpr=XmlIndentGet(v:lnum,0) -endif - -endif diff --git a/indent/dtd.vim b/indent/dtd.vim deleted file mode 100644 index eb2665b4..00000000 --- a/indent/dtd.vim +++ /dev/null @@ -1,329 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: DTD (Document Type Definition for XML) -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2011-07-08 - -let s:cpo_save = &cpo -set cpo&vim - -setlocal indentexpr=GetDTDIndent() -setlocal indentkeys=!^F,o,O,> -setlocal nosmartindent - -if exists("*GetDTDIndent") - finish -endif - -" TODO: Needs to be adjusted to stop at [, <, and ]. -let s:token_pattern = '^[^[:space:]]\+' - -function s:lex1(input, start, ...) - let pattern = a:0 > 0 ? a:1 : s:token_pattern - let start = matchend(a:input, '^\_s*', a:start) - if start == -1 - return ["", a:start] - endif - let end = matchend(a:input, pattern, start) - if end == -1 - return ["", a:start] - endif - let token = strpart(a:input, start, end - start) - return [token, end] -endfunction - -function s:lex(input, start, ...) - let pattern = a:0 > 0 ? a:1 : s:token_pattern - let info = s:lex1(a:input, a:start, pattern) - while info[0] == '--' - let info = s:lex1(a:input, info[1], pattern) - while info[0] != "" && info[0] != '--' - let info = s:lex1(a:input, info[1], pattern) - endwhile - if info[0] == "" - return info - endif - let info = s:lex1(a:input, info[1], pattern) - endwhile - return info -endfunction - -function s:indent_to_innermost_parentheses(line, end) - let token = '(' - let end = a:end - let parentheses = [end - 1] - while token != "" - let [token, end] = s:lex(a:line, end, '^\%([(),|]\|[A-Za-z0-9_-]\+\|#P\=CDATA\|%[A-Za-z0-9_-]\+;\)[?*+]\=') - if token[0] == '(' - call add(parentheses, end - 1) - elseif token[0] == ')' - if len(parentheses) == 1 - return [-1, end] - endif - call remove(parentheses, -1) - endif - endwhile - return [parentheses[-1] - strridx(a:line, "\n", parentheses[-1]), end] -endfunction - -" TODO: Line and end could be script global (think OO members). -function GetDTDIndent() - if v:lnum == 1 - return 0 - endif - - " Begin by searching back for a <! that isn’t inside a comment. - " From here, depending on what follows immediately after, parse to - " where we’re at to determine what to do. - if search('<!', 'bceW') == 0 - return indent(v:lnum - 1) - endif - let lnum = line('.') - let col = col('.') - let indent = indent('.') - let line = lnum == v:lnum ? getline(lnum) : join(getline(lnum, v:lnum - 1), "\n") - - let [declaration, end] = s:lex1(line, col) - if declaration == "" - return indent + shiftwidth() - elseif declaration == '--' - " We’re looking at a comment. Now, simply determine if the comment is - " terminated or not. If it isn’t, let Vim take care of that using - " 'comments' and 'autoindent'. Otherwise, indent to the first lines level. - while declaration != "" - let [declaration, end] = s:lex(line, end) - if declaration == "-->" - return indent - endif - endwhile - return -1 - elseif declaration == 'ELEMENT' - " Check for element name. If none exists, indent one level. - let [name, end] = s:lex(line, end) - if name == "" - return indent + shiftwidth() - endif - - " Check for token following element name. This can be a specification of - " whether the start or end tag may be omitted. If nothing is found, indent - " one level. - let [token, end] = s:lex(line, end, '^\%([-O(]\|ANY\|EMPTY\)') - let n = 0 - while token =~ '[-O]' && n < 2 - let [token, end] = s:lex(line, end, '^\%([-O(]\|ANY\|EMPTY\)') - let n += 1 - endwhile - if token == "" - return indent + shiftwidth() - endif - - " Next comes the content model. If the token we’ve found isn’t a - " parenthesis it must be either ANY, EMPTY or some random junk. Either - " way, we’re done indenting this element, so set it to that of the first - " line so that the terminating “>†winds up having the same indention. - if token != '(' - return indent - endif - - " Now go through the content model. We need to keep track of the nesting - " of parentheses. As soon as we hit 0 we’re done. If that happens we must - " have a complete content model. Thus set indention to be the same as that - " of the first line so that the terminating “>†winds up having the same - " indention. Otherwise, we’ll indent to the innermost parentheses not yet - " matched. - let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end) - if indent_of_innermost != -1 - return indent_of_innermost - endif - - " Finally, look for any additions and/or exceptions to the content model. - " This is defined by a “+†or “-†followed by another content model - " declaration. - " TODO: Can the “-†be separated by whitespace from the “(â€? - let seen = { '+(': 0, '-(': 0 } - while 1 - let [additions_exceptions, end] = s:lex(line, end, '^[+-](') - if additions_exceptions != '+(' && additions_exceptions != '-(' - let [token, end] = s:lex(line, end) - if token == '>' - return indent - endif - " TODO: Should use s:lex here on getline(v:lnum) and check for >. - return getline(v:lnum) =~ '^\s*>' || count(values(seen), 0) == 0 ? indent : (indent + shiftwidth()) - endif - - " If we’ve seen an addition or exception already and this is of the same - " kind, the user is writing a broken DTD. Time to bail. - if seen[additions_exceptions] - return indent - endif - let seen[additions_exceptions] = 1 - - let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end) - if indent_of_innermost != -1 - return indent_of_innermost - endif - endwhile - elseif declaration == 'ATTLIST' - " Check for element name. If none exists, indent one level. - let [name, end] = s:lex(line, end) - if name == "" - return indent + shiftwidth() - endif - - " Check for any number of attributes. - while 1 - " Check for attribute name. If none exists, indent one level, unless the - " current line is a lone “>â€, in which case we indent to the same level - " as the first line. Otherwise, if the attribute name is “>â€, we have - " actually hit the end of the attribute list, in which case we indent to - " the same level as the first line. - let [name, end] = s:lex(line, end) - if name == "" - " TODO: Should use s:lex here on getline(v:lnum) and check for >. - return getline(v:lnum) =~ '^\s*>' ? indent : (indent + shiftwidth()) - elseif name == ">" - return indent - endif - - " Check for attribute value declaration. If none exists, indent two - " levels. Otherwise, if it’s an enumerated value, check for nested - " parentheses and indent to the innermost one if we don’t reach the end - " of the listc. Otherwise, just continue with looking for the default - " attribute value. - " TODO: Do validation of keywords - " (CDATA|NMTOKEN|NMTOKENS|ID|IDREF|IDREFS|ENTITY|ENTITIES)? - let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)') - if value == "" - return indent + shiftwidth() * 2 - elseif value == 'NOTATION' - " If this is a enumerated value based on notations, read another token - " for the actual value. If it doesn’t exist, indent three levels. - " TODO: If validating according to above, value must be equal to '('. - let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)') - if value == "" - return indent + shiftwidth() * 3 - endif - endif - - if value == '(' - let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end) - if indent_of_innermost != -1 - return indent_of_innermost - endif - endif - - " Finally look for the attribute’s default value. If non exists, indent - " two levels. - let [default, end] = s:lex(line, end, '^\%("\_[^"]*"\|#\(REQUIRED\|IMPLIED\|FIXED\)\)') - if default == "" - return indent + shiftwidth() * 2 - elseif default == '#FIXED' - " We need to look for the fixed value. If non exists, indent three - " levels. - let [default, end] = s:lex(line, end, '^"\_[^"]*"') - if default == "" - return indent + shiftwidth() * 3 - endif - endif - endwhile - elseif declaration == 'ENTITY' - " Check for entity name. If none exists, indent one level. Otherwise, if - " the name actually turns out to be a percent sign, “%â€, this is a - " parameter entity. Read another token to determine the entity name and, - " again, if none exists, indent one level. - let [name, end] = s:lex(line, end) - if name == "" - return indent + shiftwidth() - elseif name == '%' - let [name, end] = s:lex(line, end) - if name == "" - return indent + shiftwidth() - endif - endif - - " Now check for the entity value. If none exists, indent one level. If it - " does exist, indent to same level as first line, as we’re now done with - " this entity. - " - " The entity value can be a string in single or double quotes (no escapes - " to worry about, as entities are used instead). However, it can also be - " that this is an external unparsed entity. In that case we have to look - " further for (possibly) a public ID and an URI followed by the NDATA - " keyword and the actual notation name. For the public ID and URI, indent - " two levels, if they don’t exist. If the NDATA keyword doesn’t exist, - " indent one level. Otherwise, if the actual notation name doesn’t exist, - " indent two level. If it does, indent to same level as first line, as - " we’re now done with this entity. - let [value, end] = s:lex(line, end) - if value == "" - return indent + shiftwidth() - elseif value == 'SYSTEM' || value == 'PUBLIC' - let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)') - if quoted_string == "" - return indent + shiftwidth() * 2 - endif - - if value == 'PUBLIC' - let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)') - if quoted_string == "" - return indent + shiftwidth() * 2 - endif - endif - - let [ndata, end] = s:lex(line, end) - if ndata == "" - return indent + shiftwidth() - endif - - let [name, end] = s:lex(line, end) - return name == "" ? (indent + shiftwidth() * 2) : indent - else - return indent - endif - elseif declaration == 'NOTATION' - " Check for notation name. If none exists, indent one level. - let [name, end] = s:lex(line, end) - if name == "" - return indent + shiftwidth() - endif - - " Now check for the external ID. If none exists, indent one level. - let [id, end] = s:lex(line, end) - if id == "" - return indent + shiftwidth() - elseif id == 'SYSTEM' || id == 'PUBLIC' - let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)') - if quoted_string == "" - return indent + shiftwidth() * 2 - endif - - if id == 'PUBLIC' - let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\|>\)') - if quoted_string == "" - " TODO: Should use s:lex here on getline(v:lnum) and check for >. - return getline(v:lnum) =~ '^\s*>' ? indent : (indent + shiftwidth() * 2) - elseif quoted_string == '>' - return indent - endif - endif - endif - - return indent - endif - - " TODO: Processing directives could be indented I suppose. But perhaps it’s - " just as well to let the user decide how to indent them (perhaps extending - " this function to include proper support for whatever processing directive - " language they want to use). - - " Conditional sections are simply passed along to let Vim decide what to do - " (and hence the user). - return -1 -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif diff --git a/indent/dtrace.vim b/indent/dtrace.vim deleted file mode 100644 index 3d9d4e07..00000000 --- a/indent/dtrace.vim +++ /dev/null @@ -1,21 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: D script as described in "Solaris Dynamic Tracing Guide", -" http://docs.sun.com/app/docs/doc/817-6223 -" Last Change: 2008/03/20 -" Version: 1.2 -" Maintainer: Nicolas Weber <nicolasweber@gmx.de> - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" Built-in C indenting works nicely for dtrace. -setlocal cindent - -let b:undo_indent = "setl cin<" - -endif diff --git a/indent/dylan.vim b/indent/dylan.vim deleted file mode 100644 index 4858ea84..00000000 --- a/indent/dylan.vim +++ /dev/null @@ -1,94 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Dylan -" Version: 0.01 -" Last Change: 2017 Jun 13 -" Maintainer: Brent A. Fulgham <bfulgham@debian.org> - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentkeys+==~begin,=~block,=~case,=~cleanup,=~define,=~end,=~else,=~elseif,=~exception,=~for,=~finally,=~if,=~otherwise,=~select,=~unless,=~while - -" Define the appropriate indent function but only once -setlocal indentexpr=DylanGetIndent() -if exists("*DylanGetIndent") - finish -endif - -function DylanGetIndent() - " Get the line to be indented - let cline = getline(v:lnum) - - " Don't reindent comments on first column - if cline =~ '^/\[/\*]' - return 0 - endif - - "Find the previous non-blank line - let lnum = prevnonblank(v:lnum - 1) - "Use zero indent at the top of the file - if lnum == 0 - return 0 - endif - - let prevline=getline(lnum) - let ind = indent(lnum) - let chg = 0 - - " If previous line was a comment, use its indent - if prevline =~ '^\s*//' - return ind - endif - - " If previous line was a 'define', indent - if prevline =~? '\(^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)\|\s*\S*\s*=>$\)' - let chg = shiftwidth() - " local methods indent the shift-width, plus 6 for the 'local' - elseif prevline =~? '^\s*local' - let chg = shiftwidth() + 6 - " If previous line was a let with no closing semicolon, indent - elseif prevline =~? '^\s*let.*[^;]\s*$' - let chg = shiftwidth() - " If previous line opened a parenthesis, and did not close it, indent - elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$' - return = match( prevline, '(.*\((.*)\|[^)]\)*.*$') + 1 - "elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$' - elseif prevline =~ '^[^(]*)\s*$' - " This line closes a parenthesis. Find opening - let curr_line = prevnonblank(lnum - 1) - while curr_line >= 0 - let str = getline(curr_line) - if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$' - let curr_line = prevnonblank(curr_line - 1) - else - break - endif - endwhile - if curr_line < 0 - return -1 - endif - let ind = indent(curr_line) - " Although we found the closing parenthesis, make sure this - " line doesn't start with an indentable command: - let curr_str = getline(curr_line) - if curr_str =~? '^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)' - let chg = shiftwidth() - endif - endif - - " If a line starts with end, un-indent (even if we just indented!) - if cline =~? '^\s*\(cleanup\|end\|else\|elseif\|exception\|finally\|otherwise\)' - let chg = chg - shiftwidth() - endif - - return ind + chg -endfunction - -" vim:sw=2 tw=130 - -endif diff --git a/indent/eiffel.vim b/indent/eiffel.vim deleted file mode 100644 index d5967022..00000000 --- a/indent/eiffel.vim +++ /dev/null @@ -1,119 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Eiffel -" Maintainer: Jocelyn Fiat <jfiat@eiffel.com> -" Previous-Maintainer: David Clarke <gadicath@dishevelled.net> -" Contributions from: Takuya Fujiwara -" Contributions from: Thilo Six -" $Date: 2017/03/08 06:00:00 $ -" $Revision: 1.4 $ -" URL: https://github.com/eiffelhub/vim-eiffel - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetEiffelIndent() -setlocal nolisp -setlocal nosmartindent -setlocal nocindent -setlocal autoindent -setlocal comments=:-- -setlocal indentkeys+==end,=else,=ensure,=require,=check,=loop,=until -setlocal indentkeys+==creation,=feature,=inherit,=class,=is,=redefine,=rename,=variant -setlocal indentkeys+==invariant,=do,=local,=export - -let b:undo_indent = "setl smartindent< indentkeys< indentexpr< autoindent< comments< " - -" Define some stuff -" keywords grouped by indenting -let s:trust_user_indent = '\(+\)\(\s*\(--\).*\)\=$' -let s:relative_indent = '^\s*\(deferred\|class\|feature\|creation\|inherit\|loop\|from\|across\|until\|if\|else\|elseif\|ensure\|require\|check\|do\|local\|invariant\|variant\|rename\|redefine\|do\|export\)\>' -let s:outdent = '^\s*\(else\|invariant\|variant\|do\|require\|until\|loop\|local\)\>' -let s:no_indent = '^\s*\(class\|feature\|creation\|inherit\)\>' -let s:single_dent = '^[^-]\+[[:alnum:]]\+ is\(\s*\(--\).*\)\=$' -let s:inheritance_dent = '\s*\(redefine\|rename\|export\)\>' - - -" Only define the function once. -if exists("*GetEiffelIndent") - finish -endif - -let s:keepcpo= &cpo -set cpo&vim - -function GetEiffelIndent() - - " Eiffel Class indenting - " - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - " trust the user's indenting - if getline(lnum) =~ s:trust_user_indent - return -1 - endif - - " Add a 'shiftwidth' after lines that start with an indent word - let ind = indent(lnum) - if getline(lnum) =~ s:relative_indent - let ind = ind + shiftwidth() - endif - - " Indent to single indent - if getline(v:lnum) =~ s:single_dent && getline(v:lnum) !~ s:relative_indent - \ && getline(v:lnum) !~ '\s*\<\(and\|or\|implies\)\>' - let ind = shiftwidth() - endif - - " Indent to double indent - if getline(v:lnum) =~ s:inheritance_dent - let ind = 2 * shiftwidth() - endif - - " Indent line after the first line of the function definition - if getline(lnum) =~ s:single_dent - let ind = ind + shiftwidth() - endif - - " The following should always be at the start of a line, no indenting - if getline(v:lnum) =~ s:no_indent - let ind = 0 - endif - - " Subtract a 'shiftwidth', if this isn't the first thing after the 'is' - " or first thing after the 'do' - if getline(v:lnum) =~ s:outdent && getline(v:lnum - 1) !~ s:single_dent - \ && getline(v:lnum - 1) !~ '^\s*do\>' - let ind = ind - shiftwidth() - endif - - " Subtract a shiftwidth for end statements - if getline(v:lnum) =~ '^\s*end\>' - let ind = ind - shiftwidth() - endif - - " set indent of zero end statements that are at an indent of 3, this should - " only ever be the class's end. - if getline(v:lnum) =~ '^\s*end\>' && ind == shiftwidth() - let ind = 0 - endif - - return ind -endfunction - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:sw=2 - -endif diff --git a/indent/erlang.vim b/indent/erlang.vim index efd4ba47..64525bbd 100644 --- a/indent/erlang.vim +++ b/indent/erlang.vim @@ -1,1397 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Erlang (http://www.erlang.org) -" Author: Csaba Hoch <csaba.hoch@gmail.com> -" Contributors: Edwin Fine <efine145_nospam01 at usa dot net> -" Pawel 'kTT' Salata <rockplayer.pl@gmail.com> -" Ricardo Catalinas Jiménez <jimenezrick@gmail.com> -" Last Update: 2013-Jul-21 -" License: Vim license -" URL: https://github.com/hcs42/vim-erlang - -" Note About Usage: -" This indentation script works best with the Erlang syntax file created by -" KreÄ…imir Marľić (Kresimir Marzic) and maintained by Csaba Hoch. - -" Notes About Implementation: -" -" - LTI = Line to indent. -" - The index of the first line is 1, but the index of the first column is 0. - - -" Initialization {{{1 -" ============== - -" Only load this indent file when no other was loaded -" Vim 7 or later is needed -if exists("b:did_indent") || version < 700 - finish -else - let b:did_indent = 1 -endif - -setlocal indentexpr=ErlangIndent() -setlocal indentkeys+=0=end,0=of,0=catch,0=after,0=when,0=),0=],0=},0=>> - -" Only define the functions once -if exists("*ErlangIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" Logging library {{{1 -" =============== - -" Purpose: -" Logs the given string using the ErlangIndentLog function if it exists. -" Parameters: -" s: string -function! s:Log(s) - if exists("*ErlangIndentLog") - call ErlangIndentLog(a:s) - endif -endfunction - -" Line tokenizer library {{{1 -" ====================== - -" Indtokens are "indentation tokens". - -" Purpose: -" Calculate the new virtual column after the given segment of a line. -" Parameters: -" line: string -" first_index: integer -- the index of the first character of the segment -" last_index: integer -- the index of the last character of the segment -" vcol: integer -- the virtual column of the first character of the token -" tabstop: integer -- the value of the 'tabstop' option to be used -" Returns: -" vcol: integer -" Example: -" " index: 0 12 34567 -" " vcol: 0 45 89 -" s:CalcVCol("\t'\tx', b", 1, 4, 4) -> 10 -function! s:CalcVCol(line, first_index, last_index, vcol, tabstop) - - " We copy the relevent segment of the line, otherwise if the line were - " e.g. `"\t", term` then the else branch below would consume the `", term` - " part at once. - let line = a:line[a:first_index : a:last_index] - - let i = 0 - let last_index = a:last_index - a:first_index - let vcol = a:vcol - - while 0 <= i && i <= last_index - - if line[i] ==# "\t" - " Example (when tabstop == 4): - " - " vcol + tab -> next_vcol - " 0 + tab -> 4 - " 1 + tab -> 4 - " 2 + tab -> 4 - " 3 + tab -> 4 - " 4 + tab -> 8 - " - " next_i - i == the number of tabs - let next_i = matchend(line, '\t*', i + 1) - let vcol = (vcol / a:tabstop + (next_i - i)) * a:tabstop - call s:Log('new vcol after tab: '. vcol) - else - let next_i = matchend(line, '[^\t]*', i + 1) - let vcol += next_i - i - call s:Log('new vcol after other: '. vcol) - endif - let i = next_i - endwhile - - return vcol -endfunction - -" Purpose: -" Go through the whole line and return the tokens in the line. -" Parameters: -" line: string -- the line to be examined -" string_continuation: bool -" atom_continuation: bool -" Returns: -" indtokens = [indtoken] -" indtoken = [token, vcol, col] -" token = string (examples: 'begin', '<variable>', '}') -" vcol = integer (the virtual column of the first character of the token) -" col = integer -function! s:GetTokensFromLine(line, string_continuation, atom_continuation, - \tabstop) - - let linelen = strlen(a:line) " The length of the line - let i = 0 " The index of the current character in the line - let vcol = 0 " The virtual column of the current character - let indtokens = [] - - if a:string_continuation - let i = matchend(a:line, '^\%([^"\\]\|\\.\)*"', 0) - if i ==# -1 - call s:Log(' Whole line is string continuation -> ignore') - return [] - else - let vcol = s:CalcVCol(a:line, 0, i - 1, 0, a:tabstop) - call add(indtokens, ['<string_end>', vcol, i]) - endif - elseif a:atom_continuation - let i = matchend(a:line, "^\\%([^'\\\\]\\|\\\\.\\)*'", 0) - if i ==# -1 - call s:Log(' Whole line is quoted atom continuation -> ignore') - return [] - else - let vcol = s:CalcVCol(a:line, 0, i - 1, 0, a:tabstop) - call add(indtokens, ['<quoted_atom_end>', vcol, i]) - endif - endif - - while 0 <= i && i < linelen - - let next_vcol = '' - - " Spaces - if a:line[i] ==# ' ' - let next_i = matchend(a:line, ' *', i + 1) - - " Tabs - elseif a:line[i] ==# "\t" - let next_i = matchend(a:line, '\t*', i + 1) - - " See example in s:CalcVCol - let next_vcol = (vcol / a:tabstop + (next_i - i)) * a:tabstop - - " Comment - elseif a:line[i] ==# '%' - let next_i = linelen - - " String token: "..." - elseif a:line[i] ==# '"' - let next_i = matchend(a:line, '\%([^"\\]\|\\.\)*"', i + 1) - if next_i ==# -1 - call add(indtokens, ['<string_start>', vcol, i]) - else - let next_vcol = s:CalcVCol(a:line, i, next_i - 1, vcol, a:tabstop) - call add(indtokens, ['<string>', vcol, i]) - endif - - " Quoted atom token: '...' - elseif a:line[i] ==# "'" - let next_i = matchend(a:line, "\\%([^'\\\\]\\|\\\\.\\)*'", i + 1) - if next_i ==# -1 - call add(indtokens, ['<quoted_atom_start>', vcol, i]) - else - let next_vcol = s:CalcVCol(a:line, i, next_i - 1, vcol, a:tabstop) - call add(indtokens, ['<quoted_atom>', vcol, i]) - endif - - " Keyword or atom or variable token or number - elseif a:line[i] =~# '[a-zA-Z_@0-9]' - let next_i = matchend(a:line, - \'[[:alnum:]_@:]*\%(\s*#\s*[[:alnum:]_@:]*\)\=', - \i + 1) - call add(indtokens, [a:line[(i):(next_i - 1)], vcol, i]) - - " Character token: $<char> (as in: $a) - elseif a:line[i] ==# '$' - call add(indtokens, ['$.', vcol, i]) - let next_i = i + 2 - - " Dot token: . - elseif a:line[i] ==# '.' - - let next_i = i + 1 - - if i + 1 ==# linelen || a:line[i + 1] =~# '[[:blank:]%]' - " End of clause token: . (as in: f() -> ok.) - call add(indtokens, ['<end_of_clause>', vcol, i]) - - else - " Possibilities: - " - Dot token in float: . (as in: 3.14) - " - Dot token in record: . (as in: #myrec.myfield) - call add(indtokens, ['.', vcol, i]) - endif - - " Equal sign - elseif a:line[i] ==# '=' - " This is handled separately so that "=<<" will be parsed as - " ['=', '<<'] instead of ['=<', '<']. Although Erlang parses it - " currently in the latter way, that may be fixed some day. - call add(indtokens, [a:line[i], vcol, i]) - let next_i = i + 1 - - " Three-character tokens - elseif i + 1 < linelen && - \ index(['=:=', '=/='], a:line[i : i + 1]) != -1 - call add(indtokens, [a:line[i : i + 1], vcol, i]) - let next_i = i + 2 - - " Two-character tokens - elseif i + 1 < linelen && - \ index(['->', '<<', '>>', '||', '==', '/=', '=<', '>=', '++', '--', - \ '::'], - \ a:line[i : i + 1]) != -1 - call add(indtokens, [a:line[i : i + 1], vcol, i]) - let next_i = i + 2 - - " Other character: , ; < > ( ) [ ] { } # + - * / : ? = ! | - else - call add(indtokens, [a:line[i], vcol, i]) - let next_i = i + 1 - - endif - - if next_vcol ==# '' - let vcol += next_i - i - else - let vcol = next_vcol - endif - - let i = next_i - - endwhile - - return indtokens - -endfunction - -" TODO: doc, handle "not found" case -function! s:GetIndtokenAtCol(indtokens, col) - let i = 0 - while i < len(a:indtokens) - if a:indtokens[i][2] ==# a:col - return [1, i] - elseif a:indtokens[i][2] > a:col - return [0, s:IndentError('No token at col ' . a:col . ', ' . - \'indtokens = ' . string(a:indtokens), - \'', '')] - endif - let i += 1 - endwhile - return [0, s:IndentError('No token at col ' . a:col . ', ' . - \'indtokens = ' . string(a:indtokens), - \'', '')] -endfunction - -" Stack library {{{1 -" ============= - -" Purpose: -" Push a token onto the parser's stack. -" Parameters: -" stack: [token] -" token: string -function! s:Push(stack, token) - call s:Log(' Stack Push: "' . a:token . '" into ' . string(a:stack)) - call insert(a:stack, a:token) -endfunction - -" Purpose: -" Pop a token from the parser's stack. -" Parameters: -" stack: [token] -" token: string -" Returns: -" token: string -- the removed element -function! s:Pop(stack) - let head = remove(a:stack, 0) - call s:Log(' Stack Pop: "' . head . '" from ' . string(a:stack)) - return head -endfunction - -" Library for accessing and storing tokenized lines {{{1 -" ================================================= - -" The Erlang token cache: an `lnum -> indtokens` dictionary that stores the -" tokenized lines. -let s:all_tokens = {} -let s:file_name = '' -let s:last_changedtick = -1 - -" Purpose: -" Clear the Erlang token cache if we have a different file or the file has -" been changed since the last indentation. -function! s:ClearTokenCacheIfNeeded() - let file_name = expand('%:p') - if file_name != s:file_name || - \ b:changedtick != s:last_changedtick - let s:file_name = file_name - let s:last_changedtick = b:changedtick - let s:all_tokens = {} - endif -endfunction - -" Purpose: -" Return the tokens of line `lnum`, if that line is not empty. If it is -" empty, find the first non-empty line in the given `direction` and return -" the tokens of that line. -" Parameters: -" lnum: integer -" direction: 'up' | 'down' -" Returns: -" result: [] -- the result is an empty list if we hit the beginning or end -" of the file -" | [lnum, indtokens] -" lnum: integer -- the index of the non-empty line that was found and -" tokenized -" indtokens: [indtoken] -- the tokens of line `lnum` -function! s:TokenizeLine(lnum, direction) - - call s:Log('Tokenizing starts from line ' . a:lnum) - if a:direction ==# 'up' - let lnum = prevnonblank(a:lnum) - else " a:direction ==# 'down' - let lnum = nextnonblank(a:lnum) - endif - - " We hit the beginning or end of the file - if lnum ==# 0 - let indtokens = [] - call s:Log(' We hit the beginning or end of the file.') - - " The line has already been parsed - elseif has_key(s:all_tokens, lnum) - let indtokens = s:all_tokens[lnum] - call s:Log('Cached line ' . lnum . ': ' . getline(lnum)) - call s:Log(" Tokens in the line:\n - " . join(indtokens, "\n - ")) - - " The line should be parsed now - else - - " Parse the line - let line = getline(lnum) - let string_continuation = s:IsLineStringContinuation(lnum) - let atom_continuation = s:IsLineAtomContinuation(lnum) - let indtokens = s:GetTokensFromLine(line, string_continuation, - \atom_continuation, &tabstop) - let s:all_tokens[lnum] = indtokens - call s:Log('Tokenizing line ' . lnum . ': ' . line) - call s:Log(" Tokens in the line:\n - " . join(indtokens, "\n - ")) - - endif - - return [lnum, indtokens] -endfunction - -" Purpose: -" As a helper function for PrevIndToken and NextIndToken, the FindIndToken -" function finds the first line with at least one token in the given -" direction. -" Parameters: -" lnum: integer -" direction: 'up' | 'down' -" Returns: -" result: [] -- the result is an empty list if we hit the beginning or end -" of the file -" | indtoken -function! s:FindIndToken(lnum, dir) - let lnum = a:lnum - while 1 - let lnum += (a:dir ==# 'up' ? -1 : 1) - let [lnum, indtokens] = s:TokenizeLine(lnum, a:dir) - if lnum ==# 0 - " We hit the beginning or end of the file - return [] - elseif !empty(indtokens) - return indtokens[a:dir ==# 'up' ? -1 : 0] - endif - endwhile -endfunction - -" Purpose: -" Find the token that directly precedes the given token. -" Parameters: -" lnum: integer -- the line of the given token -" i: the index of the given token within line `lnum` -" Returns: -" result = [] -- the result is an empty list if the given token is the first -" token of the file -" | indtoken -function! s:PrevIndToken(lnum, i) - call s:Log(' PrevIndToken called: lnum=' . a:lnum . ', i =' . a:i) - - " If the current line has a previous token, return that - if a:i > 0 - return s:all_tokens[a:lnum][a:i - 1] - else - return s:FindIndToken(a:lnum, 'up') - endif -endfunction - -" Purpose: -" Find the token that directly succeeds the given token. -" Parameters: -" lnum: integer -- the line of the given token -" i: the index of the given token within line `lnum` -" Returns: -" result = [] -- the result is an empty list if the given token is the last -" token of the file -" | indtoken -function! s:NextIndToken(lnum, i) - call s:Log(' NextIndToken called: lnum=' . a:lnum . ', i =' . a:i) - - " If the current line has a next token, return that - if len(s:all_tokens[a:lnum]) > a:i + 1 - return s:all_tokens[a:lnum][a:i + 1] - else - return s:FindIndToken(a:lnum, 'down') - endif -endfunction - -" ErlangCalcIndent helper functions {{{1 -" ================================= - -" Purpose: -" This function is called when the parser encounters a syntax error. -" -" If we encounter a syntax error, we return -" g:erlang_unexpected_token_indent, which is -1 by default. This means that -" the indentation of the LTI will not be changed. -" Parameter: -" msg: string -" token: string -" stack: [token] -" Returns: -" indent: integer -function! s:IndentError(msg, token, stack) - call s:Log('Indent error: ' . a:msg . ' -> return') - call s:Log(' Token = ' . a:token . ', ' . - \' stack = ' . string(a:stack)) - return g:erlang_unexpected_token_indent -endfunction - -" Purpose: -" This function is called when the parser encounters an unexpected token, -" and the parser will return the number given back by UnexpectedToken. -" -" If we encounter an unexpected token, we return -" g:erlang_unexpected_token_indent, which is -1 by default. This means that -" the indentation of the LTI will not be changed. -" Parameter: -" token: string -" stack: [token] -" Returns: -" indent: integer -function! s:UnexpectedToken(token, stack) - call s:Log(' Unexpected token ' . a:token . ', stack = ' . - \string(a:stack) . ' -> return') - return g:erlang_unexpected_token_indent -endfunction - -if !exists('g:erlang_unexpected_token_indent') - let g:erlang_unexpected_token_indent = -1 -endif - -" Purpose: -" Return whether the given line starts with a string continuation. -" Parameter: -" lnum: integer -" Returns: -" result: bool -" Example: -" f() -> % IsLineStringContinuation = false -" "This is a % IsLineStringContinuation = false -" multiline % IsLineStringContinuation = true -" string". % IsLineStringContinuation = true -function! s:IsLineStringContinuation(lnum) - if has('syntax_items') - return synIDattr(synID(a:lnum, 1, 0), 'name') =~# '^erlangString' - else - return 0 - endif -endfunction - -" Purpose: -" Return whether the given line starts with an atom continuation. -" Parameter: -" lnum: integer -" Returns: -" result: bool -" Example: -" 'function with % IsLineAtomContinuation = true, but should be false -" weird name'() -> % IsLineAtomContinuation = true -" ok. % IsLineAtomContinuation = false -function! s:IsLineAtomContinuation(lnum) - if has('syntax_items') - return synIDattr(synID(a:lnum, 1, 0), 'name') =~# '^erlangQuotedAtom' - else - return 0 - endif -endfunction - -" Purpose: -" Return whether the 'catch' token (which should be the `i`th token in line -" `lnum`) is standalone or part of a try-catch block, based on the preceding -" token. -" Parameters: -" lnum: integer -" i: integer -" Return: -" is_standalone: bool -function! s:IsCatchStandalone(lnum, i) - call s:Log(' IsCatchStandalone called: lnum=' . a:lnum . ', i=' . a:i) - let prev_indtoken = s:PrevIndToken(a:lnum, a:i) - - " If we hit the beginning of the file, it is not a catch in a try block - if prev_indtoken == [] - return 1 - endif - - let prev_token = prev_indtoken[0] - - if prev_token =~# '[A-Z_@0-9]' - let is_standalone = 0 - elseif prev_token =~# '[a-z]' - if index(['after', 'and', 'andalso', 'band', 'begin', 'bnot', 'bor', 'bsl', - \ 'bsr', 'bxor', 'case', 'catch', 'div', 'not', 'or', 'orelse', - \ 'rem', 'try', 'xor'], prev_token) != -1 - " If catch is after these keywords, it is standalone - let is_standalone = 1 - else - " If catch is after another keyword (e.g. 'end') or an atom, it is - " part of try-catch. - " - " Keywords: - " - may precede 'catch': end - " - may not precede 'catch': fun if of receive when - " - unused: cond let query - let is_standalone = 0 - endif - elseif index([')', ']', '}', '<string>', '<string_end>', '<quoted_atom>', - \ '<quoted_atom_end>', '$.'], prev_token) != -1 - let is_standalone = 0 - else - " This 'else' branch includes the following tokens: - " -> == /= =< < >= > =:= =/= + - * / ++ -- :: < > ; ( [ { ? = ! . | - let is_standalone = 1 - endif - - call s:Log(' "catch" preceded by "' . prev_token . '" -> catch ' . - \(is_standalone ? 'is standalone' : 'belongs to try-catch')) - return is_standalone - -endfunction - -" Purpose: -" This function is called when a begin-type element ('begin', 'case', -" '[', '<<', etc.) is found. It asks the caller to return if the stack -" Parameters: -" stack: [token] -" token: string -" curr_vcol: integer -" stored_vcol: integer -" sw: integer -- number of spaces to be used after the begin element as -" indentation -" Returns: -" result: [should_return, indent] -" should_return: bool -- if true, the caller should return `indent` to Vim -" indent -- integer -function! s:BeginElementFoundIfEmpty(stack, token, curr_vcol, stored_vcol, sw) - if empty(a:stack) - if a:stored_vcol ==# -1 - call s:Log(' "' . a:token . '" directly preceeds LTI -> return') - return [1, a:curr_vcol + a:sw] - else - call s:Log(' "' . a:token . - \'" token (whose expression includes LTI) found -> return') - return [1, a:stored_vcol] - endif - else - return [0, 0] - endif -endfunction - -" Purpose: -" This function is called when a begin-type element ('begin', 'case', '[', -" '<<', etc.) is found, and in some cases when 'after' and 'when' is found. -" It asks the caller to return if the stack is already empty. -" Parameters: -" stack: [token] -" token: string -" curr_vcol: integer -" stored_vcol: integer -" end_token: end token that belongs to the begin element found (e.g. if the -" begin element is 'begin', the end token is 'end') -" sw: integer -- number of spaces to be used after the begin element as -" indentation -" Returns: -" result: [should_return, indent] -" should_return: bool -- if true, the caller should return `indent` to Vim -" indent -- integer -function! s:BeginElementFound(stack, token, curr_vcol, stored_vcol, end_token, sw) - - " Return 'return' if the stack is empty - let [ret, res] = s:BeginElementFoundIfEmpty(a:stack, a:token, a:curr_vcol, - \a:stored_vcol, a:sw) - if ret | return [ret, res] | endif - - if a:stack[0] ==# a:end_token - call s:Log(' "' . a:token . '" pops "' . a:end_token . '"') - call s:Pop(a:stack) - if !empty(a:stack) && a:stack[0] ==# 'align_to_begin_element' - call s:Pop(a:stack) - if empty(a:stack) - return [1, a:curr_vcol] - else - return [1, s:UnexpectedToken(a:token, a:stack)] - endif - else - return [0, 0] - endif - else - return [1, s:UnexpectedToken(a:token, a:stack)] - endif -endfunction - -" Purpose: -" This function is called when we hit the beginning of a file or an -" end-of-clause token -- i.e. when we found the beginning of the current -" clause. -" -" If the stack contains an '->' or 'when', this means that we can return -" now, since we were looking for the beginning of the clause. -" Parameters: -" stack: [token] -" token: string -" stored_vcol: integer -" Returns: -" result: [should_return, indent] -" should_return: bool -- if true, the caller should return `indent` to Vim -" indent -- integer -function! s:BeginningOfClauseFound(stack, token, stored_vcol) - if !empty(a:stack) && a:stack[0] ==# 'when' - call s:Log(' BeginningOfClauseFound: "when" found in stack') - call s:Pop(a:stack) - if empty(a:stack) - call s:Log(' Stack is ["when"], so LTI is in a guard -> return') - return [1, a:stored_vcol + shiftwidth() + 2] - else - return [1, s:UnexpectedToken(a:token, a:stack)] - endif - elseif !empty(a:stack) && a:stack[0] ==# '->' - call s:Log(' BeginningOfClauseFound: "->" found in stack') - call s:Pop(a:stack) - if empty(a:stack) - call s:Log(' Stack is ["->"], so LTI is in function body -> return') - return [1, a:stored_vcol + shiftwidth()] - elseif a:stack[0] ==# ';' - call s:Pop(a:stack) - if empty(a:stack) - call s:Log(' Stack is ["->", ";"], so LTI is in a function head ' . - \'-> return') - return [0, a:stored_vcol] - else - return [1, s:UnexpectedToken(a:token, a:stack)] - endif - else - return [1, s:UnexpectedToken(a:token, a:stack)] - endif - else - return [0, 0] - endif -endfunction - -let g:erlang_indent_searchpair_timeout = 2000 - -" TODO -function! s:SearchPair(lnum, curr_col, start, middle, end) - call cursor(a:lnum, a:curr_col + 1) - let [lnum_new, col1_new] = - \searchpairpos(a:start, a:middle, a:end, 'bW', - \'synIDattr(synID(line("."), col("."), 0), "name") ' . - \'=~? "string\\|quotedatom\\|todo\\|comment\\|' . - \'erlangmodifier"', - \0, g:erlang_indent_searchpair_timeout) - return [lnum_new, col1_new - 1] -endfunction - -function! s:SearchEndPair(lnum, curr_col) - return s:SearchPair( - \ a:lnum, a:curr_col, - \ '\C\<\%(case\|try\|begin\|receive\|if\)\>\|' . - \ '\<fun\>\%(\s\|\n\|%.*$\)*(', - \ '', - \ '\<end\>') -endfunction - -" ErlangCalcIndent {{{1 -" ================ - -" Purpose: -" Calculate the indentation of the given line. -" Parameters: -" lnum: integer -- index of the line for which the indentation should be -" calculated -" stack: [token] -- initial stack -" Return: -" indent: integer -- if -1, that means "don't change the indentation"; -" otherwise it means "indent the line with `indent` -" number of spaces or equivalent tabs" -function! s:ErlangCalcIndent(lnum, stack) - let res = s:ErlangCalcIndent2(a:lnum, a:stack) - call s:Log("ErlangCalcIndent returned: " . res) - return res -endfunction - -function! s:ErlangCalcIndent2(lnum, stack) - - let lnum = a:lnum - let stored_vcol = -1 " Virtual column of the first character of the token that - " we currently think we might align to. - let mode = 'normal' - let stack = a:stack - let semicolon_abscol = '' - - " Walk through the lines of the buffer backwards (starting from the - " previous line) until we can decide how to indent the current line. - while 1 - - let [lnum, indtokens] = s:TokenizeLine(lnum, 'up') - - " Hit the start of the file - if lnum ==# 0 - let [ret, res] = s:BeginningOfClauseFound(stack, 'beginning_of_file', - \stored_vcol) - if ret | return res | endif - - return 0 - endif - - let i = len(indtokens) - 1 - let last_token_of_line = 1 - - while i >= 0 - - let [token, curr_vcol, curr_col] = indtokens[i] - call s:Log(' Analyzing the following token: ' . string(indtokens[i])) - - if len(stack) > 256 " TODO: magic number - return s:IndentError('Stack too long', token, stack) - endif - - if token ==# '<end_of_clause>' - let [ret, res] = s:BeginningOfClauseFound(stack, token, stored_vcol) - if ret | return res | endif - - if stored_vcol ==# -1 - call s:Log(' End of clause directly preceeds LTI -> return') - return 0 - else - call s:Log(' End of clause (but not end of line) -> return') - return stored_vcol - endif - - elseif stack == ['prev_term_plus'] - if token =~# '[a-zA-Z_@]' || - \ token ==# '<string>' || token ==# '<string_start>' || - \ token ==# '<quoted_atom>' || token ==# '<quoted_atom_start>' - call s:Log(' previous token found: curr_vcol + plus = ' . - \curr_vcol . " + " . plus) - return curr_vcol + plus - endif - - elseif token ==# 'begin' - let [ret, res] = s:BeginElementFound(stack, token, curr_vcol, - \stored_vcol, 'end', shiftwidth()) - if ret | return res | endif - - " case EXPR of BRANCHES end - " try EXPR catch BRANCHES end - " try EXPR after BODY end - " try EXPR catch BRANCHES after BODY end - " try EXPR of BRANCHES catch BRANCHES end - " try EXPR of BRANCHES after BODY end - " try EXPR of BRANCHES catch BRANCHES after BODY end - " receive BRANCHES end - " receive BRANCHES after BRANCHES end - - " This branch is not Emacs-compatible - elseif (index(['of', 'receive', 'after', 'if'], token) != -1 || - \ (token ==# 'catch' && !s:IsCatchStandalone(lnum, i))) && - \ !last_token_of_line && - \ (empty(stack) || stack ==# ['when'] || stack ==# ['->'] || - \ stack ==# ['->', ';']) - - " If we are after of/receive, but these are not the last - " tokens of the line, we want to indent like this: - " - " % stack == [] - " receive stored_vcol, - " LTI - " - " % stack == ['->', ';'] - " receive stored_vcol -> - " B; - " LTI - " - " % stack == ['->'] - " receive stored_vcol -> - " LTI - " - " % stack == ['when'] - " receive stored_vcol when - " LTI - - " stack = [] => LTI is a condition - " stack = ['->'] => LTI is a branch - " stack = ['->', ';'] => LTI is a condition - " stack = ['when'] => LTI is a guard - if empty(stack) || stack == ['->', ';'] - call s:Log(' LTI is in a condition after ' . - \'"of/receive/after/if/catch" -> return') - return stored_vcol - elseif stack == ['->'] - call s:Log(' LTI is in a branch after ' . - \'"of/receive/after/if/catch" -> return') - return stored_vcol + shiftwidth() - elseif stack == ['when'] - call s:Log(' LTI is in a guard after ' . - \'"of/receive/after/if/catch" -> return') - return stored_vcol + shiftwidth() - else - return s:UnexpectedToken(token, stack) - endif - - elseif index(['case', 'if', 'try', 'receive'], token) != -1 - - " stack = [] => LTI is a condition - " stack = ['->'] => LTI is a branch - " stack = ['->', ';'] => LTI is a condition - " stack = ['when'] => LTI is in a guard - if empty(stack) - " pass - elseif (token ==# 'case' && stack[0] ==# 'of') || - \ (token ==# 'if') || - \ (token ==# 'try' && (stack[0] ==# 'of' || - \ stack[0] ==# 'catch' || - \ stack[0] ==# 'after')) || - \ (token ==# 'receive') - - " From the indentation point of view, the keyword - " (of/catch/after/end) before the LTI is what counts, so - " when we reached these tokens, and the stack already had - " a catch/after/end, we didn't modify it. - " - " This way when we reach case/try/receive (i.e. now), - " there is at most one of/catch/after/end token in the - " stack. - if token ==# 'case' || token ==# 'try' || - \ (token ==# 'receive' && stack[0] ==# 'after') - call s:Pop(stack) - endif - - if empty(stack) - call s:Log(' LTI is in a condition; matching ' . - \'"case/if/try/receive" found') - let stored_vcol = curr_vcol + shiftwidth() - elseif stack[0] ==# 'align_to_begin_element' - call s:Pop(stack) - let stored_vcol = curr_vcol - elseif len(stack) > 1 && stack[0] ==# '->' && stack[1] ==# ';' - call s:Log(' LTI is in a condition; matching ' . - \'"case/if/try/receive" found') - call s:Pop(stack) - call s:Pop(stack) - let stored_vcol = curr_vcol + shiftwidth() - elseif stack[0] ==# '->' - call s:Log(' LTI is in a branch; matching ' . - \'"case/if/try/receive" found') - call s:Pop(stack) - let stored_vcol = curr_vcol + 2 * shiftwidth() - elseif stack[0] ==# 'when' - call s:Log(' LTI is in a guard; matching ' . - \'"case/if/try/receive" found') - call s:Pop(stack) - let stored_vcol = curr_vcol + 2 * shiftwidth() + 2 - endif - - endif - - let [ret, res] = s:BeginElementFound(stack, token, curr_vcol, - \stored_vcol, 'end', shiftwidth()) - if ret | return res | endif - - elseif token ==# 'fun' - let next_indtoken = s:NextIndToken(lnum, i) - call s:Log(' Next indtoken = ' . string(next_indtoken)) - - if !empty(next_indtoken) && next_indtoken[0] ==# '(' - " We have an anonymous function definition - " (e.g. "fun () -> ok end") - - " stack = [] => LTI is a condition - " stack = ['->'] => LTI is a branch - " stack = ['->', ';'] => LTI is a condition - " stack = ['when'] => LTI is in a guard - if empty(stack) - call s:Log(' LTI is in a condition; matching "fun" found') - let stored_vcol = curr_vcol + shiftwidth() - elseif len(stack) > 1 && stack[0] ==# '->' && stack[1] ==# ';' - call s:Log(' LTI is in a condition; matching "fun" found') - call s:Pop(stack) - call s:Pop(stack) - elseif stack[0] ==# '->' - call s:Log(' LTI is in a branch; matching "fun" found') - call s:Pop(stack) - let stored_vcol = curr_vcol + 2 * shiftwidth() - elseif stack[0] ==# 'when' - call s:Log(' LTI is in a guard; matching "fun" found') - call s:Pop(stack) - let stored_vcol = curr_vcol + 2 * shiftwidth() + 2 - endif - - let [ret, res] = s:BeginElementFound(stack, token, curr_vcol, - \stored_vcol, 'end', shiftwidth()) - if ret | return res | endif - else - " Pass: we have a function reference (e.g. "fun f/0") - endif - - elseif token ==# '[' - " Emacs compatibility - let [ret, res] = s:BeginElementFound(stack, token, curr_vcol, - \stored_vcol, ']', 1) - if ret | return res | endif - - elseif token ==# '<<' - " Emacs compatibility - let [ret, res] = s:BeginElementFound(stack, token, curr_vcol, - \stored_vcol, '>>', 2) - if ret | return res | endif - - elseif token ==# '(' || token ==# '{' - - let end_token = (token ==# '(' ? ')' : - \token ==# '{' ? '}' : 'error') - - if empty(stack) - " We found the opening paren whose block contains the LTI. - let mode = 'inside' - elseif stack[0] ==# end_token - call s:Log(' "' . token . '" pops "' . end_token . '"') - call s:Pop(stack) - - if !empty(stack) && stack[0] ==# 'align_to_begin_element' - " We found the opening paren whose closing paren - " starts LTI - let mode = 'align_to_begin_element' - else - " We found the opening pair for a closing paren that - " was already in the stack. - let mode = 'outside' - endif - else - return s:UnexpectedToken(token, stack) - endif - - if mode ==# 'inside' || mode ==# 'align_to_begin_element' - - if last_token_of_line && i != 0 - " Examples: {{{ - " - " mode == 'inside': - " - " my_func( - " LTI - " - " [Variable, { - " LTI - " - " mode == 'align_to_begin_element': - " - " my_func( - " Params - " ) % LTI - " - " [Variable, { - " Terms - " } % LTI - " }}} - let stack = ['prev_term_plus'] - let plus = (mode ==# 'inside' ? 2 : 1) - call s:Log(' "' . token . - \'" token found at end of line -> find previous token') - elseif mode ==# 'align_to_begin_element' - " Examples: {{{ - " - " mode == 'align_to_begin_element' && !last_token_of_line - " - " my_func(stored_vcol - " ) % LTI - " - " [Variable, {stored_vcol - " } % LTI - " - " mode == 'align_to_begin_element' && i == 0 - " - " ( - " stored_vcol - " ) % LTI - " - " { - " stored_vcol - " } % LTI - " }}} - call s:Log(' "' . token . '" token (whose closing token ' . - \'starts LTI) found -> return') - return curr_vcol - elseif stored_vcol ==# -1 - " Examples: {{{ - " - " mode == 'inside' && stored_vcol == -1 && !last_token_of_line - " - " my_func( - " LTI - " [Variable, { - " LTI - " - " mode == 'inside' && stored_vcol == -1 && i == 0 - " - " ( - " LTI - " - " { - " LTI - " }}} - call s:Log(' "' . token . - \'" token (which directly precedes LTI) found -> return') - return curr_vcol + 1 - else - " Examples: {{{ - " - " mode == 'inside' && stored_vcol != -1 && !last_token_of_line - " - " my_func(stored_vcol, - " LTI - " - " [Variable, {stored_vcol, - " LTI - " - " mode == 'inside' && stored_vcol != -1 && i == 0 - " - " (stored_vcol, - " LTI - " - " {stored_vcol, - " LTI - " }}} - call s:Log(' "' . token . - \'" token (whose block contains LTI) found -> return') - return stored_vcol - endif - endif - - elseif index(['end', ')', ']', '}', '>>'], token) != -1 - - " If we can be sure that there is synchronization in the Erlang - " syntax, we use searchpair to make the script quicker. Otherwise we - " just push the token onto the stack and keep parsing. - - " No synchronization -> no searchpair optimization - if !exists('b:erlang_syntax_synced') - call s:Push(stack, token) - - " We don't have searchpair optimization for '>>' - elseif token ==# '>>' - call s:Push(stack, token) - - elseif token ==# 'end' - let [lnum_new, col_new] = s:SearchEndPair(lnum, curr_col) - - if lnum_new ==# 0 - return s:IndentError('Matching token for "end" not found', - \token, stack) - else - if lnum_new != lnum - call s:Log(' Tokenize for "end" <<<<') - let [lnum, indtokens] = s:TokenizeLine(lnum_new, 'up') - call s:Log(' >>>> Tokenize for "end"') - endif - - let [success, i] = s:GetIndtokenAtCol(indtokens, col_new) - if !success | return i | endif - let [token, curr_vcol, curr_col] = indtokens[i] - call s:Log(' Match for "end" in line ' . lnum_new . ': ' . - \string(indtokens[i])) - endif - - else " token is one of the following: ')', ']', '}' - - call s:Push(stack, token) - - " We have to escape '[', because this string will be interpreted as a - " regexp - let open_paren = (token ==# ')' ? '(' : - \token ==# ']' ? '\[' : - \ '{') - - let [lnum_new, col_new] = s:SearchPair(lnum, curr_col, - \open_paren, '', token) - - if lnum_new ==# 0 - return s:IndentError('Matching token not found', - \token, stack) - else - if lnum_new != lnum - call s:Log(' Tokenize the opening paren <<<<') - let [lnum, indtokens] = s:TokenizeLine(lnum_new, 'up') - call s:Log(' >>>>') - endif - - let [success, i] = s:GetIndtokenAtCol(indtokens, col_new) - if !success | return i | endif - let [token, curr_vcol, curr_col] = indtokens[i] - call s:Log(' Match in line ' . lnum_new . ': ' . - \string(indtokens[i])) - - " Go back to the beginning of the loop and handle the opening paren - continue - endif - endif - - elseif token ==# ';' - - if empty(stack) - call s:Push(stack, ';') - elseif index([';', '->', 'when', 'end', 'after', 'catch'], - \stack[0]) != -1 - " Pass: - " - " - If the stack top is another ';', then one ';' is - " enough. - " - If the stack top is an '->' or a 'when', then we - " should keep that, because they signify the type of the - " LTI (branch, condition or guard). - " - From the indentation point of view, the keyword - " (of/catch/after/end) before the LTI is what counts, so - " if the stack already has a catch/after/end, we don't - " modify it. This way when we reach case/try/receive, - " there will be at most one of/catch/after/end token in - " the stack. - else - return s:UnexpectedToken(token, stack) - endif - - elseif token ==# '->' - - if empty(stack) && !last_token_of_line - call s:Log(' LTI is in expression after arrow -> return') - return stored_vcol - elseif empty(stack) || stack[0] ==# ';' || stack[0] ==# 'end' - " stack = [';'] -> LTI is either a branch or in a guard - " stack = ['->'] -> LTI is a condition - " stack = ['->', ';'] -> LTI is a branch - call s:Push(stack, '->') - elseif index(['->', 'when', 'end', 'after', 'catch'], stack[0]) != -1 - " Pass: - " - " - If the stack top is another '->', then one '->' is - " enough. - " - If the stack top is a 'when', then we should keep - " that, because this signifies that LTI is a in a guard. - " - From the indentation point of view, the keyword - " (of/catch/after/end) before the LTI is what counts, so - " if the stack already has a catch/after/end, we don't - " modify it. This way when we reach case/try/receive, - " there will be at most one of/catch/after/end token in - " the stack. - else - return s:UnexpectedToken(token, stack) - endif - - elseif token ==# 'when' - - " Pop all ';' from the top of the stack - while !empty(stack) && stack[0] ==# ';' - call s:Pop(stack) - endwhile - - if empty(stack) - if semicolon_abscol != '' - let stored_vcol = semicolon_abscol - endif - if !last_token_of_line - " Example: - " when A, - " LTI - let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol, - \stored_vcol, shiftwidth()) - if ret | return res | endif - else - " Example: - " when - " LTI - call s:Push(stack, token) - endif - elseif index(['->', 'when', 'end', 'after', 'catch'], stack[0]) != -1 - " Pass: - " - If the stack top is another 'when', then one 'when' is - " enough. - " - If the stack top is an '->' or a 'when', then we - " should keep that, because they signify the type of the - " LTI (branch, condition or guard). - " - From the indentation point of view, the keyword - " (of/catch/after/end) before the LTI is what counts, so - " if the stack already has a catch/after/end, we don't - " modify it. This way when we reach case/try/receive, - " there will be at most one of/catch/after/end token in - " the stack. - else - return s:UnexpectedToken(token, stack) - endif - - elseif token ==# 'of' || token ==# 'after' || - \ (token ==# 'catch' && !s:IsCatchStandalone(lnum, i)) - - if token ==# 'after' - " If LTI is between an 'after' and the corresponding - " 'end', then let's return - let [ret, res] = s:BeginElementFoundIfEmpty(stack, token, curr_vcol, - \stored_vcol, shiftwidth()) - if ret | return res | endif - endif - - if empty(stack) || stack[0] ==# '->' || stack[0] ==# 'when' - call s:Push(stack, token) - elseif stack[0] ==# 'catch' || stack[0] ==# 'after' || stack[0] ==# 'end' - " Pass: From the indentation point of view, the keyword - " (of/catch/after/end) before the LTI is what counts, so - " if the stack already has a catch/after/end, we don't - " modify it. This way when we reach case/try/receive, - " there will be at most one of/catch/after/end token in - " the stack. - else - return s:UnexpectedToken(token, stack) - endif - - elseif token ==# '||' && empty(stack) && !last_token_of_line - - call s:Log(' LTI is in expression after "||" -> return') - return stored_vcol - - else - call s:Log(' Misc token, stack unchanged = ' . string(stack)) - - endif - - if empty(stack) || stack[0] ==# '->' || stack[0] ==# 'when' - let stored_vcol = curr_vcol - let semicolon_abscol = '' - call s:Log(' Misc token when the stack is empty or has "->" ' . - \'-> setting stored_vcol to ' . stored_vcol) - elseif stack[0] ==# ';' - let semicolon_abscol = curr_vcol - call s:Log(' Setting semicolon-stored_vcol to ' . stored_vcol) - endif - - let i -= 1 - call s:Log(' Token processed. stored_vcol=' . stored_vcol) - - let last_token_of_line = 0 - - endwhile " iteration on tokens in a line - - call s:Log(' Line analyzed. stored_vcol=' . stored_vcol) - - if empty(stack) && stored_vcol != -1 && - \ (!empty(indtokens) && indtokens[0][0] != '<string_end>' && - \ indtokens[0][0] != '<quoted_atom_end>') - call s:Log(' Empty stack at the beginning of the line -> return') - return stored_vcol - endif - - let lnum -= 1 - - endwhile " iteration on lines - -endfunction - -" ErlangIndent function {{{1 -" ===================== - -function! ErlangIndent() - - call s:ClearTokenCacheIfNeeded() - - let currline = getline(v:lnum) - call s:Log('Indenting line ' . v:lnum . ': ' . currline) - - if s:IsLineStringContinuation(v:lnum) || s:IsLineAtomContinuation(v:lnum) - call s:Log('String or atom continuation found -> ' . - \'leaving indentation unchanged') - return -1 - endif - - let ml = matchlist(currline, - \'^\(\s*\)\(\%(end\|of\|catch\|after\)\>\|[)\]}]\|>>\)') - - " If the line has a special beginning, but not a standalone catch - if !empty(ml) && !(ml[2] ==# 'catch' && s:IsCatchStandalone(v:lnum, 0)) - - let curr_col = len(ml[1]) - - " If we can be sure that there is synchronization in the Erlang - " syntax, we use searchpair to make the script quicker. - if ml[2] ==# 'end' && exists('b:erlang_syntax_synced') - - let [lnum, col] = s:SearchEndPair(v:lnum, curr_col) - - if lnum ==# 0 - return s:IndentError('Matching token for "end" not found', - \'end', []) - else - call s:Log(' Tokenize for "end" <<<<') - let [lnum, indtokens] = s:TokenizeLine(lnum, 'up') - call s:Log(' >>>> Tokenize for "end"') - - let [success, i] = s:GetIndtokenAtCol(indtokens, col) - if !success | return i | endif - let [token, curr_vcol, curr_col] = indtokens[i] - call s:Log(' Match for "end" in line ' . lnum . ': ' . - \string(indtokens[i])) - return curr_vcol - endif - - else - - call s:Log(" Line type = 'end'") - let new_col = s:ErlangCalcIndent(v:lnum - 1, - \[ml[2], 'align_to_begin_element']) - endif - else - call s:Log(" Line type = 'normal'") - - let new_col = s:ErlangCalcIndent(v:lnum - 1, []) - if currline =~# '^\s*when\>' - let new_col += 2 - endif - endif - - if new_col < -1 - call s:Log('WARNING: returning new_col == ' . new_col) - return g:erlang_unexpected_token_indent - endif - - return new_col - -endfunction - -" Cleanup {{{1 -" ======= - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim: sw=2 et fdm=marker - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'erlang') == -1 " Vim indent file diff --git a/indent/eruby.vim b/indent/eruby.vim index 3bae537e..6fd76600 100644 --- a/indent/eruby.vim +++ b/indent/eruby.vim @@ -1,112 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: eRuby -" Maintainer: Tim Pope <vimNOSPAM@tpope.org> -" URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns <dougkearns@gmail.com> - -if exists("b:did_indent") - finish -endif - -runtime! indent/ruby.vim -unlet! b:did_indent -setlocal indentexpr= - -if exists("b:eruby_subtype") - exe "runtime! indent/".b:eruby_subtype.".vim" -else - runtime! indent/html.vim -endif -unlet! b:did_indent - -" Force HTML indent to not keep state. -let b:html_indent_usestate = 0 - -if &l:indentexpr == '' - if &l:cindent - let &l:indentexpr = 'cindent(v:lnum)' - else - let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))' - endif -endif -let b:eruby_subtype_indentexpr = &l:indentexpr - -let b:did_indent = 1 - -setlocal indentexpr=GetErubyIndent() -setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=else,=elsif,=rescue,=ensure,=when - -" Only define the function once. -if exists("*GetErubyIndent") - finish -endif - -" this file uses line continuations -let s:cpo_sav = &cpo -set cpo&vim - -function! GetErubyIndent(...) - " The value of a single shift-width - let sw = shiftwidth() - - if a:0 && a:1 == '.' - let v:lnum = line('.') - elseif a:0 && a:1 =~ '^\d' - let v:lnum = a:1 - endif - let vcol = col('.') - call cursor(v:lnum,1) - let inruby = searchpair('<%','','%>','W') - call cursor(v:lnum,vcol) - if inruby && getline(v:lnum) !~ '^<%\|^\s*[-=]\=%>' - let ind = GetRubyIndent(v:lnum) - else - exe "let ind = ".b:eruby_subtype_indentexpr - - " Workaround for Andy Wokula's HTML indent. This should be removed after - " some time, since the newest version is fixed in a different way. - if b:eruby_subtype_indentexpr =~# '^HtmlIndent(' - \ && exists('b:indent') - \ && type(b:indent) == type({}) - \ && has_key(b:indent, 'lnum') - " Force HTML indent to not keep state - let b:indent.lnum = -1 - endif - endif - let lnum = prevnonblank(v:lnum-1) - let line = getline(lnum) - let cline = getline(v:lnum) - if cline =~# '^\s*<%[-=]\=\s*\%(}\|end\|else\|\%(ensure\|rescue\|elsif\|when\).\{-\}\)\s*\%([-=]\=%>\|$\)' - let ind = ind - sw - endif - if line =~# '\S\s*<%[-=]\=\s*\%(}\|end\).\{-\}\s*\%([-=]\=%>\|$\)' - let ind = ind - sw - endif - if line =~# '\%({\|\<do\)\%(\s*|[^|]*|\)\=\s*[-=]\=%>' - let ind = ind + sw - elseif line =~# '<%[-=]\=\s*\%(module\|class\|def\|if\|for\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue\)\>.*%>' - let ind = ind + sw - endif - if line =~# '^\s*<%[=#-]\=\s*$' && cline !~# '^\s*end\>' - let ind = ind + sw - endif - if line !~# '^\s*<%' && line =~# '%>\s*$' && line !~# '^\s*end\>' - let ind = ind - sw - endif - if cline =~# '^\s*[-=]\=%>\s*$' - let ind = ind - sw - endif - return ind -endfunction - -let &cpo = s:cpo_sav -unlet! s:cpo_sav - -" vim:set sw=2 sts=2 ts=8 noet: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1 " Vim indent file diff --git a/indent/eterm.vim b/indent/eterm.vim deleted file mode 100644 index df80c058..00000000 --- a/indent/eterm.vim +++ /dev/null @@ -1,40 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Eterm configuration file -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetEtermIndent() -setlocal indentkeys=!^F,o,O,=end -setlocal nosmartindent - -if exists("*GetEtermIndent") - finish -endif - -function GetEtermIndent() - let lnum = prevnonblank(v:lnum - 1) - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - - if getline(lnum) =~ '^\s*begin\>' - let ind = ind + shiftwidth() - endif - - if getline(v:lnum) =~ '^\s*end\>' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -endif diff --git a/indent/falcon.vim b/indent/falcon.vim deleted file mode 100644 index 4d17d33d..00000000 --- a/indent/falcon.vim +++ /dev/null @@ -1,455 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Falcon -" Maintainer: Steven Oliver <oliver.steven@gmail.com> -" Website: https://steveno@github.com/steveno/falconpl-vim.git -" Credits: This is, to a great extent, a copy n' paste of ruby.vim. - -" 1. Setup {{{1 -" ============ - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal nosmartindent - -" Setup indent function and when to use it -setlocal indentexpr=FalconGetIndent(v:lnum) -setlocal indentkeys=0{,0},0),0],!^F,o,O,e -setlocal indentkeys+==~case,=~catch,=~default,=~elif,=~else,=~end,=~\" - -" Define the appropriate indent function but only once -if exists("*FalconGetIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" 2. Variables {{{1 -" ============ - -" Regex of syntax group names that are strings AND comments -let s:syng_strcom = '\<falcon\%(String\|StringEscape\|Comment\)\>' - -" Regex of syntax group names that are strings -let s:syng_string = '\<falcon\%(String\|StringEscape\)\>' - -" Regex that defines blocks. -" -" Note that there's a slight problem with this regex and s:continuation_regex. -" Code like this will be matched by both: -" -" method_call do |(a, b)| -" -" The reason is that the pipe matches a hanging "|" operator. -" -let s:block_regex = - \ '\%(\<do:\@!\>\|%\@<!{\)\s*\%(|\s*(*\s*\%([*@&]\=\h\w*,\=\s*\)\%(,\s*(*\s*[*@&]\=\h\w*\s*)*\s*\)*|\)\=\s*\%(#.*\)\=$' - -let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex - -" Regex that defines continuation lines. -" TODO: this needs to deal with if ...: and so on -let s:continuation_regex = - \ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$' - -" Regex that defines bracket continuations -let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$' - -" Regex that defines continuation lines, not including (, {, or [. -let s:non_bracket_continuation_regex = '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$' - -" Keywords to indent on -let s:falcon_indent_keywords = '^\s*\(case\|catch\|class\|enum\|default\|elif\|else' . - \ '\|for\|function\|if.*"[^"]*:.*"\|if \(\(:\)\@!.\)*$\|loop\|object\|select' . - \ '\|switch\|try\|while\|\w*\s*=\s*\w*([$\)' - -" Keywords to deindent on -let s:falcon_deindent_keywords = '^\s*\(case\|catch\|default\|elif\|else\|end\)' - -" 3. Functions {{{1 -" ============ - -" Check if the character at lnum:col is inside a string, comment, or is ascii. -function s:IsInStringOrComment(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom -endfunction - -" Check if the character at lnum:col is inside a string. -function s:IsInString(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string -endfunction - -" Check if the character at lnum:col is inside a string delimiter -function s:IsInStringDelimiter(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') == 'falconStringDelimiter' -endfunction - -" Find line above 'lnum' that isn't empty, in a comment, or in a string. -function s:PrevNonBlankNonString(lnum) - let in_block = 0 - let lnum = prevnonblank(a:lnum) - while lnum > 0 - " Go in and out of blocks comments as necessary. - " If the line isn't empty (with opt. comment) or in a string, end search. - let line = getline(lnum) - if line =~ '^=begin' - if in_block - let in_block = 0 - else - break - endif - elseif !in_block && line =~ '^=end' - let in_block = 1 - elseif !in_block && line !~ '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1) - \ && s:IsInStringOrComment(lnum, strlen(line))) - break - endif - let lnum = prevnonblank(lnum - 1) - endwhile - return lnum -endfunction - -" Find line above 'lnum' that started the continuation 'lnum' may be part of. -function s:GetMSL(lnum) - " Start on the line we're at and use its indent. - let msl = a:lnum - let msl_body = getline(msl) - let lnum = s:PrevNonBlankNonString(a:lnum - 1) - while lnum > 0 - " If we have a continuation line, or we're in a string, use line as MSL. - " Otherwise, terminate search as we have found our MSL already. - let line = getline(lnum) - - if s:Match(line, s:non_bracket_continuation_regex) && - \ s:Match(msl, s:non_bracket_continuation_regex) - " If the current line is a non-bracket continuation and so is the - " previous one, keep its indent and continue looking for an MSL. - " - " Example: - " method_call one, - " two, - " three - " - let msl = lnum - elseif s:Match(lnum, s:non_bracket_continuation_regex) && - \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) - " If the current line is a bracket continuation or a block-starter, but - " the previous is a non-bracket one, respect the previous' indentation, - " and stop here. - " - " Example: - " method_call one, - " two { - " three - " - return lnum - elseif s:Match(lnum, s:bracket_continuation_regex) && - \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) - " If both lines are bracket continuations (the current may also be a - " block-starter), use the current one's and stop here - " - " Example: - " method_call( - " other_method_call( - " foo - return msl - elseif s:Match(lnum, s:block_regex) && - \ !s:Match(msl, s:continuation_regex) && - \ !s:Match(msl, s:block_continuation_regex) - " If the previous line is a block-starter and the current one is - " mostly ordinary, use the current one as the MSL. - " - " Example: - " method_call do - " something - " something_else - return msl - else - let col = match(line, s:continuation_regex) + 1 - if (col > 0 && !s:IsInStringOrComment(lnum, col)) - \ || s:IsInString(lnum, strlen(line)) - let msl = lnum - else - break - endif - endif - - let msl_body = getline(msl) - let lnum = s:PrevNonBlankNonString(lnum - 1) - endwhile - return msl -endfunction - -" Check if line 'lnum' has more opening brackets than closing ones. -function s:ExtraBrackets(lnum) - let opening = {'parentheses': [], 'braces': [], 'brackets': []} - let closing = {'parentheses': [], 'braces': [], 'brackets': []} - - let line = getline(a:lnum) - let pos = match(line, '[][(){}]', 0) - - " Save any encountered opening brackets, and remove them once a matching - " closing one has been found. If a closing bracket shows up that doesn't - " close anything, save it for later. - while pos != -1 - if !s:IsInStringOrComment(a:lnum, pos + 1) - if line[pos] == '(' - call add(opening.parentheses, {'type': '(', 'pos': pos}) - elseif line[pos] == ')' - if empty(opening.parentheses) - call add(closing.parentheses, {'type': ')', 'pos': pos}) - else - let opening.parentheses = opening.parentheses[0:-2] - endif - elseif line[pos] == '{' - call add(opening.braces, {'type': '{', 'pos': pos}) - elseif line[pos] == '}' - if empty(opening.braces) - call add(closing.braces, {'type': '}', 'pos': pos}) - else - let opening.braces = opening.braces[0:-2] - endif - elseif line[pos] == '[' - call add(opening.brackets, {'type': '[', 'pos': pos}) - elseif line[pos] == ']' - if empty(opening.brackets) - call add(closing.brackets, {'type': ']', 'pos': pos}) - else - let opening.brackets = opening.brackets[0:-2] - endif - endif - endif - - let pos = match(line, '[][(){}]', pos + 1) - endwhile - - " Find the rightmost brackets, since they're the ones that are important in - " both opening and closing cases - let rightmost_opening = {'type': '(', 'pos': -1} - let rightmost_closing = {'type': ')', 'pos': -1} - - for opening in opening.parentheses + opening.braces + opening.brackets - if opening.pos > rightmost_opening.pos - let rightmost_opening = opening - endif - endfor - - for closing in closing.parentheses + closing.braces + closing.brackets - if closing.pos > rightmost_closing.pos - let rightmost_closing = closing - endif - endfor - - return [rightmost_opening, rightmost_closing] -endfunction - -function s:Match(lnum, regex) - let col = match(getline(a:lnum), '\C'.a:regex) + 1 - return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0 -endfunction - -function s:MatchLast(lnum, regex) - let line = getline(a:lnum) - let col = match(line, '.*\zs' . a:regex) - while col != -1 && s:IsInStringOrComment(a:lnum, col) - let line = strpart(line, 0, col) - let col = match(line, '.*' . a:regex) - endwhile - return col + 1 -endfunction - -" 4. FalconGetIndent Routine {{{1 -" ============ - -function FalconGetIndent(...) - " For the current line, use the first argument if given, else v:lnum - let clnum = a:0 ? a:1 : v:lnum - - " Use zero indent at the top of the file - if clnum == 0 - return 0 - endif - - let line = getline(clnum) - let ind = -1 - - " If we got a closing bracket on an empty line, find its match and indent - " according to it. For parentheses we indent to its column - 1, for the - " others we indent to the containing line's MSL's level. Return -1 if fail. - let col = matchend(line, '^\s*[]})]') - if col > 0 && !s:IsInStringOrComment(clnum, col) - call cursor(clnum, col) - let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2) - if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0 - if line[col-1]==')' && col('.') != col('$') - 1 - let ind = virtcol('.') - 1 - else - let ind = indent(s:GetMSL(line('.'))) - endif - endif - return ind - endif - - " If we have a deindenting keyword, find its match and indent to its level. - " TODO: this is messy - if s:Match(clnum, s:falcon_deindent_keywords) - call cursor(clnum, 1) - if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW', - \ s:end_skip_expr) > 0 - let msl = s:GetMSL(line('.')) - let line = getline(line('.')) - - if strpart(line, 0, col('.') - 1) =~ '=\s*$' && - \ strpart(line, col('.') - 1, 2) !~ 'do' - let ind = virtcol('.') - 1 - elseif getline(msl) =~ '=\s*\(#.*\)\=$' - let ind = indent(line('.')) - else - let ind = indent(msl) - endif - endif - return ind - endif - - " If we are in a multi-line string or line-comment, don't do anything to it. - if s:IsInString(clnum, matchend(line, '^\s*') + 1) - return indent('.') - endif - - " Find a non-blank, non-multi-line string line above the current line. - let lnum = s:PrevNonBlankNonString(clnum - 1) - - " If the line is empty and inside a string, use the previous line. - if line =~ '^\s*$' && lnum != prevnonblank(clnum - 1) - return indent(prevnonblank(clnum)) - endif - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - " Set up variables for the previous line. - let line = getline(lnum) - let ind = indent(lnum) - - " If the previous line ended with a block opening, add a level of indent. - if s:Match(lnum, s:block_regex) - return indent(s:GetMSL(lnum)) + shiftwidth() - endif - - " If it contained hanging closing brackets, find the rightmost one, find its - " match and indent according to that. - if line =~ '[[({]' || line =~ '[])}]\s*\%(#.*\)\=$' - let [opening, closing] = s:ExtraBrackets(lnum) - - if opening.pos != -1 - if opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0 - if col('.') + 1 == col('$') - return ind + shiftwidth() - else - return virtcol('.') - endif - else - let nonspace = matchend(line, '\S', opening.pos + 1) - 1 - return nonspace > 0 ? nonspace : ind + shiftwidth() - endif - elseif closing.pos != -1 - call cursor(lnum, closing.pos + 1) - normal! % - - if s:Match(line('.'), s:falcon_indent_keywords) - return indent('.') + shiftwidth() - else - return indent('.') - endif - else - call cursor(clnum, vcol) - end - endif - - " If the previous line ended with an "end", match that "end"s beginning's - " indent. - let col = s:Match(lnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$') - if col > 0 - call cursor(lnum, col) - if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW', - \ s:end_skip_expr) > 0 - let n = line('.') - let ind = indent('.') - let msl = s:GetMSL(n) - if msl != n - let ind = indent(msl) - end - return ind - endif - end - - let col = s:Match(lnum, s:falcon_indent_keywords) - if col > 0 - call cursor(lnum, col) - let ind = virtcol('.') - 1 + shiftwidth() - " TODO: make this better (we need to count them) (or, if a searchpair - " fails, we know that something is lacking an end and thus we indent a - " level - if s:Match(lnum, s:end_end_regex) - let ind = indent('.') - endif - return ind - endif - - " Set up variables to use and search for MSL to the previous line. - let p_lnum = lnum - let lnum = s:GetMSL(lnum) - - " If the previous line wasn't a MSL and is continuation return its indent. - " TODO: the || s:IsInString() thing worries me a bit. - if p_lnum != lnum - if s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line)) - return ind - endif - endif - - " Set up more variables, now that we know we wasn't continuation bound. - let line = getline(lnum) - let msl_ind = indent(lnum) - - " If the MSL line had an indenting keyword in it, add a level of indent. - " TODO: this does not take into account contrived things such as - " module Foo; class Bar; end - if s:Match(lnum, s:falcon_indent_keywords) - let ind = msl_ind + shiftwidth() - if s:Match(lnum, s:end_end_regex) - let ind = ind - shiftwidth() - endif - return ind - endif - - " If the previous line ended with [*+/.,-=], but wasn't a block ending or a - " closing bracket, indent one extra level. - if s:Match(lnum, s:non_bracket_continuation_regex) && !s:Match(lnum, '^\s*\([\])}]\|end\)') - if lnum == p_lnum - let ind = msl_ind + shiftwidth() - else - let ind = msl_ind - endif - return ind - endif - - return ind -endfunction - -" }}}1 - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim: set sw=4 sts=4 et tw=80 : - -endif diff --git a/indent/fortran.vim b/indent/fortran.vim deleted file mode 100644 index a7732d11..00000000 --- a/indent/fortran.vim +++ /dev/null @@ -1,222 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Fortran 2008 (and older: Fortran 2003, 95, 90, and 77) -" Version: 47 -" Last Change: 2016 Oct. 29 -" Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www2.unb.ca/~ajit/> -" Usage: For instructions, do :help fortran-indent from Vim -" Credits: -" Useful suggestions were made, in chronological order, by: -" Albert Oliver Serra, Takuya Fujiwara and Philipp Edelmann. - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -let s:cposet=&cpoptions -set cpoptions&vim - -setlocal indentkeys+==~end,=~case,=~if,=~else,=~do,=~where,=~elsewhere,=~select -setlocal indentkeys+==~endif,=~enddo,=~endwhere,=~endselect,=~elseif -setlocal indentkeys+==~type,=~interface,=~forall,=~associate,=~block,=~enum -setlocal indentkeys+==~endforall,=~endassociate,=~endblock,=~endenum -if exists("b:fortran_indent_more") || exists("g:fortran_indent_more") - setlocal indentkeys+==~function,=~subroutine,=~module,=~contains,=~program - setlocal indentkeys+==~endfunction,=~endsubroutine,=~endmodule - setlocal indentkeys+==~endprogram -endif - -" Determine whether this is a fixed or free format source file -" if this hasn't been done yet using the priority: -" buffer-local value -" > global value -" > file extension as in Intel ifort, gcc (gfortran), NAG, Pathscale, and Cray compilers -if !exists("b:fortran_fixed_source") - if exists("fortran_free_source") - " User guarantees free source form - let b:fortran_fixed_source = 0 - elseif exists("fortran_fixed_source") - " User guarantees fixed source form - let b:fortran_fixed_source = 1 - elseif expand("%:e") ==? "f\<90\|95\|03\|08\>" - " Free-form file extension defaults as in Intel ifort, gcc(gfortran), NAG, Pathscale, and Cray compilers - let b:fortran_fixed_source = 0 - elseif expand("%:e") ==? "f\|f77\|for" - " Fixed-form file extension defaults - let b:fortran_fixed_source = 1 - else - " Modern fortran still allows both fixed and free source form - " Assume fixed source form unless signs of free source form - " are detected in the first five columns of the first s:lmax lines. - " Detection becomes more accurate and time-consuming if more lines - " are checked. Increase the limit below if you keep lots of comments at - " the very top of each file and you have a fast computer. - let s:lmax = 500 - if ( s:lmax > line("$") ) - let s:lmax = line("$") - endif - let b:fortran_fixed_source = 1 - let s:ln=1 - while s:ln <= s:lmax - let s:test = strpart(getline(s:ln),0,5) - if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t' - let b:fortran_fixed_source = 0 - break - endif - let s:ln = s:ln + 1 - endwhile - endif -endif - -" Define the appropriate indent function but only once -if (b:fortran_fixed_source == 1) - setlocal indentexpr=FortranGetFixedIndent() - if exists("*FortranGetFixedIndent") - finish - endif -else - setlocal indentexpr=FortranGetFreeIndent() - if exists("*FortranGetFreeIndent") - finish - endif -endif - -function FortranGetIndent(lnum) - let ind = indent(a:lnum) - let prevline=getline(a:lnum) - " Strip tail comment - let prevstat=substitute(prevline, '!.*$', '', '') - let prev2line=getline(a:lnum-1) - let prev2stat=substitute(prev2line, '!.*$', '', '') - - "Indent do loops only if they are all guaranteed to be of do/end do type - if exists("b:fortran_do_enddo") || exists("g:fortran_do_enddo") - if prevstat =~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*do\>' - let ind = ind + shiftwidth() - endif - if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*end\s*do\>' - let ind = ind - shiftwidth() - endif - endif - - "Add a shiftwidth to statements following if, else, else if, case, class, - "where, else where, forall, type, interface and associate statements - if prevstat =~? '^\s*\(case\|class\|else\|else\s*if\|else\s*where\)\>' - \ ||prevstat=~? '^\s*\(type\|interface\|associate\|enum\)\>' - \ ||prevstat=~?'^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*\(forall\|where\|block\)\>' - \ ||prevstat=~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*if\>' - let ind = ind + shiftwidth() - " Remove unwanted indent after logical and arithmetic ifs - if prevstat =~? '\<if\>' && prevstat !~? '\<then\>' - let ind = ind - shiftwidth() - endif - " Remove unwanted indent after type( statements - if prevstat =~? '^\s*type\s*(' - let ind = ind - shiftwidth() - endif - endif - - "Indent program units unless instructed otherwise - if !exists("b:fortran_indent_less") && !exists("g:fortran_indent_less") - let prefix='\(\(pure\|impure\|elemental\|recursive\)\s\+\)\{,2}' - let type='\(\(integer\|real\|double\s\+precision\|complex\|logical' - \.'\|character\|type\|class\)\s*\S*\s\+\)\=' - if prevstat =~? '^\s*\(contains\|submodule\|program\)\>' - \ ||prevstat =~? '^\s*'.'module\>\(\s*\procedure\)\@!' - \ ||prevstat =~? '^\s*'.prefix.'subroutine\>' - \ ||prevstat =~? '^\s*'.prefix.type.'function\>' - \ ||prevstat =~? '^\s*'.type.prefix.'function\>' - let ind = ind + shiftwidth() - endif - if getline(v:lnum) =~? '^\s*contains\>' - \ ||getline(v:lnum)=~? '^\s*end\s*' - \ .'\(function\|subroutine\|module\|submodule\|program\)\>' - let ind = ind - shiftwidth() - endif - endif - - "Subtract a shiftwidth from else, else if, elsewhere, case, class, end if, - " end where, end select, end forall, end interface, end associate, - " end enum, end type, end block and end type statements - if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*' - \. '\(else\|else\s*if\|else\s*where\|case\|class\|' - \. 'end\s*\(if\|where\|select\|interface\|' - \. 'type\|forall\|associate\|enum\|block\)\)\>' - let ind = ind - shiftwidth() - " Fix indent for case statement immediately after select - if prevstat =~? '\<select\s\+\(case\|type\)\>' - let ind = ind + shiftwidth() - endif - endif - - "First continuation line - if prevstat =~ '&\s*$' && prev2stat !~ '&\s*$' - let ind = ind + shiftwidth() - endif - "Line after last continuation line - if prevstat !~ '&\s*$' && prev2stat =~ '&\s*$' && prevstat !~? '\<then\>' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -function FortranGetFreeIndent() - "Find the previous non-blank line - let lnum = prevnonblank(v:lnum - 1) - - "Use zero indent at the top of the file - if lnum == 0 - return 0 - endif - - let ind=FortranGetIndent(lnum) - return ind -endfunction - -function FortranGetFixedIndent() - let currline=getline(v:lnum) - "Don't indent comments, continuation lines and labelled lines - if strpart(currline,0,6) =~ '[^ \t]' - let ind = indent(v:lnum) - return ind - endif - - "Find the previous line which is not blank, not a comment, - "not a continuation line, and does not have a label - let lnum = v:lnum - 1 - while lnum > 0 - let prevline=getline(lnum) - if (prevline =~ "^[C*!]") || (prevline =~ "^\s*$") - \ || (strpart(prevline,5,1) !~ "[ 0]") - " Skip comments, blank lines and continuation lines - let lnum = lnum - 1 - else - let test=strpart(prevline,0,5) - if test =~ "[0-9]" - " Skip lines with statement numbers - let lnum = lnum - 1 - else - break - endif - endif - endwhile - - "First line must begin at column 7 - if lnum == 0 - return 6 - endif - - let ind=FortranGetIndent(lnum) - return ind -endfunction - -let &cpoptions=s:cposet -unlet s:cposet - -" vim:sw=2 tw=130 - -endif diff --git a/indent/framescript.vim b/indent/framescript.vim deleted file mode 100644 index 872d390c..00000000 --- a/indent/framescript.vim +++ /dev/null @@ -1,45 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: FrameScript -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2008-07-19 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetFrameScriptIndent() -setlocal indentkeys=!^F,o,O,0=~Else,0=~EndIf,0=~EndLoop,0=~EndSub -setlocal nosmartindent - -if exists("*GetFrameScriptIndent") - finish -endif - -function GetFrameScriptIndent() - let lnum = prevnonblank(v:lnum - 1) - - if lnum == 0 - return 0 - endif - - if getline(v:lnum) =~ '^\s*\*' - return cindent(v:lnum) - endif - - let ind = indent(lnum) - - if getline(lnum) =~? '^\s*\%(If\|Loop\|Sub\)' - let ind = ind + shiftwidth() - endif - - if getline(v:lnum) =~? '^\s*\%(Else\|End\%(If\|Loop\|Sub\)\)' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -endif diff --git a/indent/gitconfig.vim b/indent/gitconfig.vim index cc6330c1..e0e4a456 100644 --- a/indent/gitconfig.vim +++ b/indent/gitconfig.vim @@ -1,45 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: git config file -" Maintainer: Tim Pope <vimNOSPAM@tpope.org> -" Last Change: 2017 Jun 13 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent -setlocal indentexpr=GetGitconfigIndent() -setlocal indentkeys=o,O,*<Return>,0[,],0;,0#,=,!^F - -let b:undo_indent = 'setl ai< inde< indk<' - -" Only define the function once. -if exists("*GetGitconfigIndent") - finish -endif - -function! GetGitconfigIndent() - let sw = shiftwidth() - let line = getline(prevnonblank(v:lnum-1)) - let cline = getline(v:lnum) - if line =~ '\\\@<!\%(\\\\\)*\\$' - " odd number of slashes, in a line continuation - return 2 * sw - elseif cline =~ '^\s*\[' - return 0 - elseif cline =~ '^\s*\a' - return sw - elseif cline == '' && line =~ '^\[' - return sw - else - return -1 - endif -endfunction - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'git') == -1 " Vim indent file diff --git a/indent/gitolite.vim b/indent/gitolite.vim deleted file mode 100644 index 693b84bf..00000000 --- a/indent/gitolite.vim +++ /dev/null @@ -1,49 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: gitolite configuration -" URL: https://github.com/tmatilai/gitolite.vim -" Maintainer: Teemu Matilainen <teemu.matilainen@iki.fi> -" Last Change: 2017 Jun 13 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent -setlocal indentexpr=GetGitoliteIndent() -setlocal indentkeys=o,O,*<Return>,!^F,=repo,\",= - -" Only define the function once. -if exists("*GetGitoliteIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -function! GetGitoliteIndent() - let prevln = prevnonblank(v:lnum-1) - let pline = getline(prevln) - let cline = getline(v:lnum) - - if cline =~ '^\s*\(C\|R\|RW\|RW+\|RWC\|RW+C\|RWD\|RW+D\|RWCD\|RW+CD\|-\)[ \t=]' - return shiftwidth() - elseif cline =~ '^\s*config\s' - return shiftwidth() - elseif pline =~ '^\s*repo\s' && cline =~ '^\s*\(#.*\)\?$' - return shiftwidth() - elseif cline =~ '^\s*#' - return indent(prevln) - elseif cline =~ '^\s*$' - return -1 - else - return 0 - endif -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif diff --git a/indent/go.vim b/indent/go.vim index 98e42a8b..fd973e45 100644 --- a/indent/go.vim +++ b/indent/go.vim @@ -1,73 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Go -" Maintainer: David Barnett (https://github.com/google/vim-ft-go) -" Last Change: 2017 Jun 13 -" -" TODO: -" - function invocations split across lines -" - general line splits (line ends in an operator) - -if exists('b:did_indent') - finish -endif -let b:did_indent = 1 - -" C indentation is too far off useful, mainly due to Go's := operator. -" Let's just define our own. -setlocal nolisp -setlocal autoindent -setlocal indentexpr=GoIndent(v:lnum) -setlocal indentkeys+=<:>,0=},0=) - -if exists('*GoIndent') - finish -endif - -function! GoIndent(lnum) - let l:prevlnum = prevnonblank(a:lnum-1) - if l:prevlnum == 0 - " top of file - return 0 - endif - - " grab the previous and current line, stripping comments. - let l:prevl = substitute(getline(l:prevlnum), '//.*$', '', '') - let l:thisl = substitute(getline(a:lnum), '//.*$', '', '') - let l:previ = indent(l:prevlnum) - - let l:ind = l:previ - - if l:prevl =~ '[({]\s*$' - " previous line opened a block - let l:ind += shiftwidth() - endif - if l:prevl =~# '^\s*\(case .*\|default\):$' - " previous line is part of a switch statement - let l:ind += shiftwidth() - endif - " TODO: handle if the previous line is a label. - - if l:thisl =~ '^\s*[)}]' - " this line closed a block - let l:ind -= shiftwidth() - endif - - " Colons are tricky. - " We want to outdent if it's part of a switch ("case foo:" or "default:"). - " We ignore trying to deal with jump labels because (a) they're rare, and - " (b) they're hard to disambiguate from a composite literal key. - if l:thisl =~# '^\s*\(case .*\|default\):$' - let l:ind -= shiftwidth() - endif - - return l:ind -endfunction - -" vim: sw=2 sts=2 et - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'go') == -1 " Copyright 2011 The Go Authors. All rights reserved. diff --git a/indent/haml.vim b/indent/haml.vim index dcfc1168..c251a4c4 100644 --- a/indent/haml.vim +++ b/indent/haml.vim @@ -1,81 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Haml -" Maintainer: Tim Pope <vimNOSPAM@tpope.org> -" Last Change: 2017 Jun 13 - -if exists("b:did_indent") - finish -endif -runtime! indent/ruby.vim -unlet! b:did_indent -let b:did_indent = 1 - -setlocal autoindent sw=2 et -setlocal indentexpr=GetHamlIndent() -setlocal indentkeys=o,O,*<Return>,},],0),!^F,=end,=else,=elsif,=rescue,=ensure,=when - -" Only define the function once. -if exists("*GetHamlIndent") - finish -endif - -let s:attributes = '\%({.\{-\}}\|\[.\{-\}\]\)' -let s:tag = '\%([%.#][[:alnum:]_-]\+\|'.s:attributes.'\)*[<>]*' - -if !exists('g:haml_self_closing_tags') - let g:haml_self_closing_tags = 'base|link|meta|br|hr|img|input' -endif - -function! GetHamlIndent() - let lnum = prevnonblank(v:lnum-1) - if lnum == 0 - return 0 - endif - let line = substitute(getline(lnum),'\s\+$','','') - let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','') - let lastcol = strlen(line) - let line = substitute(line,'^\s\+','','') - let indent = indent(lnum) - let cindent = indent(v:lnum) - let sw = shiftwidth() - if cline =~# '\v^-\s*%(elsif|else|when)>' - let indent = cindent < indent ? cindent : indent - sw - endif - let increase = indent + sw - if indent == indent(lnum) - let indent = cindent <= indent ? -1 : increase - endif - - let group = synIDattr(synID(lnum,lastcol,1),'name') - - if line =~ '^!!!' - return indent - elseif line =~ '^/\%(\[[^]]*\]\)\=$' - return increase - elseif group == 'hamlFilter' - return increase - elseif line =~ '^'.s:tag.'[&!]\=[=~-]\s*\%(\%(if\|else\|elsif\|unless\|case\|when\|while\|until\|for\|begin\|module\|class\|def\)\>\%(.*\<end\>\)\@!\|.*do\%(\s*|[^|]*|\)\=\s*$\)' - return increase - elseif line =~ '^'.s:tag.'[&!]\=[=~-].*,\s*$' - return increase - elseif line == '-#' - return increase - elseif group =~? '\v^(hamlSelfCloser)$' || line =~? '^%\v%('.g:haml_self_closing_tags.')>' - return indent - elseif group =~? '\v^%(hamlTag|hamlAttributesDelimiter|hamlObjectDelimiter|hamlClass|hamlId|htmlTagName|htmlSpecialTagName)$' - return increase - elseif synIDattr(synID(v:lnum,1,1),'name') ==? 'hamlRubyFilter' - return GetRubyIndent() - else - return indent - endif -endfunction - -" vim:set sw=2: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'haml') == -1 " Vim indent file diff --git a/indent/hamster.vim b/indent/hamster.vim deleted file mode 100644 index 35f33fb1..00000000 --- a/indent/hamster.vim +++ /dev/null @@ -1,59 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Hamster Script -" Version: 2.0.6.0 -" Last Change: Wed Nov 08 2006 12:02:42 PM -" Maintainer: David Fishburn <fishburn@ianywhere.com> - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentkeys+==~if,=~else,=~endif,=~endfor,=~endwhile -setlocal indentkeys+==~do,=~until,=~while,=~repeat,=~for,=~loop -setlocal indentkeys+==~sub,=~endsub - -" Define the appropriate indent function but only once -setlocal indentexpr=HamGetFreeIndent() -if exists("*HamGetFreeIndent") - finish -endif - -function HamGetIndent(lnum) - let ind = indent(a:lnum) - let prevline=getline(a:lnum) - - " Add a shiftwidth to statements following if, else, elseif, - " case, select, default, do, until, while, for, start - if prevline =~? '^\s*\<\(if\|else\%(if\)\?\|for\|repeat\|do\|while\|sub\)\>' - let ind = ind + shiftwidth() - endif - - " Subtract a shiftwidth from else, elseif, end(if|while|for), until - let line = getline(v:lnum) - if line =~? '^\s*\(else\|elseif\|loop\|until\|end\%(if\|while\|for\|sub\)\)\>' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -function HamGetFreeIndent() - " Find the previous non-blank line - let lnum = prevnonblank(v:lnum - 1) - - " Use zero indent at the top of the file - if lnum == 0 - return 0 - endif - - let ind=HamGetIndent(lnum) - return ind -endfunction - -" vim:sw=2 tw=80 - -endif diff --git a/indent/hog.vim b/indent/hog.vim deleted file mode 100644 index e86bc181..00000000 --- a/indent/hog.vim +++ /dev/null @@ -1,81 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: hog (Snort.conf) -" Maintainer: Victor Roemer, <vroemer@badsec.org> -" Last Change: Mar 7, 2013 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 -let b:undo_indent = 'setlocal smartindent< indentexpr< indentkeys<' - -setlocal nosmartindent -setlocal indentexpr=GetHogIndent() -setlocal indentkeys+=!^F,o,O,0# - -" Only define the function once. -if exists("*GetHogIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -let s:syn_blocks = '\<SnortRuleTypeBody\>' - -function s:IsInBlock(lnum) - return synIDattr(synID(a:lnum, 1, 1), 'name') =~ s:syn_blocks -endfunction - -function GetHogIndent() - let prevlnum = prevnonblank(v:lnum-1) - - " Comment blocks have identical indent - if getline(v:lnum) =~ '^\s*#' && getline(prevlnum) =~ '^\s*#' - return indent(prevlnum) - endif - - " Ignore comment lines when calculating indent - while getline(prevlnum) =~ '^\s*#' - let prevlnum = prevnonblank(prevlnum-1) - if !prevlnum - return previndent - endif - endwhile - - " Continuation of a line that wasn't indented - let prevline = getline(prevlnum) - if prevline =~ '^\k\+.*\\\s*$' - return shiftwidth() - endif - - " Continuation of a line that was indented - if prevline =~ '\k\+.*\\\s*$' - return indent(prevlnum) - endif - - " Indent the next line if previous line contained a start of a block - " definition ('{' or '('). - if prevline =~ '^\k\+[^#]*{}\@!\s*$' " TODO || prevline =~ '^\k\+[^#]*()\@!\s*$' - return shiftwidth() - endif - - " Match inside of a block - if s:IsInBlock(v:lnum) - if prevline =~ "^\k\+.*$" - return shiftwidth() - else - return indent(prevlnum) - endif - endif - - return 0 -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif diff --git a/indent/html.vim b/indent/html.vim index 9fb6886a..1e5691f7 100644 --- a/indent/html.vim +++ b/indent/html.vim @@ -1,1059 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent script for HTML -" Header: "{{{ -" Maintainer: Bram Moolenaar -" Original Author: Andy Wokula <anwoku@yahoo.de> -" Last Change: 2017 Jun 13 -" Version: 1.0 -" Description: HTML indent script with cached state for faster indenting on a -" range of lines. -" Supports template systems through hooks. -" Supports Closure stylesheets. -" -" Credits: -" indent/html.vim (2006 Jun 05) from J. Zellner -" indent/css.vim (2006 Dec 20) from N. Weibull -" -" History: -" 2014 June (v1.0) overhaul (Bram) -" 2012 Oct 21 (v0.9) added support for shiftwidth() -" 2011 Sep 09 (v0.8) added HTML5 tags (thx to J. Zuckerman) -" 2008 Apr 28 (v0.6) revised customization -" 2008 Mar 09 (v0.5) fixed 'indk' issue (thx to C.J. Robinson) -"}}} - -" Init Folklore, check user settings (2nd time ++) -if exists("b:did_indent") "{{{ - finish -endif - -" Load the Javascript indent script first, it defines GetJavascriptIndent(). -" Undo the rest. -" Load base python indent. -if !exists('*GetJavascriptIndent') - runtime! indent/javascript.vim -endif -let b:did_indent = 1 - -setlocal indentexpr=HtmlIndent() -setlocal indentkeys=o,O,<Return>,<>>,{,},!^F - -" Needed for % to work when finding start/end of a tag. -setlocal matchpairs+=<:> - -let b:undo_indent = "setlocal inde< indk<" - -" b:hi_indent keeps state to speed up indenting consecutive lines. -let b:hi_indent = {"lnum": -1} - -"""""" Code below this is loaded only once. """"" -if exists("*HtmlIndent") && !exists('g:force_reload_html') - call HtmlIndent_CheckUserSettings() - finish -endif - -" Allow for line continuation below. -let s:cpo_save = &cpo -set cpo-=C -"}}} - -" Check and process settings from b:html_indent and g:html_indent... variables. -" Prefer using buffer-local settings over global settings, so that there can -" be defaults for all HTML files and exceptions for specific types of HTML -" files. -func! HtmlIndent_CheckUserSettings() - "{{{ - let inctags = '' - if exists("b:html_indent_inctags") - let inctags = b:html_indent_inctags - elseif exists("g:html_indent_inctags") - let inctags = g:html_indent_inctags - endif - let b:hi_tags = {} - if len(inctags) > 0 - call s:AddITags(b:hi_tags, split(inctags, ",")) - endif - - let autotags = '' - if exists("b:html_indent_autotags") - let autotags = b:html_indent_autotags - elseif exists("g:html_indent_autotags") - let autotags = g:html_indent_autotags - endif - let b:hi_removed_tags = {} - if len(autotags) > 0 - call s:RemoveITags(b:hi_removed_tags, split(autotags, ",")) - endif - - " Syntax names indicating being inside a string of an attribute value. - let string_names = [] - if exists("b:html_indent_string_names") - let string_names = b:html_indent_string_names - elseif exists("g:html_indent_string_names") - let string_names = g:html_indent_string_names - endif - let b:hi_insideStringNames = ['htmlString'] - if len(string_names) > 0 - for s in string_names - call add(b:hi_insideStringNames, s) - endfor - endif - - " Syntax names indicating being inside a tag. - let tag_names = [] - if exists("b:html_indent_tag_names") - let tag_names = b:html_indent_tag_names - elseif exists("g:html_indent_tag_names") - let tag_names = g:html_indent_tag_names - endif - let b:hi_insideTagNames = ['htmlTag', 'htmlScriptTag'] - if len(tag_names) > 0 - for s in tag_names - call add(b:hi_insideTagNames, s) - endfor - endif - - let indone = {"zero": 0 - \,"auto": "indent(prevnonblank(v:lnum-1))" - \,"inc": "b:hi_indent.blocktagind + shiftwidth()"} - - let script1 = '' - if exists("b:html_indent_script1") - let script1 = b:html_indent_script1 - elseif exists("g:html_indent_script1") - let script1 = g:html_indent_script1 - endif - if len(script1) > 0 - let b:hi_js1indent = get(indone, script1, indone.zero) - else - let b:hi_js1indent = 0 - endif - - let style1 = '' - if exists("b:html_indent_style1") - let style1 = b:html_indent_style1 - elseif exists("g:html_indent_style1") - let style1 = g:html_indent_style1 - endif - if len(style1) > 0 - let b:hi_css1indent = get(indone, style1, indone.zero) - else - let b:hi_css1indent = 0 - endif - - if !exists('b:html_indent_line_limit') - if exists('g:html_indent_line_limit') - let b:html_indent_line_limit = g:html_indent_line_limit - else - let b:html_indent_line_limit = 200 - endif - endif -endfunc "}}} - -" Init Script Vars -"{{{ -let b:hi_lasttick = 0 -let b:hi_newstate = {} -let s:countonly = 0 - "}}} - -" Fill the s:indent_tags dict with known tags. -" The key is "tagname" or "/tagname". {{{ -" The value is: -" 1 opening tag -" 2 "pre" -" 3 "script" -" 4 "style" -" 5 comment start -" 6 conditional comment start -" -1 closing tag -" -2 "/pre" -" -3 "/script" -" -4 "/style" -" -5 comment end -" -6 conditional comment end -let s:indent_tags = {} -let s:endtags = [0,0,0,0,0,0,0] " long enough for the highest index -"}}} - -" Add a list of tag names for a pair of <tag> </tag> to "tags". -func! s:AddITags(tags, taglist) - "{{{ - for itag in a:taglist - let a:tags[itag] = 1 - let a:tags['/' . itag] = -1 - endfor -endfunc "}}} - -" Take a list of tag name pairs that are not to be used as tag pairs. -func! s:RemoveITags(tags, taglist) - "{{{ - for itag in a:taglist - let a:tags[itag] = 1 - let a:tags['/' . itag] = 1 - endfor -endfunc "}}} - -" Add a block tag, that is a tag with a different kind of indenting. -func! s:AddBlockTag(tag, id, ...) - "{{{ - if !(a:id >= 2 && a:id < len(s:endtags)) - echoerr 'AddBlockTag ' . a:id - return - endif - let s:indent_tags[a:tag] = a:id - if a:0 == 0 - let s:indent_tags['/' . a:tag] = -a:id - let s:endtags[a:id] = "</" . a:tag . ">" - else - let s:indent_tags[a:1] = -a:id - let s:endtags[a:id] = a:1 - endif -endfunc "}}} - -" Add known tag pairs. -" Self-closing tags and tags that are sometimes {{{ -" self-closing (e.g., <p>) are not here (when encountering </p> we can find -" the matching <p>, but not the other way around). -" Old HTML tags: -call s:AddITags(s:indent_tags, [ - \ 'a', 'abbr', 'acronym', 'address', 'b', 'bdo', 'big', - \ 'blockquote', 'body', 'button', 'caption', 'center', 'cite', 'code', - \ 'colgroup', 'del', 'dfn', 'dir', 'div', 'dl', 'em', 'fieldset', 'font', - \ 'form', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'html', - \ 'i', 'iframe', 'ins', 'kbd', 'label', 'legend', 'li', - \ 'map', 'menu', 'noframes', 'noscript', 'object', 'ol', - \ 'optgroup', 'q', 's', 'samp', 'select', 'small', 'span', 'strong', 'sub', - \ 'sup', 'table', 'textarea', 'title', 'tt', 'u', 'ul', 'var', 'th', 'td', - \ 'tr', 'tbody', 'tfoot', 'thead']) - -" New HTML5 elements: -call s:AddITags(s:indent_tags, [ - \ 'area', 'article', 'aside', 'audio', 'bdi', 'canvas', - \ 'command', 'data', 'datalist', 'details', 'embed', 'figcaption', - \ 'figure', 'footer', 'header', 'keygen', 'mark', 'meter', 'nav', 'output', - \ 'progress', 'rp', 'rt', 'ruby', 'section', 'source', 'summary', 'svg', - \ 'time', 'track', 'video', 'wbr']) - -" Tags added for web components: -call s:AddITags(s:indent_tags, [ - \ 'content', 'shadow', 'template']) -"}}} - -" Add Block Tags: these contain alien content -"{{{ -call s:AddBlockTag('pre', 2) -call s:AddBlockTag('script', 3) -call s:AddBlockTag('style', 4) -call s:AddBlockTag('<!--', 5, '-->') -call s:AddBlockTag('<!--[', 6, '![endif]-->') -"}}} - -" Return non-zero when "tagname" is an opening tag, not being a block tag, for -" which there should be a closing tag. Can be used by scripts that include -" HTML indenting. -func! HtmlIndent_IsOpenTag(tagname) - "{{{ - if get(s:indent_tags, a:tagname) == 1 - return 1 - endif - return get(b:hi_tags, a:tagname) == 1 -endfunc "}}} - -" Get the value for "tagname", taking care of buffer-local tags. -func! s:get_tag(tagname) - "{{{ - let i = get(s:indent_tags, a:tagname) - if (i == 1 || i == -1) && get(b:hi_removed_tags, a:tagname) != 0 - return 0 - endif - if i == 0 - let i = get(b:hi_tags, a:tagname) - endif - return i -endfunc "}}} - -" Count the number of start and end tags in "text". -func! s:CountITags(text) - "{{{ - " Store the result in s:curind and s:nextrel. - let s:curind = 0 " relative indent steps for current line [unit &sw]: - let s:nextrel = 0 " relative indent steps for next line [unit &sw]: - let s:block = 0 " assume starting outside of a block - let s:countonly = 1 " don't change state - call substitute(a:text, '<\zs/\=\w\+\(-\w\+\)*\>\|<!--\[\|\[endif\]-->\|<!--\|-->', '\=s:CheckTag(submatch(0))', 'g') - let s:countonly = 0 -endfunc "}}} - -" Count the number of start and end tags in text. -func! s:CountTagsAndState(text) - "{{{ - " Store the result in s:curind and s:nextrel. Update b:hi_newstate.block. - let s:curind = 0 " relative indent steps for current line [unit &sw]: - let s:nextrel = 0 " relative indent steps for next line [unit &sw]: - - let s:block = b:hi_newstate.block - let tmp = substitute(a:text, '<\zs/\=\w\+\(-\w\+\)*\>\|<!--\[\|\[endif\]-->\|<!--\|-->', '\=s:CheckTag(submatch(0))', 'g') - if s:block == 3 - let b:hi_newstate.scripttype = s:GetScriptType(matchstr(tmp, '\C.*<SCRIPT\>\zs[^>]*')) - endif - let b:hi_newstate.block = s:block -endfunc "}}} - -" Used by s:CountITags() and s:CountTagsAndState(). -func! s:CheckTag(itag) - "{{{ - " Returns an empty string or "SCRIPT". - " a:itag can be "tag" or "/tag" or "<!--" or "-->" - if (s:CheckCustomTag(a:itag)) - return "" - endif - let ind = s:get_tag(a:itag) - if ind == -1 - " closing tag - if s:block != 0 - " ignore itag within a block - return "" - endif - if s:nextrel == 0 - let s:curind -= 1 - else - let s:nextrel -= 1 - endif - elseif ind == 1 - " opening tag - if s:block != 0 - return "" - endif - let s:nextrel += 1 - elseif ind != 0 - " block-tag (opening or closing) - return s:CheckBlockTag(a:itag, ind) - " else ind==0 (other tag found): keep indent - endif - return "" -endfunc "}}} - -" Used by s:CheckTag(). Returns an empty string or "SCRIPT". -func! s:CheckBlockTag(blocktag, ind) - "{{{ - if a:ind > 0 - " a block starts here - if s:block != 0 - " already in a block (nesting) - ignore - " especially ignore comments after other blocktags - return "" - endif - let s:block = a:ind " block type - if s:countonly - return "" - endif - let b:hi_newstate.blocklnr = v:lnum - " save allover indent for the endtag - let b:hi_newstate.blocktagind = b:hi_indent.baseindent + (s:nextrel + s:curind) * shiftwidth() - if a:ind == 3 - return "SCRIPT" " all except this must be lowercase - " line is to be checked again for the type attribute - endif - else - let s:block = 0 - " we get here if starting and closing a block-tag on the same line - endif - return "" -endfunc "}}} - -" Used by s:CheckTag(). -func! s:CheckCustomTag(ctag) - "{{{ - " Returns 1 if ctag is the tag for a custom element, 0 otherwise. - " a:ctag can be "tag" or "/tag" or "<!--" or "-->" - let pattern = '\%\(\w\+-\)\+\w\+' - if match(a:ctag, pattern) == -1 - return 0 - endif - if matchstr(a:ctag, '\/\ze.\+') == "/" - " closing tag - if s:block != 0 - " ignore ctag within a block - return 1 - endif - if s:nextrel == 0 - let s:curind -= 1 - else - let s:nextrel -= 1 - endif - else - " opening tag - if s:block != 0 - return 1 - endif - let s:nextrel += 1 - endif - return 1 -endfunc "}}} - -" Return the <script> type: either "javascript" or "" -func! s:GetScriptType(str) - "{{{ - if a:str == "" || a:str =~ "java" - return "javascript" - else - return "" - endif -endfunc "}}} - -" Look back in the file, starting at a:lnum - 1, to compute a state for the -" start of line a:lnum. Return the new state. -func! s:FreshState(lnum) - "{{{ - " A state is to know ALL relevant details about the - " lines 1..a:lnum-1, initial calculating (here!) can be slow, but updating is - " fast (incremental). - " TODO: this should be split up in detecting the block type and computing the - " indent for the block type, so that when we do not know the indent we do - " not need to clear the whole state and re-detect the block type again. - " State: - " lnum last indented line == prevnonblank(a:lnum - 1) - " block = 0 a:lnum located within special tag: 0:none, 2:<pre>, - " 3:<script>, 4:<style>, 5:<!--, 6:<!--[ - " baseindent use this indent for line a:lnum as a start - kind of - " autoindent (if block==0) - " scripttype = '' type attribute of a script tag (if block==3) - " blocktagind indent for current opening (get) and closing (set) - " blocktag (if block!=0) - " blocklnr lnum of starting blocktag (if block!=0) - " inattr line {lnum} starts with attributes of a tag - let state = {} - let state.lnum = prevnonblank(a:lnum - 1) - let state.scripttype = "" - let state.blocktagind = -1 - let state.block = 0 - let state.baseindent = 0 - let state.blocklnr = 0 - let state.inattr = 0 - - if state.lnum == 0 - return state - endif - - " Heuristic: - " remember startline state.lnum - " look back for <pre, </pre, <script, </script, <style, </style tags - " remember stopline - " if opening tag found, - " assume a:lnum within block - " else - " look back in result range (stopline, startline) for comment - " \ delimiters (<!--, -->) - " if comment opener found, - " assume a:lnum within comment - " else - " assume usual html for a:lnum - " if a:lnum-1 has a closing comment - " look back to get indent of comment opener - " FI - - " look back for a blocktag - let stopline2 = v:lnum + 1 - if has_key(b:hi_indent, 'block') && b:hi_indent.block > 5 - let [stopline2, stopcol2] = searchpos('<!--', 'bnW') - endif - let [stopline, stopcol] = searchpos('\c<\zs\/\=\%(pre\>\|script\>\|style\>\)', "bnW") - if stopline > 0 && stopline < stopline2 - " ugly ... why isn't there searchstr() - let tagline = tolower(getline(stopline)) - let blocktag = matchstr(tagline, '\/\=\%(pre\>\|script\>\|style\>\)', stopcol - 1) - if blocktag[0] != "/" - " opening tag found, assume a:lnum within block - let state.block = s:indent_tags[blocktag] - if state.block == 3 - let state.scripttype = s:GetScriptType(matchstr(tagline, '\>[^>]*', stopcol)) - endif - let state.blocklnr = stopline - " check preceding tags in the line: - call s:CountITags(tagline[: stopcol-2]) - let state.blocktagind = indent(stopline) + (s:curind + s:nextrel) * shiftwidth() - return state - elseif stopline == state.lnum - " handle special case: previous line (= state.lnum) contains a - " closing blocktag which is preceded by line-noise; - " blocktag == "/..." - let swendtag = match(tagline, '^\s*</') >= 0 - if !swendtag - let [bline, bcol] = searchpos('<'.blocktag[1:].'\>', "bnW") - call s:CountITags(tolower(getline(bline)[: bcol-2])) - let state.baseindent = indent(bline) + (s:curind + s:nextrel) * shiftwidth() - return state - endif - endif - endif - if stopline > stopline2 - let stopline = stopline2 - let stopcol = stopcol2 - endif - - " else look back for comment - let [comlnum, comcol, found] = searchpos('\(<!--\[\)\|\(<!--\)\|-->', 'bpnW', stopline) - if found == 2 || found == 3 - " comment opener found, assume a:lnum within comment - let state.block = (found == 3 ? 5 : 6) - let state.blocklnr = comlnum - " check preceding tags in the line: - call s:CountITags(tolower(getline(comlnum)[: comcol-2])) - if found == 2 - let state.baseindent = b:hi_indent.baseindent - endif - let state.blocktagind = indent(comlnum) + (s:curind + s:nextrel) * shiftwidth() - return state - endif - - " else within usual HTML - let text = tolower(getline(state.lnum)) - - " Check a:lnum-1 for closing comment (we need indent from the opening line). - " Not when other tags follow (might be --> inside a string). - let comcol = stridx(text, '-->') - if comcol >= 0 && match(text, '[<>]', comcol) <= 0 - call cursor(state.lnum, comcol + 1) - let [comlnum, comcol] = searchpos('<!--', 'bW') - if comlnum == state.lnum - let text = text[: comcol-2] - else - let text = tolower(getline(comlnum)[: comcol-2]) - endif - call s:CountITags(text) - let state.baseindent = indent(comlnum) + (s:curind + s:nextrel) * shiftwidth() - " TODO check tags that follow "-->" - return state - endif - - " Check if the previous line starts with end tag. - let swendtag = match(text, '^\s*</') >= 0 - - " If previous line ended in a closing tag, line up with the opening tag. - if !swendtag && text =~ '</\w\+\s*>\s*$' - call cursor(state.lnum, 99999) - normal! F< - let start_lnum = HtmlIndent_FindStartTag() - if start_lnum > 0 - let state.baseindent = indent(start_lnum) - if col('.') > 2 - " check for tags before the matching opening tag. - let text = getline(start_lnum) - let swendtag = match(text, '^\s*</') >= 0 - call s:CountITags(text[: col('.') - 2]) - let state.baseindent += s:nextrel * shiftwidth() - if !swendtag - let state.baseindent += s:curind * shiftwidth() - endif - endif - return state - endif - endif - - " Else: no comments. Skip backwards to find the tag we're inside. - let [state.lnum, found] = HtmlIndent_FindTagStart(state.lnum) - " Check if that line starts with end tag. - let text = getline(state.lnum) - let swendtag = match(text, '^\s*</') >= 0 - call s:CountITags(tolower(text)) - let state.baseindent = indent(state.lnum) + s:nextrel * shiftwidth() - if !swendtag - let state.baseindent += s:curind * shiftwidth() - endif - return state -endfunc "}}} - -" Indent inside a <pre> block: Keep indent as-is. -func! s:Alien2() - "{{{ - return -1 -endfunc "}}} - -" Return the indent inside a <script> block for javascript. -func! s:Alien3() - "{{{ - let lnum = prevnonblank(v:lnum - 1) - while lnum > 1 && getline(lnum) =~ '^\s*/[/*]' - " Skip over comments to avoid that cindent() aligns with the <script> tag - let lnum = prevnonblank(lnum - 1) - endwhile - if lnum == b:hi_indent.blocklnr - " indent for the first line after <script> - return eval(b:hi_js1indent) - endif - if b:hi_indent.scripttype == "javascript" - return GetJavascriptIndent() - else - return -1 - endif -endfunc "}}} - -" Return the indent inside a <style> block. -func! s:Alien4() - "{{{ - if prevnonblank(v:lnum-1) == b:hi_indent.blocklnr - " indent for first content line - return eval(b:hi_css1indent) - endif - return s:CSSIndent() -endfunc "}}} - -" Indending inside a <style> block. Returns the indent. -func! s:CSSIndent() - "{{{ - " This handles standard CSS and also Closure stylesheets where special lines - " start with @. - " When the line starts with '*' or the previous line starts with "/*" - " and does not end in "*/", use C indenting to format the comment. - " Adopted $VIMRUNTIME/indent/css.vim - let curtext = getline(v:lnum) - if curtext =~ '^\s*[*]' - \ || (v:lnum > 1 && getline(v:lnum - 1) =~ '\s*/\*' - \ && getline(v:lnum - 1) !~ '\*/\s*$') - return cindent(v:lnum) - endif - - let min_lnum = b:hi_indent.blocklnr - let prev_lnum = s:CssPrevNonComment(v:lnum - 1, min_lnum) - let [prev_lnum, found] = HtmlIndent_FindTagStart(prev_lnum) - if prev_lnum <= min_lnum - " Just below the <style> tag, indent for first content line after comments. - return eval(b:hi_css1indent) - endif - - " If the current line starts with "}" align with it's match. - if curtext =~ '^\s*}' - call cursor(v:lnum, 1) - try - normal! % - " Found the matching "{", align with it after skipping unfinished lines. - let align_lnum = s:CssFirstUnfinished(line('.'), min_lnum) - return indent(align_lnum) - catch - " can't find it, try something else, but it's most likely going to be - " wrong - endtry - endif - - " add indent after { - let brace_counts = HtmlIndent_CountBraces(prev_lnum) - let extra = brace_counts.c_open * shiftwidth() - - let prev_text = getline(prev_lnum) - let below_end_brace = prev_text =~ '}\s*$' - - " Search back to align with the first line that's unfinished. - let align_lnum = s:CssFirstUnfinished(prev_lnum, min_lnum) - - " Handle continuation lines if aligning with previous line and not after a - " "}". - if extra == 0 && align_lnum == prev_lnum && !below_end_brace - let prev_hasfield = prev_text =~ '^\s*[a-zA-Z0-9-]\+:' - let prev_special = prev_text =~ '^\s*\(/\*\|@\)' - if curtext =~ '^\s*\(/\*\|@\)' - " if the current line is not a comment or starts with @ (used by template - " systems) reduce indent if previous line is a continuation line - if !prev_hasfield && !prev_special - let extra = -shiftwidth() - endif - else - let cur_hasfield = curtext =~ '^\s*[a-zA-Z0-9-]\+:' - let prev_unfinished = s:CssUnfinished(prev_text) - if !cur_hasfield && (prev_hasfield || prev_unfinished) - " Continuation line has extra indent if the previous line was not a - " continuation line. - let extra = shiftwidth() - " Align with @if - if prev_text =~ '^\s*@if ' - let extra = 4 - endif - elseif cur_hasfield && !prev_hasfield && !prev_special - " less indent below a continuation line - let extra = -shiftwidth() - endif - endif - endif - - if below_end_brace - " find matching {, if that line starts with @ it's not the start of a rule - " but something else from a template system - call cursor(prev_lnum, 1) - call search('}\s*$') - try - normal! % - " Found the matching "{", align with it. - let align_lnum = s:CssFirstUnfinished(line('.'), min_lnum) - let special = getline(align_lnum) =~ '^\s*@' - catch - let special = 0 - endtry - if special - " do not reduce indent below @{ ... } - if extra < 0 - let extra += shiftwidth() - endif - else - let extra -= (brace_counts.c_close - (prev_text =~ '^\s*}')) * shiftwidth() - endif - endif - - " if no extra indent yet... - if extra == 0 - if brace_counts.p_open > brace_counts.p_close - " previous line has more ( than ): add a shiftwidth - let extra = shiftwidth() - elseif brace_counts.p_open < brace_counts.p_close - " previous line has more ) than (: subtract a shiftwidth - let extra = -shiftwidth() - endif - endif - - return indent(align_lnum) + extra -endfunc "}}} - -" Inside <style>: Whether a line is unfinished. -func! s:CssUnfinished(text) - "{{{ - return a:text =~ '\s\(||\|&&\|:\)\s*$' -endfunc "}}} - -" Search back for the first unfinished line above "lnum". -func! s:CssFirstUnfinished(lnum, min_lnum) - "{{{ - let align_lnum = a:lnum - while align_lnum > a:min_lnum && s:CssUnfinished(getline(align_lnum - 1)) - let align_lnum -= 1 - endwhile - return align_lnum -endfunc "}}} - -" Find the non-empty line at or before "lnum" that is not a comment. -func! s:CssPrevNonComment(lnum, stopline) - "{{{ - " caller starts from a line a:lnum + 1 that is not a comment - let lnum = prevnonblank(a:lnum) - while 1 - let ccol = match(getline(lnum), '\*/') - if ccol < 0 - " No comment end thus it's something else. - return lnum - endif - call cursor(lnum, ccol + 1) - " Search back for the /* that starts the comment - let lnum = search('/\*', 'bW', a:stopline) - if indent(".") == virtcol(".") - 1 - " The found /* is at the start of the line. Now go back to the line - " above it and again check if it is a comment. - let lnum = prevnonblank(lnum - 1) - else - " /* is after something else, thus it's not a comment line. - return lnum - endif - endwhile -endfunc "}}} - -" Check the number of {} and () in line "lnum". Return a dict with the counts. -func! HtmlIndent_CountBraces(lnum) - "{{{ - let brs = substitute(getline(a:lnum), '[''"].\{-}[''"]\|/\*.\{-}\*/\|/\*.*$\|[^{}()]', '', 'g') - let c_open = 0 - let c_close = 0 - let p_open = 0 - let p_close = 0 - for brace in split(brs, '\zs') - if brace == "{" - let c_open += 1 - elseif brace == "}" - if c_open > 0 - let c_open -= 1 - else - let c_close += 1 - endif - elseif brace == '(' - let p_open += 1 - elseif brace == ')' - if p_open > 0 - let p_open -= 1 - else - let p_close += 1 - endif - endif - endfor - return {'c_open': c_open, - \ 'c_close': c_close, - \ 'p_open': p_open, - \ 'p_close': p_close} -endfunc "}}} - -" Return the indent for a comment: <!-- --> -func! s:Alien5() - "{{{ - let curtext = getline(v:lnum) - if curtext =~ '^\s*\zs-->' - " current line starts with end of comment, line up with comment start. - call cursor(v:lnum, 0) - let lnum = search('<!--', 'b') - if lnum > 0 - " TODO: what if <!-- is not at the start of the line? - return indent(lnum) - endif - - " Strange, can't find it. - return -1 - endif - - let prevlnum = prevnonblank(v:lnum - 1) - let prevtext = getline(prevlnum) - let idx = match(prevtext, '^\s*\zs<!--') - if idx >= 0 - " just below comment start, add a shiftwidth - return idx + shiftwidth() - endif - - " Some files add 4 spaces just below a TODO line. It's difficult to detect - " the end of the TODO, so let's not do that. - - " Align with the previous non-blank line. - return indent(prevlnum) -endfunc "}}} - -" Return the indent for conditional comment: <!--[ ![endif]--> -func! s:Alien6() - "{{{ - let curtext = getline(v:lnum) - if curtext =~ '\s*\zs<!\[endif\]-->' - " current line starts with end of comment, line up with comment start. - let lnum = search('<!--', 'bn') - if lnum > 0 - return indent(lnum) - endif - endif - return b:hi_indent.baseindent + shiftwidth() -endfunc "}}} - -" When the "lnum" line ends in ">" find the line containing the matching "<". -func! HtmlIndent_FindTagStart(lnum) - "{{{ - " Avoids using the indent of a continuation line. - " Moves the cursor. - " Return two values: - " - the matching line number or "lnum". - " - a flag indicating whether we found the end of a tag. - " This method is global so that HTML-like indenters can use it. - " To avoid matching " > " or " < " inside a string require that the opening - " "<" is followed by a word character and the closing ">" comes after a - " non-white character. - let idx = match(getline(a:lnum), '\S>\s*$') - if idx > 0 - call cursor(a:lnum, idx) - let lnum = searchpair('<\w', '' , '\S>', 'bW', '', max([a:lnum - b:html_indent_line_limit, 0])) - if lnum > 0 - return [lnum, 1] - endif - endif - return [a:lnum, 0] -endfunc "}}} - -" Find the unclosed start tag from the current cursor position. -func! HtmlIndent_FindStartTag() - "{{{ - " The cursor must be on or before a closing tag. - " If found, positions the cursor at the match and returns the line number. - " Otherwise returns 0. - let tagname = matchstr(getline('.')[col('.') - 1:], '</\zs\w\+\ze') - let start_lnum = searchpair('<' . tagname . '\>', '', '</' . tagname . '\>', 'bW') - if start_lnum > 0 - return start_lnum - endif - return 0 -endfunc "}}} - -" Moves the cursor from a "<" to the matching ">". -func! HtmlIndent_FindTagEnd() - "{{{ - " Call this with the cursor on the "<" of a start tag. - " This will move the cursor to the ">" of the matching end tag or, when it's - " a self-closing tag, to the matching ">". - " Limited to look up to b:html_indent_line_limit lines away. - let text = getline('.') - let tagname = matchstr(text, '\w\+\|!--', col('.')) - if tagname == '!--' - call search('--\zs>') - elseif s:get_tag('/' . tagname) != 0 - " tag with a closing tag, find matching "</tag>" - call searchpair('<' . tagname, '', '</' . tagname . '\zs>', 'W', '', line('.') + b:html_indent_line_limit) - else - " self-closing tag, find the ">" - call search('\S\zs>') - endif -endfunc "}}} - -" Indenting inside a start tag. Return the correct indent or -1 if unknown. -func! s:InsideTag(foundHtmlString) - "{{{ - if a:foundHtmlString - " Inside an attribute string. - " Align with the previous line or use an external function. - let lnum = v:lnum - 1 - if lnum > 1 - if exists('b:html_indent_tag_string_func') - return b:html_indent_tag_string_func(lnum) - endif - return indent(lnum) - endif - endif - - " Should be another attribute: " attr="val". Align with the previous - " attribute start. - let lnum = v:lnum - while lnum > 1 - let lnum -= 1 - let text = getline(lnum) - " Find a match with one of these, align with "attr": - " attr= - " <tag attr= - " text<tag attr= - " <tag>text</tag>text<tag attr= - " For long lines search for the first match, finding the last match - " gets very slow. - if len(text) < 300 - let idx = match(text, '.*\s\zs[_a-zA-Z0-9-]\+="') - else - let idx = match(text, '\s\zs[_a-zA-Z0-9-]\+="') - endif - if idx > 0 - " Found the attribute. TODO: assumes spaces, no Tabs. - return idx - endif - endwhile - return -1 -endfunc "}}} - -" THE MAIN INDENT FUNCTION. Return the amount of indent for v:lnum. -func! HtmlIndent() - "{{{ - if prevnonblank(v:lnum - 1) < 1 - " First non-blank line has no indent. - return 0 - endif - - let curtext = tolower(getline(v:lnum)) - let indentunit = shiftwidth() - - let b:hi_newstate = {} - let b:hi_newstate.lnum = v:lnum - - " When syntax HL is enabled, detect we are inside a tag. Indenting inside - " a tag works very differently. Do not do this when the line starts with - " "<", it gets the "htmlTag" ID but we are not inside a tag then. - if curtext !~ '^\s*<' - normal! ^ - let stack = synstack(v:lnum, col('.')) " assumes there are no tabs - let foundHtmlString = 0 - for synid in reverse(stack) - let name = synIDattr(synid, "name") - if index(b:hi_insideStringNames, name) >= 0 - let foundHtmlString = 1 - elseif index(b:hi_insideTagNames, name) >= 0 - " Yes, we are inside a tag. - let indent = s:InsideTag(foundHtmlString) - if indent >= 0 - " Do not keep the state. TODO: could keep the block type. - let b:hi_indent.lnum = 0 - return indent - endif - endif - endfor - endif - - " does the line start with a closing tag? - let swendtag = match(curtext, '^\s*</') >= 0 - - if prevnonblank(v:lnum - 1) == b:hi_indent.lnum && b:hi_lasttick == b:changedtick - 1 - " use state (continue from previous line) - else - " start over (know nothing) - let b:hi_indent = s:FreshState(v:lnum) - endif - - if b:hi_indent.block >= 2 - " within block - let endtag = s:endtags[b:hi_indent.block] - let blockend = stridx(curtext, endtag) - if blockend >= 0 - " block ends here - let b:hi_newstate.block = 0 - " calc indent for REST OF LINE (may start more blocks): - call s:CountTagsAndState(strpart(curtext, blockend + strlen(endtag))) - if swendtag && b:hi_indent.block != 5 - let indent = b:hi_indent.blocktagind + s:curind * indentunit - let b:hi_newstate.baseindent = indent + s:nextrel * indentunit - else - let indent = s:Alien{b:hi_indent.block}() - let b:hi_newstate.baseindent = b:hi_indent.blocktagind + s:nextrel * indentunit - endif - else - " block continues - " indent this line with alien method - let indent = s:Alien{b:hi_indent.block}() - endif - else - " not within a block - within usual html - let b:hi_newstate.block = b:hi_indent.block - if swendtag - " The current line starts with an end tag, align with its start tag. - call cursor(v:lnum, 1) - let start_lnum = HtmlIndent_FindStartTag() - if start_lnum > 0 - " check for the line starting with something inside a tag: - " <sometag <- align here - " attr=val><open> not here - let text = getline(start_lnum) - let angle = matchstr(text, '[<>]') - if angle == '>' - call cursor(start_lnum, 1) - normal! f>% - let start_lnum = line('.') - let text = getline(start_lnum) - endif - - let indent = indent(start_lnum) - if col('.') > 2 - let swendtag = match(text, '^\s*</') >= 0 - call s:CountITags(text[: col('.') - 2]) - let indent += s:nextrel * shiftwidth() - if !swendtag - let indent += s:curind * shiftwidth() - endif - endif - else - " not sure what to do - let indent = b:hi_indent.baseindent - endif - let b:hi_newstate.baseindent = indent - else - call s:CountTagsAndState(curtext) - let indent = b:hi_indent.baseindent - let b:hi_newstate.baseindent = indent + (s:curind + s:nextrel) * indentunit - endif - endif - - let b:hi_lasttick = b:changedtick - call extend(b:hi_indent, b:hi_newstate, "force") - return indent -endfunc "}}} - -" Check user settings when loading this script the first time. -call HtmlIndent_CheckUserSettings() - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim: fdm=marker ts=8 sw=2 tw=78 - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'html5') == -1 " Description: HTML5 and inline SVG indenter diff --git a/indent/htmldjango.vim b/indent/htmldjango.vim deleted file mode 100644 index 0182bdce..00000000 --- a/indent/htmldjango.vim +++ /dev/null @@ -1,16 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Django HTML template -" Maintainer: Dave Hodder <dmh@dmh.org.uk> -" Last Change: 2007 Jan 25 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Use HTML formatting rules. -runtime! indent/html.vim - -endif diff --git a/indent/idlang.vim b/indent/idlang.vim deleted file mode 100644 index 845ad347..00000000 --- a/indent/idlang.vim +++ /dev/null @@ -1,66 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" IDL (Interactive Data Language) indent file. -" Language: IDL (ft=idlang) -" Last change: 2017 Jun 13 -" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com> - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentkeys=o,O,0=endif,0=ENDIF,0=endelse,0=ENDELSE,0=endwhile,0=ENDWHILE,0=endfor,0=ENDFOR,0=endrep,0=ENDREP - -setlocal indentexpr=GetIdlangIndent(v:lnum) - -" Only define the function once. -if exists("*GetIdlangIndent") - finish -endif - -function GetIdlangIndent(lnum) - " First non-empty line above the current line. - let pnum = prevnonblank(v:lnum-1) - " v:lnum is the first non-empty line -- zero indent. - if pnum == 0 - return 0 - endif - " Second non-empty line above the current line. - let pnum2 = prevnonblank(pnum-1) - - " Current indent. - let curind = indent(pnum) - - " Indenting of continued lines. - if getline(pnum) =~ '\$\s*\(;.*\)\=$' - if getline(pnum2) !~ '\$\s*\(;.*\)\=$' - let curind = curind+shiftwidth() - endif - else - if getline(pnum2) =~ '\$\s*\(;.*\)\=$' - let curind = curind-shiftwidth() - endif - endif - - " Indenting blocks of statements. - if getline(v:lnum) =~? '^\s*\(endif\|endelse\|endwhile\|endfor\|endrep\)\>' - if getline(pnum) =~? 'begin\>' - elseif indent(v:lnum) > curind-shiftwidth() - let curind = curind-shiftwidth() - else - return -1 - endif - elseif getline(pnum) =~? 'begin\>' - if indent(v:lnum) < curind+shiftwidth() - let curind = curind+shiftwidth() - else - return -1 - endif - endif - return curind -endfunction - - -endif diff --git a/indent/ishd.vim b/indent/ishd.vim deleted file mode 100644 index 203e1bde..00000000 --- a/indent/ishd.vim +++ /dev/null @@ -1,72 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Description: InstallShield indenter -" Author: Johannes Zellner <johannes@zellner.org> -" Last Change: Tue, 27 Apr 2004 14:54:59 CEST - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent -setlocal indentexpr=GetIshdIndent(v:lnum) -setlocal indentkeys& -setlocal indentkeys+==else,=elseif,=endif,=end,=begin,<:> -" setlocal indentkeys-=0# - -let b:undo_indent = "setl ai< indentexpr< indentkeys<" - -" Only define the function once. -if exists("*GetIshdIndent") - finish -endif - -fun! GetIshdIndent(lnum) - " labels and preprocessor get zero indent immediately - let this_line = getline(a:lnum) - let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)' - let LABELS_OR_PREPROC_EXCEPT = '^\s*\<default\+\>:' - if this_line =~ LABELS_OR_PREPROC && this_line !~ LABELS_OR_PREPROC_EXCEPT - return 0 - endif - - " Find a non-blank line above the current line. - " Skip over labels and preprocessor directives. - let lnum = a:lnum - while lnum > 0 - let lnum = prevnonblank(lnum - 1) - let previous_line = getline(lnum) - if previous_line !~ LABELS_OR_PREPROC || previous_line =~ LABELS_OR_PREPROC_EXCEPT - break - endif - endwhile - - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - - " Add - if previous_line =~ '^\s*\<\(function\|begin\|switch\|case\|default\|if.\{-}then\|else\|elseif\|while\|repeat\)\>' - let ind = ind + shiftwidth() - endif - - " Subtract - if this_line =~ '^\s*\<endswitch\>' - let ind = ind - 2 * shiftwidth() - elseif this_line =~ '^\s*\<\(begin\|end\|endif\|endwhile\|else\|elseif\|until\)\>' - let ind = ind - shiftwidth() - elseif this_line =~ '^\s*\<\(case\|default\)\>' - if previous_line !~ '^\s*\<switch\>' - let ind = ind - shiftwidth() - endif - endif - - return ind -endfun - -endif diff --git a/indent/j.vim b/indent/j.vim deleted file mode 100644 index 83e60580..00000000 --- a/indent/j.vim +++ /dev/null @@ -1,54 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: J -" Maintainer: David Bürgin <676c7473@gmail.com> -" URL: https://github.com/glts/vim-j -" Last Change: 2015-01-11 - -if exists('b:did_indent') - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetJIndent() -setlocal indentkeys-=0{,0},:,0# -setlocal indentkeys+=0),0<:>,=case.,=catch.,=catchd.,=catcht.,=do.,=else.,=elseif.,=end.,=fcase. - -let b:undo_indent = 'setlocal indentkeys< indentexpr<' - -if exists('*GetJIndent') - finish -endif - -" If g:j_indent_definitions is true, the bodies of explicit definitions of -" adverbs, conjunctions, and verbs will be indented. Default is false (0). -if !exists('g:j_indent_definitions') - let g:j_indent_definitions = 0 -endif - -function GetJIndent() abort - let l:prevlnum = prevnonblank(v:lnum - 1) - if l:prevlnum == 0 - return 0 - endif - let l:indent = indent(l:prevlnum) - let l:prevline = getline(l:prevlnum) - if l:prevline =~# '^\s*\%(case\|catch[dt]\=\|do\|else\%(if\)\=\|fcase\|for\%(_\a\k*\)\=\|if\|select\|try\|whil\%(e\|st\)\)\.\%(\%(\<end\.\)\@!.\)*$' - " Increase indentation after an initial control word that starts or - " continues a block and is not terminated by "end." - let l:indent += shiftwidth() - elseif g:j_indent_definitions && (l:prevline =~# '\<\%([1-4]\|13\|adverb\|conjunction\|verb\|monad\|dyad\)\s\+\%(:\s*0\|def\s\+0\|define\)\>' || l:prevline =~# '^\s*:\s*$') - " Increase indentation in explicit definitions of adverbs, conjunctions, - " and verbs - let l:indent += shiftwidth() - endif - " Decrease indentation in lines that start with either control words that - " continue or end a block, or the special items ")" and ":" - if getline(v:lnum) =~# '^\s*\%()\|:\|\%(case\|catch[dt]\=\|do\|else\%(if\)\=\|end\|fcase\)\.\)' - let l:indent -= shiftwidth() - endif - return l:indent -endfunction - -endif diff --git a/indent/java.vim b/indent/java.vim deleted file mode 100644 index a530e65d..00000000 --- a/indent/java.vim +++ /dev/null @@ -1,154 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Java -" Previous Maintainer: Toby Allsopp <toby.allsopp@peace.com> -" Current Maintainer: Hong Xu <hong@topbug.net> -" Homepage: http://www.vim.org/scripts/script.php?script_id=3899 -" https://github.com/xuhdev/indent-java.vim -" Last Change: 2016 Mar 7 -" Version: 1.1 -" License: Same as Vim. -" Copyright (c) 2012-2016 Hong Xu -" Before 2012, this file was maintained by Toby Allsopp. - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" Indent Java anonymous classes correctly. -setlocal cindent cinoptions& cinoptions+=j1 - -" The "extends" and "implements" lines start off with the wrong indent. -setlocal indentkeys& indentkeys+=0=extends indentkeys+=0=implements - -" Set the function to do the work. -setlocal indentexpr=GetJavaIndent() - -let b:undo_indent = "set cin< cino< indentkeys< indentexpr<" - -" Only define the function once. -if exists("*GetJavaIndent") - finish -endif - -let s:keepcpo= &cpo -set cpo&vim - -function! SkipJavaBlanksAndComments(startline) - let lnum = a:startline - while lnum > 1 - let lnum = prevnonblank(lnum) - if getline(lnum) =~ '\*/\s*$' - while getline(lnum) !~ '/\*' && lnum > 1 - let lnum = lnum - 1 - endwhile - if getline(lnum) =~ '^\s*/\*' - let lnum = lnum - 1 - else - break - endif - elseif getline(lnum) =~ '^\s*//' - let lnum = lnum - 1 - else - break - endif - endwhile - return lnum -endfunction - -function GetJavaIndent() - - " Java is just like C; use the built-in C indenting and then correct a few - " specific cases. - let theIndent = cindent(v:lnum) - - " If we're in the middle of a comment then just trust cindent - if getline(v:lnum) =~ '^\s*\*' - return theIndent - endif - - " find start of previous line, in case it was a continuation line - let lnum = SkipJavaBlanksAndComments(v:lnum - 1) - - " If the previous line starts with '@', we should have the same indent as - " the previous one - if getline(lnum) =~ '^\s*@.*$' - return indent(lnum) - endif - - let prev = lnum - while prev > 1 - let next_prev = SkipJavaBlanksAndComments(prev - 1) - if getline(next_prev) !~ ',\s*$' - break - endif - let prev = next_prev - endwhile - - " Try to align "throws" lines for methods and "extends" and "implements" for - " classes. - if getline(v:lnum) =~ '^\s*\(throws\|extends\|implements\)\>' - \ && getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>' - let theIndent = theIndent + shiftwidth() - endif - - " correct for continuation lines of "throws", "implements" and "extends" - let cont_kw = matchstr(getline(prev), - \ '^\s*\zs\(throws\|implements\|extends\)\>\ze.*,\s*$') - if strlen(cont_kw) > 0 - let amount = strlen(cont_kw) + 1 - if getline(lnum) !~ ',\s*$' - let theIndent = theIndent - (amount + shiftwidth()) - if theIndent < 0 - let theIndent = 0 - endif - elseif prev == lnum - let theIndent = theIndent + amount - if cont_kw ==# 'throws' - let theIndent = theIndent + shiftwidth() - endif - endif - elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>' - \ && (getline(prev) =~ '{\s*$' - \ || getline(v:lnum) =~ '^\s*{\s*$') - let theIndent = theIndent - shiftwidth() - endif - - " When the line starts with a }, try aligning it with the matching {, - " skipping over "throws", "extends" and "implements" clauses. - if getline(v:lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' - call cursor(v:lnum, 1) - silent normal! % - let lnum = line('.') - if lnum < v:lnum - while lnum > 1 - let next_lnum = SkipJavaBlanksAndComments(lnum - 1) - if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>' - \ && getline(next_lnum) !~ ',\s*$' - break - endif - let lnum = prevnonblank(next_lnum) - endwhile - return indent(lnum) - endif - endif - - " Below a line starting with "}" never indent more. Needed for a method - " below a method with an indented "throws" clause. - let lnum = SkipJavaBlanksAndComments(v:lnum - 1) - if getline(lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' && indent(lnum) < theIndent - let theIndent = indent(lnum) - endif - - return theIndent -endfunction - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vi: sw=2 et - -endif diff --git a/indent/javascript.vim b/indent/javascript.vim index 37bd631a..728fa117 100644 --- a/indent/javascript.vim +++ b/indent/javascript.vim @@ -1,4 +1,4 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1 " Vim indent file " Language: Javascript @@ -115,13 +115,13 @@ function s:SkipFunc() let s:check_in = 0 elseif getline('.') =~ '\%<'.col('.').'c\/.\{-}\/\|\%>'.col('.').'c[''"]\|\\$' if eval(s:skip_expr) - let s:looksyn = a:firstline return 1 endif elseif search('\m`\|\${\|\*\/','nW'.s:z,s:looksyn) && eval(s:skip_expr) let s:check_in = 1 return 1 endif + let s:synid_cache[:] += [[line2byte('.') + col('.') - 1], ['']] let [s:looksyn, s:top_col] = getpos('.')[1:2] endfunction @@ -185,475 +185,30 @@ function s:SearchLoop(pat,flags,expr) endfunction function s:ExprCol() - let bal = 0 - while s:SearchLoop('[{}?]\|\_[^:]\zs::\@!','bW',s:skip_expr) - if s:LookingAt() == ':' - let bal -= 1 - elseif s:LookingAt() == '?' - let bal += 1 - if bal == 1 - break - endif - elseif s:LookingAt() == '{' - let bal = !s:IsBlock() - break - elseif !s:GetPair('{','}','bW',s:skip_expr) - break - endif - endwhile - return s:Nat(bal) -endfunction - -" configurable regexes that define continuation lines, not including (, {, or [. -let s:opfirst = '^' . get(g:,'javascript_opfirst', - \ '\C\%([<>=,.?^%|/&]\|\([-:+]\)\1\@!\|\*\+\|!=\|in\%(stanceof\)\=\>\)') -let s:continuation = get(g:,'javascript_continuation', - \ '\C\%([<=,.~!?/*^%|&:]\|+\@<!+\|-\@<!-\|=\@<!>\|\<\%(typeof\|new\|delete\|void\|in\|instanceof\|await\)\)') . '$' - -function s:Continues(ln,con) - let tok = matchstr(a:con[-15:],s:continuation) - if tok =~ '[a-z:]' - call cursor(a:ln, len(a:con)) - return tok == ':' ? s:ExprCol() : s:PreviousToken() != '.' - elseif tok !~ '[/>]' - return tok isnot '' - endif - return s:SynAt(a:ln, len(a:con)) !~? (tok == '>' ? 'jsflow\|^html' : 'regex') -endfunction - -" Check if line 'lnum' has a balanced amount of parentheses. -function s:Balanced(lnum) - let [l:open, l:line] = [0, getline(a:lnum)] - let pos = match(l:line, '[][(){}]') - while pos != -1 - if s:SynAt(a:lnum,pos + 1) !~? b:syng_strcom - let l:open += match(' ' . l:line[pos],'[[({]') - if l:open < 0 - return - endif - endif - let pos = match(l:line, !l:open ? '[][(){}]' : '()' =~ l:line[pos] ? - \ '[()]' : '{}' =~ l:line[pos] ? '[{}]' : '[][]', pos + 1) - endwhile - return !l:open -endfunction - -function s:OneScope() - if s:LookingAt() == ')' && s:GetPair('(', ')', 'bW', s:skip_expr) - let tok = s:PreviousToken() - return (count(split('for if let while with'),tok) || - \ tok =~# '^await$\|^each$' && s:PreviousToken() ==# 'for') && - \ s:Pure('s:PreviousToken') != '.' && !(tok == 'while' && s:DoWhile()) - elseif s:Token() =~# '^else$\|^do$' - return s:Pure('s:PreviousToken') != '.' - endif - return strpart(getline('.'),col('.')-2,2) == '=>' -endfunction - -function s:DoWhile() - let cpos = searchpos('\m\<','cbW') - if s:SearchLoop('\C[{}]\|\<\%(do\|while\)\>','bW',s:skip_expr) - if s:{s:LookingAt() == '}' && s:GetPair('{','}','bW',s:skip_expr) ? - \ 'Previous' : ''}Token() ==# 'do' && s:IsBlock() - return 1 - endif - call call('cursor',cpos) - endif -endfunction - -" returns total offset from braceless contexts. 'num' is the lineNr which -" encloses the entire context, 'cont' if whether a:firstline is a continued -" expression, which could have started in a braceless context -function s:IsContOne(num,cont) - let [l:num, b_l] = [a:num + !a:num, 0] - let pind = a:num ? indent(a:num) + s:sw() : 0 - let ind = indent('.') + !a:cont - while line('.') > l:num && ind > pind || line('.') == l:num - if indent('.') < ind && s:OneScope() - let b_l += 1 - elseif !a:cont || b_l || ind < indent(a:firstline) - break - else - call cursor(0,1) - endif - let ind = min([ind, indent('.')]) - if s:PreviousToken() is '' - break - endif - endwhile - return b_l -endfunction - -function s:Class() - return (s:Token() ==# 'class' || s:PreviousToken() =~# '^class$\|^extends$') && - \ s:PreviousToken() != '.' -endfunction - -function s:IsSwitch() - return s:PreviousToken() !~ '[.*]' && - \ (!s:GetPair('{','}','cbW',s:skip_expr) || s:IsBlock() && !s:Class()) -endfunction - -" https://github.com/sweet-js/sweet.js/wiki/design#give-lookbehind-to-the-reader -function s:IsBlock() - let tok = s:PreviousToken() - if join(s:stack) =~? 'xml\|jsx' && s:SynAt(line('.'),col('.')-1) =~? 'xml\|jsx' - return tok != '{' - elseif tok =~ '\k' - if tok ==# 'type' - return s:Pure('eval',"s:PreviousToken() !~# '^\\%(im\\|ex\\)port$' || s:PreviousToken() == '.'") - elseif tok ==# 'of' - return s:Pure('eval',"!s:GetPair('[[({]','[])}]','bW',s:skip_expr) || s:LookingAt() != '(' ||" - \ ."s:{s:PreviousToken() ==# 'await' ? 'Previous' : ''}Token() !=# 'for' || s:PreviousToken() == '.'") - endif - return index(split('return const let import export extends yield default delete var await void typeof throw case new in instanceof') - \ ,tok) < (line('.') != a:firstline) || s:Pure('s:PreviousToken') == '.' - elseif tok == '>' - return getline('.')[col('.')-2] == '=' || s:SynAt(line('.'),col('.')) =~? 'jsflow\|^html' - elseif tok == '*' - return s:Pure('s:PreviousToken') == ':' - elseif tok == ':' - return s:Pure('eval',"s:PreviousToken() =~ '^\\K\\k*$' && !s:ExprCol()") - elseif tok == '/' - return s:SynAt(line('.'),col('.')) =~? 'regex' - elseif tok !~ '[=~!<,.?^%|&([]' - return tok !~ '[-+]' || line('.') != a:firstline && getline('.')[col('.')-2] == tok - endif -endfunction - -function GetJavascriptIndent() - let b:js_cache = get(b:,'js_cache',[0,0,0]) - let s:synid_cache = [[],[]] - let l:line = getline(v:lnum) - " use synstack as it validates syn state and works in an empty line - let s:stack = [''] + map(synstack(v:lnum,1),"synIDattr(v:val,'name')") - - " start with strings,comments,etc. - if s:stack[-1] =~? 'comment\|doc' - if l:line =~ '^\s*\*' - return cindent(v:lnum) - elseif l:line !~ '^\s*\/[/*]' - return -1 - endif - elseif s:stack[-1] =~? b:syng_str - if b:js_cache[0] == v:lnum - 1 && s:Balanced(v:lnum-1) - let b:js_cache[0] = v:lnum - endif - return -1 - endif - - let s:l1 = max([0,prevnonblank(v:lnum) - (s:rel ? 2000 : 1000), - \ get(get(b:,'hi_indent',{}),'blocklnr')]) - call cursor(v:lnum,1) - if s:PreviousToken() is '' - return - endif - let [l:lnum, pline] = [line('.'), getline('.')[:col('.')-1]] - - let l:line = substitute(l:line,'^\s*','','') - let l:line_raw = l:line - if l:line[:1] == '/*' - let l:line = substitute(l:line,'^\%(\/\*.\{-}\*\/\s*\)*','','') - endif - if l:line =~ '^\/[/*]' - let l:line = '' - endif - - " the containing paren, bracket, or curly. Many hacks for performance - call cursor(v:lnum,1) - let idx = index([']',')','}'],l:line[0]) - if b:js_cache[0] > l:lnum && b:js_cache[0] < v:lnum || - \ b:js_cache[0] == l:lnum && s:Balanced(l:lnum) - call call('cursor',b:js_cache[1:]) - else - let [s:looksyn, s:top_col, s:check_in, s:l1] = [v:lnum - 1,0,0, - \ max([s:l1, &smc ? search('\m^.\{'.&smc.',}','nbW',s:l1 + 1) + 1 : 0])] - try - if idx != -1 - call s:GetPair(['\[','(','{'][idx],'])}'[idx],'bW','s:SkipFunc()') - elseif getline(v:lnum) !~ '^\S' && s:stack[-1] =~? 'block\|^jsobject$' - call s:GetPair('{','}','bW','s:SkipFunc()') - else - call s:AlternatePair() - endif - catch /^\Cout of bounds$/ - call cursor(v:lnum,1) - endtry - let b:js_cache[1:] = line('.') == v:lnum ? [0,0] : getpos('.')[1:2] - endif - - let [b:js_cache[0], num] = [v:lnum, b:js_cache[1]] - - let [num_ind, is_op, b_l, l:switch_offset] = [s:Nat(indent(num)),0,0,0] - if !num || s:LookingAt() == '{' && s:IsBlock() - let ilnum = line('.') - if num && s:LookingAt() == ')' && s:GetPair('(',')','bW',s:skip_expr) - if ilnum == num - let [num, num_ind] = [line('.'), indent('.')] - endif - if idx == -1 && s:PreviousToken() ==# 'switch' && s:IsSwitch() - let l:switch_offset = &cino !~ ':' ? s:sw() : s:ParseCino(':') - if pline[-1:] != '.' && l:line =~# '^\%(default\|case\)\>' - return s:Nat(num_ind + l:switch_offset) - elseif &cino =~ '=' - let l:case_offset = s:ParseCino('=') - endif - endif - endif - if idx == -1 && pline[-1:] !~ '[{;]' - let sol = matchstr(l:line,s:opfirst) - if sol is '' || sol == '/' && s:SynAt(v:lnum, - \ 1 + len(getline(v:lnum)) - len(l:line)) =~? 'regex' - if s:Continues(l:lnum,pline) - let is_op = s:sw() - endif - elseif num && sol =~# '^\%(in\%(stanceof\)\=\|\*\)$' - call call('cursor',b:js_cache[1:]) - if s:PreviousToken() =~ '\k' && s:Class() - return num_ind + s:sw() - endif - let is_op = s:sw() - else - let is_op = s:sw() - endif - call cursor(l:lnum, len(pline)) - let b_l = s:Nat(s:IsContOne(b:js_cache[1],is_op) - (!is_op && l:line =~ '^{')) * s:sw() - endif - elseif idx.s:LookingAt().&cino =~ '^-1(.*(' && (search('\m\S','nbW',num) || s:ParseCino('U')) - let pval = s:ParseCino('(') - if !pval - let [Wval, vcol] = [s:ParseCino('W'), virtcol('.')] - if search('\m\S','W',num) - return s:ParseCino('w') ? vcol : virtcol('.')-1 - endif - return Wval ? s:Nat(num_ind + Wval) : vcol - endif - return s:Nat(num_ind + pval + searchpair('\m(','','\m)','nbrmW',s:skip_expr,num) * s:sw()) - endif - - " main return - if l:line =~ '^[])}]\|^|}' - if l:line_raw[0] == ')' && getline(num)[b:js_cache[2]-1] == '(' - if s:ParseCino('M') - return indent(l:lnum) - elseif &cino =~# 'm' && !s:ParseCino('m') - return virtcol('.') - 1 - endif - endif - return num_ind - elseif num - return s:Nat(num_ind + get(l:,'case_offset',s:sw()) + l:switch_offset + b_l + is_op) - endif - return b_l + is_op -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'javascript') == -1 - -" Vim indent file -" Language: Javascript -" Maintainer: Chris Paul ( https://github.com/bounceme ) -" URL: https://github.com/pangloss/vim-javascript -" Last Change: September 18, 2017 - -" Only load this indent file when no other was loaded. -if exists('b:did_indent') - finish -endif -let b:did_indent = 1 - -" indent correctly if inside <script> -" vim/vim@690afe1 for the switch from cindent -let b:html_indent_script1 = 'inc' - -" Now, set up our indentation expression and keys that trigger it. -setlocal indentexpr=GetJavascriptIndent() -setlocal autoindent nolisp nosmartindent -setlocal indentkeys+=0],0) -" Testable with something like: -" vim -eNs "+filetype plugin indent on" "+syntax on" "+set ft=javascript" \ -" "+norm! gg=G" '+%print' '+:q!' testfile.js \ -" | diff -uBZ testfile.js - - -let b:undo_indent = 'setlocal indentexpr< smartindent< autoindent< indentkeys<' - -" Regex of syntax group names that are or delimit string or are comments. -let b:syng_strcom = get(b:,'syng_strcom','string\|comment\|regex\|special\|doc\|template\%(braces\)\@!') -let b:syng_str = get(b:,'syng_str','string\|template\|special') -" template strings may want to be excluded when editing graphql: -" au! Filetype javascript let b:syng_str = '^\%(.*template\)\@!.*string\|special' -" au! Filetype javascript let b:syng_strcom = '^\%(.*template\)\@!.*string\|comment\|regex\|special\|doc' - -" Only define the function once. -if exists('*GetJavascriptIndent') - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" Get shiftwidth value -if exists('*shiftwidth') - function s:sw() - return shiftwidth() - endfunction -else - function s:sw() - return &l:shiftwidth ? &l:shiftwidth : &l:tabstop - endfunction -endif - -" Performance for forwards search(): start search at pos rather than masking -" matches before pos. -let s:z = has('patch-7.4.984') ? 'z' : '' - -" Expression used to check whether we should skip a match with searchpair(). -let s:skip_expr = "s:SynAt(line('.'),col('.')) =~? b:syng_strcom" -let s:in_comm = s:skip_expr[:-14] . "'comment\\|doc'" - -let s:rel = has('reltime') -" searchpair() wrapper -if s:rel - function s:GetPair(start,end,flags,skip) - return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,s:l1,a:skip ==# 's:SkipFunc()' ? 2000 : 200) - endfunction -else - function s:GetPair(start,end,flags,skip) - return searchpair('\m'.a:start,'','\m'.a:end,a:flags,a:skip,s:l1) - endfunction -endif - -function s:SynAt(l,c) - let byte = line2byte(a:l) + a:c - 1 - let pos = index(s:synid_cache[0], byte) - if pos == -1 - let s:synid_cache[:] += [[byte], [synIDattr(synID(a:l, a:c, 0), 'name')]] - endif - return s:synid_cache[1][pos] -endfunction - -function s:ParseCino(f) - let [divider, n, cstr] = [0] + matchlist(&cino, - \ '\%(.*,\)\=\%(\%d'.char2nr(a:f).'\(-\)\=\([.s0-9]*\)\)\=')[1:2] - for c in split(cstr,'\zs') - if c == '.' && !divider - let divider = 1 - elseif c ==# 's' - if n !~ '\d' - return n . s:sw() + 0 - endif - let n = str2nr(n) * s:sw() - break - else - let [n, divider] .= [c, 0] - endif - endfor - return str2nr(n) / max([str2nr(divider),1]) -endfunction - -" Optimized {skip} expr, only callable from the search loop which -" GetJavascriptIndent does to find the containing [[{(] (side-effects) -function s:SkipFunc() - if s:top_col == 1 - throw 'out of bounds' - endif - let s:top_col = 0 - if s:check_in - if eval(s:skip_expr) - return 1 - endif - let s:check_in = 0 - elseif getline('.') =~ '\%<'.col('.').'c\/.\{-}\/\|\%>'.col('.').'c[''"]\|\\$' - if eval(s:skip_expr) - return 1 - endif - elseif search('\m`\|\${\|\*\/','nW'.s:z,s:looksyn) && eval(s:skip_expr) - let s:check_in = 1 + if getline('.')[col('.')-2] == ':' return 1 endif - let [s:looksyn, s:top_col] = getpos('.')[1:2] -endfunction - -function s:AlternatePair() - let [pat, l:for] = ['[][(){};]', 2] - while s:SearchLoop(pat,'bW','s:SkipFunc()') - if s:LookingAt() == ';' - if !l:for - if s:GetPair('{','}','bW','s:SkipFunc()') - return - endif - break - else - let [pat, l:for] = ['[{}();]', l:for - 1] - endif - else - let idx = stridx('])}',s:LookingAt()) - if idx == -1 - return - elseif !s:GetPair(['\[','(','{'][idx],'])}'[idx],'bW','s:SkipFunc()') - break - endif - endif - endwhile - throw 'out of bounds' -endfunction - -function s:Nat(int) - return a:int * (a:int > 0) -endfunction - -function s:LookingAt() - return getline('.')[col('.')-1] -endfunction - -function s:Token() - return s:LookingAt() =~ '\k' ? expand('<cword>') : s:LookingAt() -endfunction - -function s:PreviousToken() - let l:col = col('.') - if search('\m\k\{1,}\|\S','ebW') - if search('\m\*\%#\/\|\/\/\%<'.a:firstline.'l','nbW',line('.')) && eval(s:in_comm) - if s:SearchLoop('\S\ze\_s*\/[/*]','bW',s:in_comm) - return s:Token() - endif - call cursor(a:firstline, l:col) - else - return s:Token() - endif - endif - return '' -endfunction - -function s:Pure(f,...) - return eval("[call(a:f,a:000),cursor(a:firstline,".col('.').")][0]") -endfunction - -function s:SearchLoop(pat,flags,expr) - return s:GetPair(a:pat,'\_$.',a:flags,a:expr) -endfunction - -function s:ExprCol() let bal = 0 - while s:SearchLoop('[{}?]\|\_[^:]\zs::\@!','bW',s:skip_expr) + while s:SearchLoop('[{}?:]','bW',s:skip_expr) if s:LookingAt() == ':' + if getline('.')[col('.')-2] == ':' + call cursor(0,col('.')-1) + continue + endif let bal -= 1 elseif s:LookingAt() == '?' - let bal += 1 - if bal == 1 - break + if getline('.')[col('.'):col('.')+1] =~ '^\.\d\@!' + continue + elseif !bal + return 1 endif + let bal += 1 elseif s:LookingAt() == '{' - let bal = !s:IsBlock() - break + return !s:IsBlock() elseif !s:GetPair('{','}','bW',s:skip_expr) break endif endwhile - return s:Nat(bal) endfunction " configurable regexes that define continuation lines, not including (, {, or [. diff --git a/indent/json.vim b/indent/json.vim index 67dd6212..7db3586e 100644 --- a/indent/json.vim +++ b/indent/json.vim @@ -1,175 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: JSON -" Mantainer: Eli Parra <eli@elzr.com> https://github.com/elzr/vim-json -" Last Change: 2017 Jun 13 -" https://github.com/jakar/vim-json/commit/20b650e22aa750c4ab6a66aa646bdd95d7cd548a#diff-e81fc111b2052e306d126bd9989f7b7c -" Original Author: Rogerz Zhang <rogerz.zhang at gmail.com> http://github.com/rogerz/vim-json -" Acknowledgement: Based off of vim-javascript maintained by Darrick Wiebe -" http://www.vim.org/scripts/script.php?script_id=2765 - -" 0. Initialization {{{1 -" ================= - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal nosmartindent - -" Now, set up our indentation expression and keys that trigger it. -setlocal indentexpr=GetJSONIndent() -setlocal indentkeys=0{,0},0),0[,0],!^F,o,O,e - -" Only define the function once. -if exists("*GetJSONIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" 1. Variables {{{1 -" ============ - -let s:line_term = '\s*\%(\%(\/\/\).*\)\=$' -" Regex that defines blocks. -let s:block_regex = '\%({\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=' . s:line_term - -" 2. Auxiliary Functions {{{1 -" ====================== - -" Check if the character at lnum:col is inside a string. -function s:IsInString(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') == 'jsonString' -endfunction - -" Find line above 'lnum' that isn't empty, or in a string. -function s:PrevNonBlankNonString(lnum) - let lnum = prevnonblank(a:lnum) - while lnum > 0 - " If the line isn't empty or in a string, end search. - let line = getline(lnum) - if !(s:IsInString(lnum, 1) && s:IsInString(lnum, strlen(line))) - break - endif - let lnum = prevnonblank(lnum - 1) - endwhile - return lnum -endfunction - -" Check if line 'lnum' has more opening brackets than closing ones. -function s:LineHasOpeningBrackets(lnum) - let open_0 = 0 - let open_2 = 0 - let open_4 = 0 - let line = getline(a:lnum) - let pos = match(line, '[][(){}]', 0) - while pos != -1 - let idx = stridx('(){}[]', line[pos]) - if idx % 2 == 0 - let open_{idx} = open_{idx} + 1 - else - let open_{idx - 1} = open_{idx - 1} - 1 - endif - let pos = match(line, '[][(){}]', pos + 1) - endwhile - return (open_0 > 0) . (open_2 > 0) . (open_4 > 0) -endfunction - -function s:Match(lnum, regex) - let col = match(getline(a:lnum), a:regex) + 1 - return col > 0 && !s:IsInString(a:lnum, col) ? col : 0 -endfunction - -" 3. GetJSONIndent Function {{{1 -" ========================= - -function GetJSONIndent() - " 3.1. Setup {{{2 - " ---------- - - " Set up variables for restoring position in file. Could use v:lnum here. - let vcol = col('.') - - " 3.2. Work on the current line {{{2 - " ----------------------------- - - " Get the current line. - let line = getline(v:lnum) - let ind = -1 - - " If we got a closing bracket on an empty line, find its match and indent - " according to it. - let col = matchend(line, '^\s*[]}]') - - if col > 0 && !s:IsInString(v:lnum, col) - call cursor(v:lnum, col) - let bs = strpart('{}[]', stridx('}]', line[col - 1]) * 2, 2) - - let pairstart = escape(bs[0], '[') - let pairend = escape(bs[1], ']') - let pairline = searchpair(pairstart, '', pairend, 'bW') - - if pairline > 0 - let ind = indent(pairline) - else - let ind = virtcol('.') - 1 - endif - - return ind - endif - - " If we are in a multi-line string, don't do anything to it. - if s:IsInString(v:lnum, matchend(line, '^\s*') + 1) - return indent('.') - endif - - " 3.3. Work on the previous line. {{{2 - " ------------------------------- - - let lnum = prevnonblank(v:lnum - 1) - - if lnum == 0 - return 0 - endif - - " Set up variables for current line. - let line = getline(lnum) - let ind = indent(lnum) - - " If the previous line ended with a block opening, add a level of indent. - " if s:Match(lnum, s:block_regex) - " return indent(lnum) + shiftwidth() - " endif - - " If the previous line contained an opening bracket, and we are still in it, - " add indent depending on the bracket type. - if line =~ '[[({]' - let counts = s:LineHasOpeningBrackets(lnum) - if counts[0] == '1' || counts[1] == '1' || counts[2] == '1' - return ind + shiftwidth() - else - call cursor(v:lnum, vcol) - end - endif - - " }}}2 - - return ind -endfunction - -" }}}1 - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim:set sw=2 sts=2 ts=8 noet: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'json') == -1 " Vim indent file diff --git a/indent/jsp.vim b/indent/jsp.vim deleted file mode 100644 index b3a149eb..00000000 --- a/indent/jsp.vim +++ /dev/null @@ -1,21 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim filetype indent file -" Language: JSP files -" Maintainer: David Fishburn <fishburn@ianywhere.com> -" Version: 1.0 -" Last Change: Wed Nov 08 2006 11:08:05 AM - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" If there has been no specific JSP indent script created, -" use the default html indent script which will handle -" html, javascript and most of the JSP constructs. -runtime! indent/html.vim - - - -endif diff --git a/indent/ld.vim b/indent/ld.vim deleted file mode 100644 index 5e2e9d86..00000000 --- a/indent/ld.vim +++ /dev/null @@ -1,88 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: ld(1) script -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetLDIndent() -setlocal indentkeys=0{,0},!^F,o,O -setlocal nosmartindent - -if exists("*GetLDIndent") - finish -endif - -function s:prevnonblanknoncomment(lnum) - let lnum = a:lnum - while lnum > 1 - let lnum = prevnonblank(lnum) - let line = getline(lnum) - if line =~ '\*/' - while lnum > 1 && line !~ '/\*' - let lnum -= 1 - endwhile - if line =~ '^\s*/\*' - let lnum -= 1 - else - break - endif - else - break - endif - endwhile - return lnum -endfunction - -function s:count_braces(lnum, count_open) - let n_open = 0 - let n_close = 0 - let line = getline(a:lnum) - let pattern = '[{}]' - let i = match(line, pattern) - while i != -1 - if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'ld\%(Comment\|String\)' - if line[i] == '{' - let n_open += 1 - elseif line[i] == '}' - if n_open > 0 - let n_open -= 1 - else - let n_close += 1 - endif - endif - endif - let i = match(line, pattern, i + 1) - endwhile - return a:count_open ? n_open : n_close -endfunction - -function GetLDIndent() - let line = getline(v:lnum) - if line =~ '^\s*\*' - return cindent(v:lnum) - elseif line =~ '^\s*}' - return indent(v:lnum) - shiftwidth() - endif - - let pnum = s:prevnonblanknoncomment(v:lnum - 1) - if pnum == 0 - return 0 - endif - - let ind = indent(pnum) + s:count_braces(pnum, 1) * shiftwidth() - - let pline = getline(pnum) - if pline =~ '}\s*$' - let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * shiftwidth() - endif - - return ind -endfunction - -endif diff --git a/indent/less.vim b/indent/less.vim index d0209e58..700a19fb 100644 --- a/indent/less.vim +++ b/indent/less.vim @@ -1,20 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: less -" Maintainer: Alessandro Vioni <jenoma@gmail.com> -" URL: https://github.com/genoma/vim-less -" Last Change: 2014 November 24 - -if exists("b:did_indent") - finish -endif - -runtime! indent/css.vim - -" vim:set sw=2: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'less') == -1 " Vim indent file diff --git a/indent/lifelines.vim b/indent/lifelines.vim deleted file mode 100644 index 6d8ec577..00000000 --- a/indent/lifelines.vim +++ /dev/null @@ -1,28 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: LifeLines -" Maintainer: Patrick Texier <p.texier@orsennes.com> -" Location: <http://patrick.texier.free.fr/vim/indent/lifelines.vim> -" Last Change: 2010 May 7 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" LifeLines uses cindent without ; line terminator, C functions -" declarations, C keywords, C++ formating -setlocal cindent -setlocal cinwords="" -setlocal cinoptions+=+0 -setlocal cinoptions+=p0 -setlocal cinoptions+=i0 -setlocal cinoptions+=t0 -setlocal cinoptions+=*500 - -let b:undo_indent = "setl cin< cino< cinw<" -" vim: ts=8 sw=4 - -endif diff --git a/indent/liquid.vim b/indent/liquid.vim index 5c95a641..1f12eec5 100644 --- a/indent/liquid.vim +++ b/indent/liquid.vim @@ -1,70 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Liquid -" Maintainer: Tim Pope <vimNOSPAM@tpope.org> -" Last Change: 2017 Jun 13 - -if exists('b:did_indent') - finish -endif - -set indentexpr= -if exists('b:liquid_subtype') - exe 'runtime! indent/'.b:liquid_subtype.'.vim' -else - runtime! indent/html.vim -endif -unlet! b:did_indent - -if &l:indentexpr == '' - if &l:cindent - let &l:indentexpr = 'cindent(v:lnum)' - else - let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))' - endif -endif -let b:liquid_subtype_indentexpr = &l:indentexpr - -let b:did_indent = 1 - -setlocal indentexpr=GetLiquidIndent() -setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=endif,=endunless,=endifchanged,=endcase,=endfor,=endtablerow,=endcapture,=else,=elsif,=when,=empty - -" Only define the function once. -if exists('*GetLiquidIndent') - finish -endif - -function! s:count(string,pattern) - let string = substitute(a:string,'\C'.a:pattern,"\n",'g') - return strlen(substitute(string,"[^\n]",'','g')) -endfunction - -function! GetLiquidIndent(...) - if a:0 && a:1 == '.' - let v:lnum = line('.') - elseif a:0 && a:1 =~ '^\d' - let v:lnum = a:1 - endif - let vcol = col('.') - call cursor(v:lnum,1) - exe "let ind = ".b:liquid_subtype_indentexpr - let lnum = prevnonblank(v:lnum-1) - let line = getline(lnum) - let cline = getline(v:lnum) - let line = substitute(line,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','') - let line .= matchstr(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+') - let cline = substitute(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','') - let sw = shiftwidth() - let ind += sw * s:count(line,'{%\s*\%(if\|elsif\|else\|unless\|ifchanged\|case\|when\|for\|empty\|tablerow\|capture\)\>') - let ind -= sw * s:count(line,'{%\s*end\%(if\|unless\|ifchanged\|case\|for\|tablerow\|capture\)\>') - let ind -= sw * s:count(cline,'{%\s*\%(elsif\|else\|when\|empty\)\>') - let ind -= sw * s:count(cline,'{%\s*end\w*$') - return ind -endfunction - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'liquid') == -1 " Vim indent file diff --git a/indent/lisp.vim b/indent/lisp.vim deleted file mode 100644 index c4d62486..00000000 --- a/indent/lisp.vim +++ /dev/null @@ -1,19 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Lisp -" Maintainer: Sergey Khorev <sergey.khorev@gmail.com> -" URL: http://sites.google.com/site/khorser/opensource/vim -" Last Change: 2012 Jan 10 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal ai nosi - -let b:undo_indent = "setl ai< si<" - -endif diff --git a/indent/logtalk.vim b/indent/logtalk.vim deleted file mode 100644 index a7c0a3a0..00000000 --- a/indent/logtalk.vim +++ /dev/null @@ -1,65 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Maintainer: Paulo Moura <pmoura@logtalk.org> -" Revised on: 2008.06.02 -" Language: Logtalk - -" This Logtalk indent file is a modified version of the Prolog -" indent file written by Gergely Kontra - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -let b:did_indent = 1 - -setlocal indentexpr=GetLogtalkIndent() -setlocal indentkeys-=:,0# -setlocal indentkeys+=0%,-,0;,>,0) - -" Only define the function once. -if exists("*GetLogtalkIndent") - finish -endif - -function! GetLogtalkIndent() - " Find a non-blank line above the current line. - let pnum = prevnonblank(v:lnum - 1) - " Hit the start of the file, use zero indent. - if pnum == 0 - return 0 - endif - let line = getline(v:lnum) - let pline = getline(pnum) - - let ind = indent(pnum) - " Previous line was comment -> use previous line's indent - if pline =~ '^\s*%' - retu ind - endif - " Check for entity opening directive on previous line - if pline =~ '^\s*:-\s\(object\|protocol\|category\)\ze(.*,$' - let ind = ind + shiftwidth() - " Check for clause head on previous line - elseif pline =~ ':-\s*\(%.*\)\?$' - let ind = ind + shiftwidth() - " Check for entity closing directive on previous line - elseif pline =~ '^\s*:-\send_\(object\|protocol\|category\)\.\(%.*\)\?$' - let ind = ind - shiftwidth() - " Check for end of clause on previous line - elseif pline =~ '\.\s*\(%.*\)\?$' - let ind = ind - shiftwidth() - endif - " Check for opening conditional on previous line - if pline =~ '^\s*\([(;]\|->\)' && pline !~ '\.\s*\(%.*\)\?$' && pline !~ '^.*\([)][,]\s*\(%.*\)\?$\)' - let ind = ind + shiftwidth() - endif - " Check for closing an unclosed paren, or middle ; or -> - if line =~ '^\s*\([);]\|->\)' - let ind = ind - shiftwidth() - endif - return ind -endfunction - -endif diff --git a/indent/lua.vim b/indent/lua.vim index 9db1d7db..3c33c032 100644 --- a/indent/lua.vim +++ b/indent/lua.vim @@ -1,70 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Lua script -" Maintainer: Marcus Aurelius Farias <marcus.cf 'at' bol.com.br> -" First Author: Max Ischenko <mfi 'at' ukr.net> -" Last Change: 2017 Jun 13 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetLuaIndent() - -" To make Vim call GetLuaIndent() when it finds '\s*end' or '\s*until' -" on the current line ('else' is default and includes 'elseif'). -setlocal indentkeys+=0=end,0=until - -setlocal autoindent - -" Only define the function once. -if exists("*GetLuaIndent") - finish -endif - -function! GetLuaIndent() - " Find a non-blank line above the current line. - let prevlnum = prevnonblank(v:lnum - 1) - - " Hit the start of the file, use zero indent. - if prevlnum == 0 - return 0 - endif - - " Add a 'shiftwidth' after lines that start a block: - " 'function', 'if', 'for', 'while', 'repeat', 'else', 'elseif', '{' - let ind = indent(prevlnum) - let prevline = getline(prevlnum) - let midx = match(prevline, '^\s*\%(if\>\|for\>\|while\>\|repeat\>\|else\>\|elseif\>\|do\>\|then\>\)') - if midx == -1 - let midx = match(prevline, '{\s*$') - if midx == -1 - let midx = match(prevline, '\<function\>\s*\%(\k\|[.:]\)\{-}\s*(') - endif - endif - - if midx != -1 - " Add 'shiftwidth' if what we found previously is not in a comment and - " an "end" or "until" is not present on the same line. - if synIDattr(synID(prevlnum, midx + 1, 1), "name") != "luaComment" && prevline !~ '\<end\>\|\<until\>' - let ind = ind + shiftwidth() - endif - endif - - " Subtract a 'shiftwidth' on end, else, elseif, until and '}' - " This is the part that requires 'indentkeys'. - let midx = match(getline(v:lnum), '^\s*\%(end\>\|else\>\|elseif\>\|until\>\|}\)') - if midx != -1 && synIDattr(synID(v:lnum, midx + 1, 1), "name") != "luaComment" - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'lua') == -1 " Vim indent file diff --git a/indent/mail.vim b/indent/mail.vim deleted file mode 100644 index 8dd0366e..00000000 --- a/indent/mail.vim +++ /dev/null @@ -1,17 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Mail -" Maintainer: Bram Moolenaar -" Last Change: 2009 Jun 03 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" What works best is auto-indenting, disable other indenting. -" For formatting see the ftplugin. -setlocal autoindent nosmartindent nocindent indentexpr= - -endif diff --git a/indent/make.vim b/indent/make.vim deleted file mode 100644 index 35918121..00000000 --- a/indent/make.vim +++ /dev/null @@ -1,120 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Makefile -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2007-05-07 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetMakeIndent() -setlocal indentkeys=!^F,o,O,<:>,=else,=endif -setlocal nosmartindent - -if exists("*GetMakeIndent") - finish -endif - -let s:comment_rx = '^\s*#' -let s:rule_rx = '^[^ \t#:][^#:]*:\{1,2}\%([^=:]\|$\)' -let s:continued_rule_rx = '^[^#:]*:\{1,2}\%([^=:]\|$\)' -let s:continuation_rx = '\\$' -let s:assignment_rx = '^\s*\h\w*\s*[+?]\==\s*\zs.*\\$' -let s:folded_assignment_rx = '^\s*\h\w*\s*[+?]\==' -" TODO: This needs to be a lot more restrictive in what it matches. -let s:just_inserted_rule_rx = '^\s*[^#:]\+:\{1,2}$' -let s:conditional_directive_rx = '^ *\%(ifn\=\%(eq\|def\)\|else\)\>' -let s:end_conditional_directive_rx = '^\s*\%(else\|endif\)\>' - -function s:remove_continuation(line) - return substitute(a:line, s:continuation_rx, "", "") -endfunction - -function GetMakeIndent() - " TODO: Should this perhaps be v:lnum -1? -" let prev_lnum = prevnonblank(v:lnum - 1) - let prev_lnum = v:lnum - 1 - if prev_lnum == 0 - return 0 - endif - let prev_line = getline(prev_lnum) - - let prev_prev_lnum = prev_lnum - 1 - let prev_prev_line = prev_prev_lnum != 0 ? getline(prev_prev_lnum) : "" - - " TODO: Deal with comments. In comments, continuations aren't interesting. - if prev_line =~ s:continuation_rx - if prev_prev_line =~ s:continuation_rx - return indent(prev_lnum) - elseif prev_line =~ s:rule_rx - return shiftwidth() - elseif prev_line =~ s:assignment_rx - call cursor(prev_lnum, 1) - if search(s:assignment_rx, 'W') != 0 - return virtcol('.') - 1 - else - " TODO: ? - return shiftwidth() - endif - else - " TODO: OK, this might be a continued shell command, so perhaps indent - " properly here? Leave this out for now, but in the next release this - " should be using indent/sh.vim somehow. - "if prev_line =~ '^\t' " s:rule_command_rx - " if prev_line =~ '^\s\+[@-]\%(if\)\>' - " return indent(prev_lnum) + 2 - " endif - "endif - return indent(prev_lnum) + shiftwidth() - endif - elseif prev_prev_line =~ s:continuation_rx - let folded_line = s:remove_continuation(prev_prev_line) . ' ' . s:remove_continuation(prev_line) - let lnum = prev_prev_lnum - 1 - let line = getline(lnum) - while line =~ s:continuation_rx - let folded_line = s:remove_continuation(line) . ' ' . folded_line - let lnum -= 1 - let line = getline(lnum) - endwhile - let folded_lnum = lnum + 1 - if folded_line =~ s:rule_rx - if getline(v:lnum) =~ s:rule_rx - return 0 - else - return &ts - endif - else -" elseif folded_line =~ s:folded_assignment_rx - if getline(v:lnum) =~ s:rule_rx - return 0 - else - return indent(folded_lnum) - endif -" else -" " TODO: ? -" return indent(prev_lnum) - endif - elseif prev_line =~ s:rule_rx - if getline(v:lnum) =~ s:rule_rx - return 0 - else - return &ts - endif - elseif prev_line =~ s:conditional_directive_rx - return shiftwidth() - else - let line = getline(v:lnum) - if line =~ s:just_inserted_rule_rx - return 0 - elseif line =~ s:end_conditional_directive_rx - return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - shiftwidth() - else - return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - endif - endif -endfunction - -endif diff --git a/indent/matlab.vim b/indent/matlab.vim deleted file mode 100644 index 32bb721e..00000000 --- a/indent/matlab.vim +++ /dev/null @@ -1,78 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Matlab indent file -" Language: Matlab -" Maintainer: Christophe Poucet <christophe.poucet@pandora.be> -" Last Change: 6 January, 2001 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" Some preliminary setting -setlocal indentkeys=!,o,O=end,=case,=else,=elseif,=otherwise,=catch - - -setlocal indentexpr=GetMatlabIndent(v:lnum) - -" Only define the function once. -if exists("*GetMatlabIndent") - finish -endif - -function GetMatlabIndent(lnum) - " Give up if this line is explicitly joined. - if getline(a:lnum - 1) =~ '\\$' - return -1 - endif - - " Search backwards for the first non-empty line. - let plnum = a:lnum - 1 - while plnum > 0 && getline(plnum) =~ '^\s*$' - let plnum = plnum - 1 - endwhile - - if plnum == 0 - " This is the first non-empty line, use zero indent. - return 0 - endif - - let curind = indent(plnum) - - " If the current line is a stop-block statement... - if getline(v:lnum) =~ '^\s*\(end\|else\|elseif\|case\|otherwise\|catch\)\>' - " See if this line does not follow the line right after an openblock - if getline(plnum) =~ '^\s*\(for\|if\|else\|elseif\|case\|while\|switch\|try\|otherwise\|catch\)\>' - " See if the user has already dedented - elseif indent(v:lnum) > curind - shiftwidth() - " If not, recommend one dedent - let curind = curind - shiftwidth() - else - " Otherwise, trust the user - return -1 - endif -" endif - - " If the previous line opened a block - elseif getline(plnum) =~ '^\s*\(for\|if\|else\|elseif\|case\|while\|switch\|try\|otherwise\|catch\)\>' - " See if the user has already indented - if indent(v:lnum) < curind + shiftwidth() - "If not, recommend indent - let curind = curind + shiftwidth() - else - " Otherwise, trust the user - return -1 - endif - endif - - - - " If we got to here, it means that the user takes the standardversion, so we return it - return curind -endfunction - -" vim:sw=2 - -endif diff --git a/indent/mf.vim b/indent/mf.vim deleted file mode 100644 index 69b28cbc..00000000 --- a/indent/mf.vim +++ /dev/null @@ -1,10 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" METAFONT indent file -" Language: METAFONT -" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com> -" Last Change: 2016 Oct 1 - -runtime! indent/mp.vim - -endif diff --git a/indent/mma.vim b/indent/mma.vim deleted file mode 100644 index e6ca9533..00000000 --- a/indent/mma.vim +++ /dev/null @@ -1,79 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Mathematica -" Author: steve layland <layland@wolfram.com> -" Last Change: Sat May 10 18:56:22 CDT 2005 -" Source: http://vim.sourceforge.net/scripts/script.php?script_id=1274 -" http://members.wolfram.com/layland/vim/indent/mma.vim -" -" NOTE: -" Empty .m files will automatically be presumed to be Matlab files -" unless you have the following in your .vimrc: -" -" let filetype_m="mma" -" -" Credits: -" o steve hacked this out of a random indent file in the Vim 6.1 -" distribution that he no longer remembers...sh.vim? Thanks! - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetMmaIndent() -setlocal indentkeys+=0[,0],0(,0) -setlocal nosi "turn off smart indent so we don't over analyze } blocks - -if exists("*GetMmaIndent") - finish -endif - -function GetMmaIndent() - - " Hit the start of the file, use zero indent. - if v:lnum == 0 - return 0 - endif - - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " use indenting as a base - let ind = indent(v:lnum) - let lnum = v:lnum - - " if previous line has an unmatched bracket, or ( indent. - " doesn't do multiple parens/blocks/etc... - - " also, indent only if this line if this line isn't starting a new - " block... TODO - fix this with indentkeys? - if getline(v:lnum-1) =~ '\\\@<!\%(\[[^\]]*\|([^)]*\|{[^}]*\)$' && getline(v:lnum) !~ '\s\+[\[({]' - let ind = ind+shiftwidth() - endif - - " if this line had unmatched closing block, - " indent to the matching opening block - if getline(v:lnum) =~ '[^[]*]\s*$' - " move to the closing bracket - call search(']','bW') - " and find it's partner's indent - let ind = indent(searchpair('\[','',']','bWn')) - " same for ( blocks - elseif getline(v:lnum) =~ '[^(]*)$' - call search(')','bW') - let ind = indent(searchpair('(','',')','bWn')) - - " and finally, close { blocks if si ain't already set - elseif getline(v:lnum) =~ '[^{]*}' - call search('}','bW') - let ind = indent(searchpair('{','','}','bWn')) - endif - - return ind -endfunction - - -endif diff --git a/indent/mp.vim b/indent/mp.vim deleted file mode 100644 index 36c3f716..00000000 --- a/indent/mp.vim +++ /dev/null @@ -1,364 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" MetaPost indent file -" Language: MetaPost -" Maintainer: Nicola Vitacolonna <nvitacolonna@gmail.com> -" Former Maintainers: Eugene Minkovskii <emin@mccme.ru> -" Last Change: 2016 Oct 2, 4:13pm -" Version: 0.2 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetMetaPostIndent() -setlocal indentkeys+==end,=else,=fi,=fill,0),0] - -let b:undo_indent = "setl indentkeys< indentexpr<" - -" Only define the function once. -if exists("*GetMetaPostIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -function GetMetaPostIndent() - let ignorecase_save = &ignorecase - try - let &ignorecase = 0 - return GetMetaPostIndentIntern() - finally - let &ignorecase = ignorecase_save - endtry -endfunc - -" Regexps {{{ -" Note: the next three variables are made global so that a user may add -" further keywords. -" -" Example: -" -" Put these in ~/.vim/after/indent/mp.vim -" -" let g:mp_open_tag .= '\|\<begintest\>' -" let g:mp_close_tag .= '\|\<endtest\>' - -" Expressions starting indented blocks -let g:mp_open_tag = '' - \ . '\<if\>' - \ . '\|\<else\%[if]\>' - \ . '\|\<for\%(\|ever\|suffixes\)\>' - \ . '\|\<begingroup\>' - \ . '\|\<\%(\|var\|primary\|secondary\|tertiary\)def\>' - \ . '\|^\s*\<begin\%(fig\|graph\|glyph\|char\|logochar\)\>' - \ . '\|[([{]' - -" Expressions ending indented blocks -let g:mp_close_tag = '' - \ . '\<fi\>' - \ . '\|\<else\%[if]\>' - \ . '\|\<end\%(\|for\|group\|def\|fig\|char\|glyph\|graph\)\>' - \ . '\|[)\]}]' - -" Statements that may span multiple lines and are ended by a semicolon. To -" keep this list short, statements that are unlikely to be very long or are -" not very common (e.g., keywords like `interim` or `showtoken`) are not -" included. -" -" The regex for assignments and equations (the last branch) is tricky, because -" it must not match things like `for i :=`, `if a=b`, `def...=`, etc... It is -" not perfect, but it works reasonably well. -let g:mp_statement = '' - \ . '\<\%(\|un\|cut\)draw\>' - \ . '\|\<\%(\|un\)fill\%[draw]\>' - \ . '\|\<draw\%(dbl\)\=arrow\>' - \ . '\|\<clip\>' - \ . '\|\<addto\>' - \ . '\|\<save\>' - \ . '\|\<setbounds\>' - \ . '\|\<message\>' - \ . '\|\<errmessage\>' - \ . '\|\<errhelp\>' - \ . '\|\<fontmapline\>' - \ . '\|\<pickup\>' - \ . '\|\<show\>' - \ . '\|\<special\>' - \ . '\|\<write\>' - \ . '\|\%(^\|;\)\%([^;=]*\%('.g:mp_open_tag.'\)\)\@!.\{-}:\==' - -" A line ends with zero or more spaces, possibly followed by a comment. -let s:eol = '\s*\%($\|%\)' -" }}} - -" Auxiliary functions {{{ -" Returns 1 if (0-based) position immediately preceding `pos` in `line` is -" inside a string or a comment; returns 0 otherwise. - -" This is the function that is called more often when indenting, so it is -" critical that it is efficient. The method we use is significantly faster -" than using syntax attributes, and more general (it does not require -" syntax_items). It is also faster than using a single regex matching an even -" number of quotes. It helps that MetaPost strings cannot span more than one -" line and cannot contain escaped quotes. -function! s:CommentOrString(line, pos) - let in_string = 0 - let q = stridx(a:line, '"') - let c = stridx(a:line, '%') - while q >= 0 && q < a:pos - if c >= 0 && c < q - if in_string " Find next percent symbol - let c = stridx(a:line, '%', q + 1) - else " Inside comment - return 1 - endif - endif - let in_string = 1 - in_string - let q = stridx(a:line, '"', q + 1) " Find next quote - endwhile - return in_string || (c >= 0 && c <= a:pos) -endfunction - -" Find the first non-comment non-blank line before the current line. -function! s:PrevNonBlankNonComment(lnum) - let l:lnum = prevnonblank(a:lnum - 1) - while getline(l:lnum) =~# '^\s*%' - let l:lnum = prevnonblank(l:lnum - 1) - endwhile - return l:lnum -endfunction - -" Returns true if the last tag appearing in the line is an open tag; returns -" false otherwise. -function! s:LastTagIsOpen(line) - let o = s:LastValidMatchEnd(a:line, g:mp_open_tag, 0) - if o == - 1 | return v:false | endif - return s:LastValidMatchEnd(a:line, g:mp_close_tag, o) < 0 -endfunction - -" A simple, efficient and quite effective heuristics is used to test whether -" a line should cause the next line to be indented: count the "opening tags" -" (if, for, def, ...) in the line, count the "closing tags" (endif, endfor, -" ...) in the line, and compute the difference. We call the result the -" "weight" of the line. If the weight is positive, then the next line should -" most likely be indented. Note that `else` and `elseif` are both opening and -" closing tags, so they "cancel out" in almost all cases, the only exception -" being a leading `else[if]`, which is counted as an opening tag, but not as -" a closing tag (so that, for instance, a line containing a single `else:` -" will have weight equal to one, not zero). We do not treat a trailing -" `else[if]` in any special way, because lines ending with an open tag are -" dealt with separately before this function is called (see -" GetMetaPostIndentIntern()). -" -" Example: -" -" forsuffixes $=a,b: if x.$ = y.$ : draw else: fill fi -" % This line will be indented because |{forsuffixes,if,else}| > |{else,fi}| (3 > 2) -" endfor - -function! s:Weight(line) - let [o, i] = [0, s:ValidMatchEnd(a:line, g:mp_open_tag, 0)] - while i > 0 - let o += 1 - let i = s:ValidMatchEnd(a:line, g:mp_open_tag, i) - endwhile - let [c, i] = [0, matchend(a:line, '^\s*\<else\%[if]\>')] " Skip a leading else[if] - let i = s:ValidMatchEnd(a:line, g:mp_close_tag, i) - while i > 0 - let c += 1 - let i = s:ValidMatchEnd(a:line, g:mp_close_tag, i) - endwhile - return o - c -endfunction - -" Similar to matchend(), but skips strings and comments. -" line: a String -function! s:ValidMatchEnd(line, pat, start) - let i = matchend(a:line, a:pat, a:start) - while i > 0 && s:CommentOrString(a:line, i) - let i = matchend(a:line, a:pat, i) - endwhile - return i -endfunction - -" Like s:ValidMatchEnd(), but returns the end position of the last (i.e., -" rightmost) match. -function! s:LastValidMatchEnd(line, pat, start) - let last_found = -1 - let i = matchend(a:line, a:pat, a:start) - while i > 0 - if !s:CommentOrString(a:line, i) - let last_found = i - endif - let i = matchend(a:line, a:pat, i) - endwhile - return last_found -endfunction - -function! s:DecreaseIndentOnClosingTag(curr_indent) - let cur_text = getline(v:lnum) - if cur_text =~# '^\s*\%('.g:mp_close_tag.'\)' - return max([a:curr_indent - shiftwidth(), 0]) - endif - return a:curr_indent -endfunction -" }}} - -" Main function {{{ -" -" Note: Every rule of indentation in MetaPost is very subjective. We might get -" creative, but things get murky very soon (there are too many corner cases). -" So, we provide a means for the user to decide what to do when this script -" doesn't get it. We use a simple idea: use '%>', '%<' and '%=' to explicitly -" control indentation. The '<' and '>' symbols may be repeated many times -" (e.g., '%>>' will cause the next line to be indented twice). -" -" By using '%>...', '%<...' and '%=', the indentation the user wants is -" preserved by commands like gg=G, even if it does not follow the rules of -" this script. -" -" Example: -" -" def foo = -" makepen( -" subpath(T-n,t) of r %> -" shifted .5down %> -" --subpath(t,T) of r shifted .5up -- cycle %<<< -" ) -" withcolor black -" enddef -" -" The default indentation of the previous example would be: -" -" def foo = -" makepen( -" subpath(T-n,t) of r -" shifted .5down -" --subpath(t,T) of r shifted .5up -- cycle -" ) -" withcolor black -" enddef -" -" Personally, I prefer the latter, but anyway... -function! GetMetaPostIndentIntern() - " Do not touch indentation inside verbatimtex/btex.. etex blocks. - if synIDattr(synID(v:lnum, 1, 1), "name") =~# '^mpTeXinsert$\|^tex\|^Delimiter' - return -1 - endif - - " This is the reference line relative to which the current line is indented - " (but see below). - let lnum = s:PrevNonBlankNonComment(v:lnum) - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - let prev_text = getline(lnum) - - " User-defined overrides take precedence over anything else. - " See above for an example. - let j = match(prev_text, '%[<>=]') - if j > 0 - let i = strlen(matchstr(prev_text, '%>\+', j)) - 1 - if i > 0 - return indent(lnum) + i * shiftwidth() - endif - - let i = strlen(matchstr(prev_text, '%<\+', j)) - 1 - if i > 0 - return max([indent(lnum) - i * shiftwidth(), 0]) - endif - - if match(prev_text, '%=', j) - return indent(lnum) - endif - endif - - " If the reference line ends with an open tag, indent. - " - " Example: - " - " if c: - " 0 - " else: - " 1 - " fi if c2: % Note that this line has weight equal to zero. - " ... % This line will be indented - if s:LastTagIsOpen(prev_text) - return s:DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth()) - endif - - " Lines with a positive weight are unbalanced and should likely be indented. - " - " Example: - " - " def f = enddef for i = 1 upto 5: if x[i] > 0: 1 else: 2 fi - " ... % This line will be indented (because of the unterminated `for`) - if s:Weight(prev_text) > 0 - return s:DecreaseIndentOnClosingTag(indent(lnum) + shiftwidth()) - endif - - " Unterminated statements cause indentation to kick in. - " - " Example: - " - " draw unitsquare - " withcolor black; % This line is indented because of `draw`. - " x := a + b + c - " + d + e; % This line is indented because of `:=`. - " - let i = s:LastValidMatchEnd(prev_text, g:mp_statement, 0) - if i >= 0 " Does the line contain a statement? - if s:ValidMatchEnd(prev_text, ';', i) < 0 " Is the statement unterminated? - return indent(lnum) + shiftwidth() - else - return s:DecreaseIndentOnClosingTag(indent(lnum)) - endif - endif - - " Deal with the special case of a statement spanning multiple lines. If the - " current reference line L ends with a semicolon, search backwards for - " another semicolon or a statement keyword. If the latter is found first, - " its line is used as the reference line for indenting the current line - " instead of L. - " - " Example: - " - " if cond: - " draw if a: z0 else: z1 fi - " shifted S - " scaled T; % L - " - " for i = 1 upto 3: % <-- Current line: this gets the same indent as `draw ...` - " - " NOTE: we get here only if L does not contain a statement (among those - " listed in g:mp_statement). - if s:ValidMatchEnd(prev_text, ';'.s:eol, 0) >= 0 " L ends with a semicolon - let stm_lnum = s:PrevNonBlankNonComment(lnum) - while stm_lnum > 0 - let prev_text = getline(stm_lnum) - let sc_pos = s:LastValidMatchEnd(prev_text, ';', 0) - let stm_pos = s:ValidMatchEnd(prev_text, g:mp_statement, sc_pos) - if stm_pos > sc_pos - let lnum = stm_lnum - break - elseif sc_pos > stm_pos - break - endif - let stm_lnum = s:PrevNonBlankNonComment(stm_lnum) - endwhile - endif - - return s:DecreaseIndentOnClosingTag(indent(lnum)) -endfunction -" }}} - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:sw=2:fdm=marker - -endif diff --git a/indent/objc.vim b/indent/objc.vim deleted file mode 100644 index f9405b2b..00000000 --- a/indent/objc.vim +++ /dev/null @@ -1,83 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Objective-C -" Maintainer: Kazunobu Kuriyama <kazunobu.kuriyama@nifty.com> -" Last Change: 2004 May 16 -" - - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 -setlocal cindent - -" Set the function to do the work. -setlocal indentexpr=GetObjCIndent() - -" To make a colon (:) suggest an indentation other than a goto/swich label, -setlocal indentkeys-=: -setlocal indentkeys+=<:> - -" Only define the function once. -if exists("*GetObjCIndent") - finish -endif - -function s:GetWidth(line, regexp) - let end = matchend(a:line, a:regexp) - let width = 0 - let i = 0 - while i < end - if a:line[i] != "\t" - let width = width + 1 - else - let width = width + &ts - (width % &ts) - endif - let i = i + 1 - endwhile - return width -endfunction - -function s:LeadingWhiteSpace(line) - let end = strlen(a:line) - let width = 0 - let i = 0 - while i < end - let char = a:line[i] - if char != " " && char != "\t" - break - endif - if char != "\t" - let width = width + 1 - else - let width = width + &ts - (width % &ts) - endif - let i = i + 1 - endwhile - return width -endfunction - - -function GetObjCIndent() - let theIndent = cindent(v:lnum) - - let prev_line = getline(v:lnum - 1) - let cur_line = getline(v:lnum) - - if prev_line !~# ":" || cur_line !~# ":" - return theIndent - endif - - if prev_line !~# ";" - let prev_colon_pos = s:GetWidth(prev_line, ":") - let delta = s:GetWidth(cur_line, ":") - s:LeadingWhiteSpace(cur_line) - let theIndent = prev_colon_pos - delta - endif - - return theIndent -endfunction - -endif diff --git a/indent/ocaml.vim b/indent/ocaml.vim index 71298d9b..dac76ab8 100644 --- a/indent/ocaml.vim +++ b/indent/ocaml.vim @@ -1,280 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: OCaml -" Maintainers: Jean-Francois Yuen <jfyuen@happycoders.org> -" Mike Leary <leary@nwlink.com> -" Markus Mottl <markus.mottl@gmail.com> -" URL: http://www.ocaml.info/vim/indent/ocaml.vim -" Last Change: 2017 Jun 13 -" 2005 Jun 25 - Fixed multiple bugs due to 'else\nreturn ind' working -" 2005 May 09 - Added an option to not indent OCaml-indents specially (MM) -" 2013 June - commented textwidth (Marc Weber) -" -" Marc Weber's comment: This file may contain a lot of (very custom) stuff -" which eventually should be moved somewhere else .. - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal expandtab -setlocal indentexpr=GetOCamlIndent() -setlocal indentkeys+=0=and,0=class,0=constraint,0=done,0=else,0=end,0=exception,0=external,0=if,0=in,0=include,0=inherit,0=initializer,0=let,0=method,0=open,0=then,0=type,0=val,0=with,0;;,0>\],0\|\],0>},0\|,0},0\],0) -setlocal nolisp -setlocal nosmartindent - -" At least Marc Weber and Markus Mottl do not like this: -" setlocal textwidth=80 - -" Comment formatting -if !exists("no_ocaml_comments") - if (has("comments")) - setlocal comments=sr:(*,mb:*,ex:*) - setlocal fo=cqort - endif -endif - -" Only define the function once. -if exists("*GetOCamlIndent") - finish -endif - -" Define some patterns: -let s:beflet = '^\s*\(initializer\|method\|try\)\|\(\<\(begin\|do\|else\|in\|then\|try\)\|->\|<-\|=\|;\|(\)\s*$' -let s:letpat = '^\s*\(let\|type\|module\|class\|open\|exception\|val\|include\|external\)\>' -let s:letlim = '\(\<\(sig\|struct\)\|;;\)\s*$' -let s:lim = '^\s*\(exception\|external\|include\|let\|module\|open\|type\|val\)\>' -let s:module = '\<\%(begin\|sig\|struct\|object\)\>' -let s:obj = '^\s*\(constraint\|inherit\|initializer\|method\|val\)\>\|\<\(object\|object\s*(.*)\)\s*$' -let s:type = '^\s*\%(class\|let\|type\)\>.*=' - -" Skipping pattern, for comments -function! s:GetLineWithoutFullComment(lnum) - let lnum = prevnonblank(a:lnum - 1) - let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '') - while lline =~ '^\s*$' && lnum > 0 - let lnum = prevnonblank(lnum - 1) - let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '') - endwhile - return lnum -endfunction - -" Indent for ';;' to match multiple 'let' -function! s:GetInd(lnum, pat, lim) - let llet = search(a:pat, 'bW') - let old = indent(a:lnum) - while llet > 0 - let old = indent(llet) - let nb = s:GetLineWithoutFullComment(llet) - if getline(nb) =~ a:lim - return old - endif - let llet = search(a:pat, 'bW') - endwhile - return old -endfunction - -" Indent pairs -function! s:FindPair(pstart, pmid, pend) - call search(a:pend, 'bW') - return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')) -endfunction - -" Indent 'let' -function! s:FindLet(pstart, pmid, pend) - call search(a:pend, 'bW') - return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ s:beflet')) -endfunction - -function! GetOCamlIndent() - " Find a non-commented line above the current line. - let lnum = s:GetLineWithoutFullComment(v:lnum) - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '') - - " Return double 'shiftwidth' after lines matching: - if lline =~ '^\s*|.*->\s*$' - return ind + 2 * shiftwidth() - endif - - let line = getline(v:lnum) - - " Indent if current line begins with 'end': - if line =~ '^\s*end\>' - return s:FindPair(s:module, '','\<end\>') - - " Indent if current line begins with 'done' for 'do': - elseif line =~ '^\s*done\>' - return s:FindPair('\<do\>', '','\<done\>') - - " Indent if current line begins with '}' or '>}': - elseif line =~ '^\s*\(\|>\)}' - return s:FindPair('{', '','}') - - " Indent if current line begins with ']', '|]' or '>]': - elseif line =~ '^\s*\(\||\|>\)\]' - return s:FindPair('\[', '','\]') - - " Indent if current line begins with ')': - elseif line =~ '^\s*)' - return s:FindPair('(', '',')') - - " Indent if current line begins with 'let': - elseif line =~ '^\s*let\>' - if lline !~ s:lim . '\|' . s:letlim . '\|' . s:beflet - return s:FindLet(s:type, '','\<let\s*$') - endif - - " Indent if current line begins with 'class' or 'type': - elseif line =~ '^\s*\(class\|type\)\>' - if lline !~ s:lim . '\|\<and\s*$\|' . s:letlim - return s:FindLet(s:type, '','\<\(class\|type\)\s*$') - endif - - " Indent for pattern matching: - elseif line =~ '^\s*|' - if lline !~ '^\s*\(|[^\]]\|\(match\|type\|with\)\>\)\|\<\(function\|parser\|private\|with\)\s*$' - call search('|', 'bW') - return indent(searchpair('^\s*\(match\|type\)\>\|\<\(function\|parser\|private\|with\)\s*$', '', '^\s*|', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") !~ "^\\s*|.*->"')) - endif - - " Indent if current line begins with ';;': - elseif line =~ '^\s*;;' - if lline !~ ';;\s*$' - return s:GetInd(v:lnum, s:letpat, s:letlim) - endif - - " Indent if current line begins with 'in': - elseif line =~ '^\s*in\>' - if lline !~ '^\s*\(let\|and\)\>' - return s:FindPair('\<let\>', '', '\<in\>') - endif - - " Indent if current line begins with 'else': - elseif line =~ '^\s*else\>' - if lline !~ '^\s*\(if\|then\)\>' - return s:FindPair('\<if\>', '', '\<else\>') - endif - - " Indent if current line begins with 'then': - elseif line =~ '^\s*then\>' - if lline !~ '^\s*\(if\|else\)\>' - return s:FindPair('\<if\>', '', '\<then\>') - endif - - " Indent if current line begins with 'and': - elseif line =~ '^\s*and\>' - if lline !~ '^\s*\(and\|let\|type\)\>\|\<end\s*$' - return ind - shiftwidth() - endif - - " Indent if current line begins with 'with': - elseif line =~ '^\s*with\>' - if lline !~ '^\s*\(match\|try\)\>' - return s:FindPair('\<\%(match\|try\)\>', '','\<with\>') - endif - - " Indent if current line begins with 'exception', 'external', 'include' or - " 'open': - elseif line =~ '^\s*\(exception\|external\|include\|open\)\>' - if lline !~ s:lim . '\|' . s:letlim - call search(line) - return indent(search('^\s*\(\(exception\|external\|include\|open\|type\)\>\|val\>.*:\)', 'bW')) - endif - - " Indent if current line begins with 'val': - elseif line =~ '^\s*val\>' - if lline !~ '^\s*\(exception\|external\|include\|open\)\>\|' . s:obj . '\|' . s:letlim - return indent(search('^\s*\(\(exception\|include\|initializer\|method\|open\|type\|val\)\>\|external\>.*:\)', 'bW')) - endif - - " Indent if current line begins with 'constraint', 'inherit', 'initializer' - " or 'method': - elseif line =~ '^\s*\(constraint\|inherit\|initializer\|method\)\>' - if lline !~ s:obj - return indent(search('\<\(object\|object\s*(.*)\)\s*$', 'bW')) + shiftwidth() - endif - - endif - - " Add a 'shiftwidth' after lines ending with: - if lline =~ '\(:\|=\|->\|<-\|(\|\[\|{\|{<\|\[|\|\[<\|\<\(begin\|do\|else\|fun\|function\|functor\|if\|initializer\|object\|parser\|private\|sig\|struct\|then\|try\)\|\<object\s*(.*)\)\s*$' - let ind = ind + shiftwidth() - - " Back to normal indent after lines ending with ';;': - elseif lline =~ ';;\s*$' && lline !~ '^\s*;;' - let ind = s:GetInd(v:lnum, s:letpat, s:letlim) - - " Back to normal indent after lines ending with 'end': - elseif lline =~ '\<end\s*$' - let ind = s:FindPair(s:module, '','\<end\>') - - " Back to normal indent after lines ending with 'in': - elseif lline =~ '\<in\s*$' && lline !~ '^\s*in\>' - let ind = s:FindPair('\<let\>', '', '\<in\>') - - " Back to normal indent after lines ending with 'done': - elseif lline =~ '\<done\s*$' - let ind = s:FindPair('\<do\>', '','\<done\>') - - " Back to normal indent after lines ending with '}' or '>}': - elseif lline =~ '\(\|>\)}\s*$' - let ind = s:FindPair('{', '','}') - - " Back to normal indent after lines ending with ']', '|]' or '>]': - elseif lline =~ '\(\||\|>\)\]\s*$' - let ind = s:FindPair('\[', '','\]') - - " Back to normal indent after comments: - elseif lline =~ '\*)\s*$' - call search('\*)', 'bW') - let ind = indent(searchpair('(\*', '', '\*)', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"')) - - " Back to normal indent after lines ending with ')': - elseif lline =~ ')\s*$' - let ind = s:FindPair('(', '',')') - - " If this is a multiline comment then align '*': - elseif lline =~ '^\s*(\*' && line =~ '^\s*\*' - let ind = ind + 1 - - else - " Don't change indentation of this line - " for new lines (indent==0) use indentation of previous line - - " This is for preventing removing indentation of these args: - " let f x = - " let y = x + 1 in - " Printf.printf - " "o" << here - " "oeuth" << don't touch indentation - - let i = indent(v:lnum) - return i == 0 ? ind : i - - endif - - " Subtract a 'shiftwidth' after lines matching 'match ... with parser': - if lline =~ '\<match\>.*\<with\>\s*\<parser\s*$' - let ind = ind - shiftwidth() - endif - - return ind - -endfunction - -" vim:sw=2 - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ocaml') == -1 " Vim indent file diff --git a/indent/occam.vim b/indent/occam.vim deleted file mode 100644 index f074395c..00000000 --- a/indent/occam.vim +++ /dev/null @@ -1,191 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: occam -" Maintainer: Mario Schweigler <ms44@kent.ac.uk> -" Last Change: 23 April 2003 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -"{{{ Settings -" Set the occam indent function -setlocal indentexpr=GetOccamIndent() -" Indent after new line and after initial colon -setlocal indentkeys=o,O,0=: -"}}} - -" Only define the function once -if exists("*GetOccamIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -"{{{ Indent definitions -" Define carriage return indent -let s:FirstLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\|PAR\|SEQ\|PRI\s\+PAR\|WHILE\|VALOF\|CLAIM\|FORKING\)\>\|\(--.*\)\@<!\(\<PROC\>\|??\|\<CASE\>\s*\(--.*\)\=\_$\)' -let s:FirstLevelNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>' -let s:SecondLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\)\>\|\(--.*\)\@<!?\s*\<CASE\>\s*\(--.*\)\=\_$' -let s:SecondLevelNonColonEndIndent = '\(--.*\)\@<!\<\(CHAN\|DATA\)\s\+TYPE\>' - -" Define colon indent -let s:ColonIndent = '\(--.*\)\@<!\<PROC\>' -let s:ColonNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>' - -let s:ColonEnd = '\(--.*\)\@<!:\s*\(--.*\)\=$' -let s:ColonStart = '^\s*:\s*\(--.*\)\=$' - -" Define comment -let s:CommentLine = '^\s*--' -"}}} - -"{{{ function GetOccamIndent() -" Auxiliary function to get the correct indent for a line of occam code -function GetOccamIndent() - - " Ensure magic is on - let save_magic = &magic - setlocal magic - - " Get reference line number - let linenum = prevnonblank(v:lnum - 1) - while linenum > 0 && getline(linenum) =~ s:CommentLine - let linenum = prevnonblank(linenum - 1) - endwhile - - " Get current indent - let curindent = indent(linenum) - - " Get current line - let line = getline(linenum) - - " Get previous line number - let prevlinenum = prevnonblank(linenum - 1) - while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine - let prevlinenum = prevnonblank(prevlinenum - 1) - endwhile - - " Get previous line - let prevline = getline(prevlinenum) - - " Colon indent - if getline(v:lnum) =~ s:ColonStart - - let found = 0 - - while found < 1 - - if line =~ s:ColonStart - let found = found - 1 - elseif line =~ s:ColonIndent || (line =~ s:ColonNonColonEndIndent && line !~ s:ColonEnd) - let found = found + 1 - endif - - if found < 1 - let linenum = prevnonblank(linenum - 1) - if linenum > 0 - let line = getline(linenum) - else - let found = 1 - endif - endif - - endwhile - - if linenum > 0 - let curindent = indent(linenum) - else - let colonline = getline(v:lnum) - let tabstr = '' - while strlen(tabstr) < &tabstop - let tabstr = ' ' . tabstr - endwhile - let colonline = substitute(colonline, '\t', tabstr, 'g') - let curindent = match(colonline, ':') - endif - - " Restore magic - if !save_magic|setlocal nomagic|endif - - return curindent - endif - - if getline(v:lnum) =~ '^\s*:' - let colonline = getline(v:lnum) - let tabstr = '' - while strlen(tabstr) < &tabstop - let tabstr = ' ' . tabstr - endwhile - let colonline = substitute(colonline, '\t', tabstr, 'g') - let curindent = match(colonline, ':') - - " Restore magic - if !save_magic|setlocal nomagic|endif - - return curindent - endif - - " Carriage return indenat - if line =~ s:FirstLevelIndent || (line =~ s:FirstLevelNonColonEndIndent && line !~ s:ColonEnd) - \ || (line !~ s:ColonStart && (prevline =~ s:SecondLevelIndent - \ || (prevline =~ s:SecondLevelNonColonEndIndent && prevline !~ s:ColonEnd))) - let curindent = curindent + shiftwidth() - - " Restore magic - if !save_magic|setlocal nomagic|endif - - return curindent - endif - - " Commented line - if getline(prevnonblank(v:lnum - 1)) =~ s:CommentLine - - " Restore magic - if !save_magic|setlocal nomagic|endif - - return indent(prevnonblank(v:lnum - 1)) - endif - - " Look for previous second level IF / ALT / PRI ALT - let found = 0 - - while !found - - if indent(prevlinenum) == curindent - shiftwidth() - let found = 1 - endif - - if !found - let prevlinenum = prevnonblank(prevlinenum - 1) - while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine - let prevlinenum = prevnonblank(prevlinenum - 1) - endwhile - if prevlinenum == 0 - let found = 1 - endif - endif - - endwhile - - if prevlinenum > 0 - if getline(prevlinenum) =~ s:SecondLevelIndent - let curindent = curindent + shiftwidth() - endif - endif - - " Restore magic - if !save_magic|setlocal nomagic|endif - - return curindent - -endfunction -"}}} - -let &cpo = s:keepcpo -unlet s:keepcpo - -endif diff --git a/indent/pascal.vim b/indent/pascal.vim deleted file mode 100644 index b20fb56d..00000000 --- a/indent/pascal.vim +++ /dev/null @@ -1,232 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Pascal -" Maintainer: Neil Carter <n.carter@swansea.ac.uk> -" Created: 2004 Jul 13 -" Last Change: 2017 Jun 13 -" -" This is version 2.0, a complete rewrite. -" -" For further documentation, see http://psy.swansea.ac.uk/staff/carter/vim/ - - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetPascalIndent(v:lnum) -setlocal indentkeys& -setlocal indentkeys+==end;,==const,==type,==var,==begin,==repeat,==until,==for -setlocal indentkeys+==program,==function,==procedure,==object,==private -setlocal indentkeys+==record,==if,==else,==case - -if exists("*GetPascalIndent") - finish -endif - - -function! s:GetPrevNonCommentLineNum( line_num ) - - " Skip lines starting with a comment - let SKIP_LINES = '^\s*\(\((\*\)\|\(\*\ \)\|\(\*)\)\|{\|}\)' - - let nline = a:line_num - while nline > 0 - let nline = prevnonblank(nline-1) - if getline(nline) !~? SKIP_LINES - break - endif - endwhile - - return nline -endfunction - - -function! s:PurifyCode( line_num ) - " Strip any trailing comments and whitespace - let pureline = 'TODO' - return pureline -endfunction - - -function! GetPascalIndent( line_num ) - - " Line 0 always goes at column 0 - if a:line_num == 0 - return 0 - endif - - let this_codeline = getline( a:line_num ) - - - " SAME INDENT - - " Middle of a three-part comment - if this_codeline =~ '^\s*\*' - return indent( a:line_num - 1) - endif - - - " COLUMN 1 ALWAYS - - " Last line of the program - if this_codeline =~ '^\s*end\.' - return 0 - endif - - " Compiler directives, allowing "(*" and "{" - "if this_codeline =~ '^\s*\({\|(\*\)$\(IFDEF\|IFNDEF\|ELSE\|ENDIF\)' - if this_codeline =~ '^\s*\({\|(\*\)\$' - return 0 - endif - - " section headers - if this_codeline =~ '^\s*\(program\|procedure\|function\|type\)\>' - return 0 - endif - - " Subroutine separators, lines ending with "const" or "var" - if this_codeline =~ '^\s*\((\*\ _\+\ \*)\|\(const\|var\)\)$' - return 0 - endif - - - " OTHERWISE, WE NEED TO LOOK FURTHER BACK... - - let prev_codeline_num = s:GetPrevNonCommentLineNum( a:line_num ) - let prev_codeline = getline( prev_codeline_num ) - let indnt = indent( prev_codeline_num ) - - - " INCREASE INDENT - - " If the PREVIOUS LINE ended in these items, always indent - if prev_codeline =~ '\<\(type\|const\|var\)$' - return indnt + shiftwidth() - endif - - if prev_codeline =~ '\<repeat$' - if this_codeline !~ '^\s*until\>' - return indnt + shiftwidth() - else - return indnt - endif - endif - - if prev_codeline =~ '\<\(begin\|record\)$' - if this_codeline !~ '^\s*end\>' - return indnt + shiftwidth() - else - return indnt - endif - endif - - " If the PREVIOUS LINE ended with these items, indent if not - " followed by "begin" - if prev_codeline =~ '\<\(\|else\|then\|do\)$' || prev_codeline =~ ':$' - if this_codeline !~ '^\s*begin\>' - return indnt + shiftwidth() - else - " If it does start with "begin" then keep the same indent - "return indnt + shiftwidth() - return indnt - endif - endif - - " Inside a parameter list (i.e. a "(" without a ")"). ???? Considers - " only the line before the current one. TODO: Get it working for - " parameter lists longer than two lines. - if prev_codeline =~ '([^)]\+$' - return indnt + shiftwidth() - endif - - - " DECREASE INDENT - - " Lines starting with "else", but not following line ending with - " "end". - if this_codeline =~ '^\s*else\>' && prev_codeline !~ '\<end$' - return indnt - shiftwidth() - endif - - " Lines after a single-statement branch/loop. - " Two lines before ended in "then", "else", or "do" - " Previous line didn't end in "begin" - let prev2_codeline_num = s:GetPrevNonCommentLineNum( prev_codeline_num ) - let prev2_codeline = getline( prev2_codeline_num ) - if prev2_codeline =~ '\<\(then\|else\|do\)$' && prev_codeline !~ '\<begin$' - " If the next code line after a single statement branch/loop - " starts with "end", "except" or "finally", we need an - " additional unindentation. - if this_codeline =~ '^\s*\(end;\|except\|finally\|\)$' - " Note that we don't return from here. - return indnt - 2 * shiftwidth() - endif - return indnt - shiftwidth() - endif - - " Lines starting with "until" or "end". This rule must be overridden - " by the one for "end" after a single-statement branch/loop. In - " other words that rule should come before this one. - if this_codeline =~ '^\s*\(end\|until\)\>' - return indnt - shiftwidth() - endif - - - " MISCELLANEOUS THINGS TO CATCH - - " Most "begin"s will have been handled by now. Any remaining - " "begin"s on their own line should go in column 1. - if this_codeline =~ '^\s*begin$' - return 0 - endif - - -" ____________________________________________________________________ -" Object/Borland Pascal/Delphi Extensions -" -" Note that extended-pascal is handled here, unless it is simpler to -" handle them in the standard-pascal section above. - - - " COLUMN 1 ALWAYS - - " section headers at start of line. - if this_codeline =~ '^\s*\(interface\|implementation\|uses\|unit\)\>' - return 0 - endif - - - " INDENT ONCE - - " If the PREVIOUS LINE ended in these items, always indent. - if prev_codeline =~ '^\s*\(unit\|uses\|try\|except\|finally\|private\|protected\|public\|published\)$' - return indnt + shiftwidth() - endif - - " ???? Indent "procedure" and "functions" if they appear within an - " class/object definition. But that means overriding standard-pascal - " rule where these words always go in column 1. - - - " UNINDENT ONCE - - if this_codeline =~ '^\s*\(except\|finally\)$' - return indnt - shiftwidth() - endif - - if this_codeline =~ '^\s*\(private\|protected\|public\|published\)$' - return indnt - shiftwidth() - endif - - -" ____________________________________________________________________ - - " If nothing changed, return same indent. - return indnt -endfunction - - -endif diff --git a/indent/perl.vim b/indent/perl.vim index d515844e..42cc1d01 100644 --- a/indent/perl.vim +++ b/indent/perl.vim @@ -1,187 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Perl 5 -" Maintainer: vim-perl <vim-perl@googlegroups.com> -" Homepage: http://github.com/vim-perl/vim-perl -" Bugs/requests: http://github.com/vim-perl/vim-perl/issues -" Last Change: 2017-01-04 - -" Suggestions and improvements by : -" Aaron J. Sherman (use syntax for hints) -" Artem Chuprina (play nice with folding) - -" TODO things that are not or not properly indented (yet) : -" - Continued statements -" print "foo", -" "bar"; -" print "foo" -" if bar(); -" - Multiline regular expressions (m//x) -" (The following probably needs modifying the perl syntax file) -" - qw() lists -" - Heredocs with terminators that don't match \I\i* - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" Is syntax highlighting active ? -let b:indent_use_syntax = has("syntax") - -setlocal indentexpr=GetPerlIndent() -setlocal indentkeys+=0=,0),0],0=or,0=and -if !b:indent_use_syntax - setlocal indentkeys+=0=EO -endif - -let s:cpo_save = &cpo -set cpo-=C - -function! GetPerlIndent() - - " Get the line to be indented - let cline = getline(v:lnum) - - " Indent POD markers to column 0 - if cline =~ '^\s*=\L\@!' - return 0 - endif - - " Get current syntax item at the line's first char - let csynid = '' - if b:indent_use_syntax - let csynid = synIDattr(synID(v:lnum,1,0),"name") - endif - - " Don't reindent POD and heredocs - if csynid == "perlPOD" || csynid == "perlHereDoc" || csynid =~ "^pod" - return indent(v:lnum) - endif - - " Indent end-of-heredocs markers to column 0 - if b:indent_use_syntax - " Assumes that an end-of-heredoc marker matches \I\i* to avoid - " confusion with other types of strings - if csynid == "perlStringStartEnd" && cline =~ '^\I\i*$' - return 0 - endif - else - " Without syntax hints, assume that end-of-heredocs markers begin with EO - if cline =~ '^\s*EO' - return 0 - endif - endif - - " Now get the indent of the previous perl line. - - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - let line = getline(lnum) - let ind = indent(lnum) - " Skip heredocs, POD, and comments on 1st column - if b:indent_use_syntax - let skippin = 2 - while skippin - let synid = synIDattr(synID(lnum,1,0),"name") - if (synid == "perlStringStartEnd" && line =~ '^\I\i*$') - \ || (skippin != 2 && synid == "perlPOD") - \ || (skippin != 2 && synid == "perlHereDoc") - \ || synid == "perlComment" - \ || synid =~ "^pod" - let lnum = prevnonblank(lnum - 1) - if lnum == 0 - return 0 - endif - let line = getline(lnum) - let ind = indent(lnum) - let skippin = 1 - else - let skippin = 0 - endif - endwhile - else - if line =~ "^EO" - let lnum = search("<<[\"']\\=EO", "bW") - let line = getline(lnum) - let ind = indent(lnum) - endif - endif - - " Indent blocks enclosed by {}, (), or [] - if b:indent_use_syntax - " Find a real opening brace - " NOTE: Unlike Perl character classes, we do NOT need to escape the - " closing brackets with a backslash. Doing so just puts a backslash - " in the character class and causes sorrow. Instead, put the closing - " bracket as the first character in the class. - let braceclass = '[][(){}]' - let bracepos = match(line, braceclass, matchend(line, '^\s*[])}]')) - while bracepos != -1 - let synid = synIDattr(synID(lnum, bracepos + 1, 0), "name") - " If the brace is highlighted in one of those groups, indent it. - " 'perlHereDoc' is here only to handle the case '&foo(<<EOF)'. - if synid == "" - \ || synid == "perlMatchStartEnd" - \ || synid == "perlHereDoc" - \ || synid == "perlBraces" - \ || synid == "perlStatementIndirObj" - \ || synid =~ "^perlFiledescStatement" - \ || synid =~ '^perl\(Sub\|Block\|Package\)Fold' - let brace = strpart(line, bracepos, 1) - if brace == '(' || brace == '{' || brace == '[' - let ind = ind + shiftwidth() - else - let ind = ind - shiftwidth() - endif - endif - let bracepos = match(line, braceclass, bracepos + 1) - endwhile - let bracepos = matchend(cline, '^\s*[])}]') - if bracepos != -1 - let synid = synIDattr(synID(v:lnum, bracepos, 0), "name") - if synid == "" - \ || synid == "perlMatchStartEnd" - \ || synid == "perlBraces" - \ || synid == "perlStatementIndirObj" - \ || synid =~ '^perl\(Sub\|Block\|Package\)Fold' - let ind = ind - shiftwidth() - endif - endif - else - if line =~ '[{[(]\s*\(#[^])}]*\)\=$' - let ind = ind + shiftwidth() - endif - if cline =~ '^\s*[])}]' - let ind = ind - shiftwidth() - endif - endif - - " Indent lines that begin with 'or' or 'and' - if cline =~ '^\s*\(or\|and\)\>' - if line !~ '^\s*\(or\|and\)\>' - let ind = ind + shiftwidth() - endif - elseif line =~ '^\s*\(or\|and\)\>' - let ind = ind - shiftwidth() - endif - - return ind - -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim:ts=8:sts=4:sw=4:expandtab:ft=vim - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'perl') == -1 " Vim indent file diff --git a/indent/perl6.vim b/indent/perl6.vim deleted file mode 100644 index 81091651..00000000 --- a/indent/perl6.vim +++ /dev/null @@ -1,136 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Perl 6 -" Maintainer: vim-perl <vim-perl@googlegroups.com> -" Homepage: http://github.com/vim-perl/vim-perl -" Bugs/requests: http://github.com/vim-perl/vim-perl/issues -" Last Change: 2017 Jun 13 -" Contributors: Andy Lester <andy@petdance.com> -" Hinrik Örn Sigurðsson <hinrik.sig@gmail.com> -" -" Adapted from indent/perl.vim by Rafael Garcia-Suarez <rgarciasuarez@free.fr> - -" Suggestions and improvements by : -" Aaron J. Sherman (use syntax for hints) -" Artem Chuprina (play nice with folding) -" TODO: -" This file still relies on stuff from the Perl 5 syntax file, which Perl 6 -" does not use. -" -" Things that are not or not properly indented (yet) : -" - Continued statements -" print "foo", -" "bar"; -" print "foo" -" if bar(); -" - Multiline regular expressions (m//x) -" (The following probably needs modifying the perl syntax file) -" - qw() lists -" - Heredocs with terminators that don't match \I\i* - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" Is syntax highlighting active ? -let b:indent_use_syntax = has("syntax") - -setlocal indentexpr=GetPerl6Indent() - -" we reset it first because the Perl 5 indent file might have been loaded due -" to a .pl/pm file extension, and indent files don't clean up afterwards -setlocal indentkeys& - -setlocal indentkeys+=0=,0),0],0>,0»,0=or,0=and -if !b:indent_use_syntax - setlocal indentkeys+=0=EO -endif - -let s:cpo_save = &cpo -set cpo-=C - -function! GetPerl6Indent() - - " Get the line to be indented - let cline = getline(v:lnum) - - " Indent POD markers to column 0 - if cline =~ '^\s*=\L\@!' - return 0 - endif - - " Don't reindent coments on first column - if cline =~ '^#' - return 0 - endif - - " Get current syntax item at the line's first char - let csynid = '' - if b:indent_use_syntax - let csynid = synIDattr(synID(v:lnum,1,0),"name") - endif - - " Don't reindent POD and heredocs - if csynid =~ "^p6Pod" - return indent(v:lnum) - endif - - - " Now get the indent of the previous perl line. - - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - let line = getline(lnum) - let ind = indent(lnum) - " Skip heredocs, POD, and comments on 1st column - if b:indent_use_syntax - let skippin = 2 - while skippin - let synid = synIDattr(synID(lnum,1,0),"name") - if (synid =~ "^p6Pod" || synid =~ "p6Comment") - let lnum = prevnonblank(lnum - 1) - if lnum == 0 - return 0 - endif - let line = getline(lnum) - let ind = indent(lnum) - let skippin = 1 - else - let skippin = 0 - endif - endwhile - endif - - if line =~ '[<«\[{(]\s*\(#[^)}\]»>]*\)\=$' - let ind = ind + shiftwidth() - endif - if cline =~ '^\s*[)}\]»>]' - let ind = ind - shiftwidth() - endif - - " Indent lines that begin with 'or' or 'and' - if cline =~ '^\s*\(or\|and\)\>' - if line !~ '^\s*\(or\|and\)\>' - let ind = ind + shiftwidth() - endif - elseif line =~ '^\s*\(or\|and\)\>' - let ind = ind - shiftwidth() - endif - - return ind - -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim:ts=8:sts=4:sw=4:expandtab:ft=vim - -endif diff --git a/indent/php.vim b/indent/php.vim deleted file mode 100644 index 3676b66f..00000000 --- a/indent/php.vim +++ /dev/null @@ -1,853 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: PHP -" Author: John Wellesz <John.wellesz (AT) teaser (DOT) fr> -" URL: http://www.2072productions.com/vim/indent/php.vim -" Home: https://github.com/2072/PHP-Indenting-for-VIm -" Last Change: 2017 Jun 13 -" Version: 1.62 -" -" -" Type :help php-indent for available options -" -" A fully commented version of this file is available on github -" -" -" If you find a bug, please open a ticket on github.org -" ( https://github.com/2072/PHP-Indenting-for-VIm/issues ) with an example of -" code that breaks the algorithm. -" - -" 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 ) -" the later is bunbdled by default with Vim 7. -" -" -" In the case you have syntax errors in your script such as HereDoc end -" identifiers not at col 1 you'll have to indent your file 2 times (This -" script will automatically put HereDoc end identifiers at col 1 if -" they are followed by a ';'). -" - -" NOTE: If you are editing files in Unix file format and that (by accident) -" there are '\r' before new lines, this script won't be able to proceed -" correctly and will make many mistakes because it won't be able to match -" '\s*$' correctly. -" So you have to remove those useless characters first with a command like: -" -" :%s /\r$//g -" -" or simply 'let' the option PHP_removeCRwhenUnix to 1 and the script will -" silently remove them when VIM load this script (at each bufread). - - - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - - -let g:php_sync_method = 0 - - -if exists("PHP_default_indenting") - let b:PHP_default_indenting = PHP_default_indenting * shiftwidth() -else - let b:PHP_default_indenting = 0 -endif - -if exists("PHP_outdentSLComments") - let b:PHP_outdentSLComments = PHP_outdentSLComments * shiftwidth() -else - let b:PHP_outdentSLComments = 0 -endif - -if exists("PHP_BracesAtCodeLevel") - let b:PHP_BracesAtCodeLevel = PHP_BracesAtCodeLevel -else - let b:PHP_BracesAtCodeLevel = 0 -endif - - -if exists("PHP_autoformatcomment") - let b:PHP_autoformatcomment = PHP_autoformatcomment -else - let b:PHP_autoformatcomment = 1 -endif - -if exists("PHP_outdentphpescape") - let b:PHP_outdentphpescape = PHP_outdentphpescape -else - let b:PHP_outdentphpescape = 1 -endif - - -if exists("PHP_vintage_case_default_indent") && PHP_vintage_case_default_indent - let b:PHP_vintage_case_default_indent = 1 -else - let b:PHP_vintage_case_default_indent = 0 -endif - - - -let b:PHP_lastindented = 0 -let b:PHP_indentbeforelast = 0 -let b:PHP_indentinghuge = 0 -let b:PHP_CurrentIndentLevel = b:PHP_default_indenting -let b:PHP_LastIndentedWasComment = 0 -let b:PHP_InsideMultilineComment = 0 -let b:InPHPcode = 0 -let b:InPHPcode_checked = 0 -let b:InPHPcode_and_script = 0 -let b:InPHPcode_tofind = "" -let b:PHP_oldchangetick = b:changedtick -let b:UserIsTypingComment = 0 -let b:optionsset = 0 - -setlocal nosmartindent -setlocal noautoindent -setlocal nocindent -setlocal nolisp - -setlocal indentexpr=GetPhpIndent() -setlocal indentkeys=0{,0},0),0],:,!^F,o,O,e,*<Return>,=?>,=<?,=*/ - - - -let s:searchpairflags = 'bWr' - -if &fileformat == "unix" && exists("PHP_removeCRwhenUnix") && PHP_removeCRwhenUnix - silent! %s/\r$//g -endif - -if exists("*GetPhpIndent") - call ResetPhpOptions() - finish -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:unstated = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.s:endline - - -let s:terminated = '\%(\%(;\%(\s*\%(?>\|}\)\)\=\|<<<\s*[''"]\=\a\w*[''"]\=$\|^\s*}\|^\s*'.s:PHP_validVariable.':\)'.s:endline.'\)' -let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!' -let s:structureHead = '^\s*\%(' . s:blockstart . '\)\|'. s:functionDecl . s:endline . '\|\<new\s\+class\>' - - - -let s:escapeDebugStops = 0 -function! DebugPrintReturn(scriptLine) - - if ! s:escapeDebugStops - echo "debug:" . a:scriptLine - let c = getchar() - if c == "\<Del>" - let s:escapeDebugStops = 1 - end - endif - -endfunction - -function! GetLastRealCodeLNum(startline) " {{{ - - let lnum = a:startline - - if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1 - let lnum = b:GetLastRealCodeLNum_ADD - endif - - while lnum > 1 - let lnum = prevnonblank(lnum) - let lastline = getline(lnum) - - if b:InPHPcode_and_script && lastline =~ '?>\s*$' - let lnum = lnum - 1 - elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$' - let lnum = lnum - 1 - elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)' - let lnum = lnum - 1 - elseif lastline =~ '\*/\s*$' - call cursor(lnum, 1) - if lastline !~ '^\*/' - call search('\*/', 'W') - endif - let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()') - - let lastline = getline(lnum) - if lastline =~ '^\s*/\*' - let lnum = lnum - 1 - else - break - endif - - - elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>' - - while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1 - let lnum = lnum - 1 - let lastline = getline(lnum) - endwhile - if lastline =~ '^\s*?>' - let lnum = lnum - 1 - else - break - endif - - - elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc - let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<\\s*[''"]\\=\1[''"]\\=$', '') - while getline(lnum) !~? tofind && lnum > 1 - let lnum = lnum - 1 - endwhile - elseif lastline =~ '^[^''"`]*[''"`][;,]'.s:endline - - let tofind=substitute( lastline, '^.*\([''"`]\)[;,].*$', '^[^\1]\\+[\1]$\\|^[^\1]\\+[=([]\\s*[\1]', '') - let trylnum = lnum - while getline(trylnum) !~? tofind && trylnum > 1 - let trylnum = trylnum - 1 - endwhile - - if trylnum == 1 - break - else - if lastline =~ ';'.s:endline - while getline(trylnum) !~? s:terminated && getline(trylnum) !~? '{'.s:endline && trylnum > 1 - let trylnum = prevnonblank(trylnum - 1) - endwhile - - - if trylnum == 1 - break - end - end - let lnum = trylnum - end - else - break - endif - endwhile - - if lnum==1 && getline(lnum) !~ '<?' - let lnum=0 - endif - - if b:InPHPcode_and_script && 1 > b:InPHPcode - let b:InPHPcode_and_script = 0 - endif - - return lnum -endfunction " }}} - -function! Skippmatch2() - - let line = getline(".") - - if line =~ "\\([\"']\\).*/\\*.*\\1" || line =~ '\%(//\|#\).*/\*' - return 1 - else - return 0 - endif -endfun - -function! Skippmatch() " {{{ - let synname = synIDattr(synID(line("."), col("."), 0), "name") - if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# '^php\%(Doc\)\?Comment' && b:UserIsTypingComment - return 0 - else - return 1 - endif -endfun " }}} - -function! FindOpenBracket(lnum, blockStarter) " {{{ - call cursor(a:lnum, 1) - let line = searchpair('{', '', '}', 'bW', 'Skippmatch()') - - if a:blockStarter == 1 - while line > 1 - let linec = getline(line) - - if linec =~ s:terminated || linec =~ s:structureHead - break - endif - - let line = GetLastRealCodeLNum(line - 1) - endwhile - endif - - return line -endfun " }}} - -let s:blockChars = {'{':1, '[': 1, '(': 1, ')':-1, ']':-1, '}':-1} -function! BalanceDirection (str) - - let balance = 0 - - for c in split(a:str, '\zs') - if has_key(s:blockChars, c) - let balance += s:blockChars[c] - endif - endfor - - return balance -endfun - -function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{ - - if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>' - let beforeelse = a:lnum - else - let beforeelse = GetLastRealCodeLNum(a:lnum - 1) - endif - - if !s:level - let s:iftoskip = 0 - endif - - if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>' - let s:iftoskip = s:iftoskip + 1 - endif - - if getline(beforeelse) =~ '^\s*}' - let beforeelse = FindOpenBracket(beforeelse, 0) - - if getline(beforeelse) =~ '^\s*{' - let beforeelse = GetLastRealCodeLNum(beforeelse - 1) - endif - endif - - - if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>' - return beforeelse - endif - - if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1 - - if s:iftoskip && getline(beforeelse) =~# '^\s*if\>' - let s:iftoskip = s:iftoskip - 1 - endif - - let s:level = s:level + 1 - let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse) - endif - - return beforeelse - -endfunction " }}} - -let s:defaultORcase = '^\s*\%(default\|case\).*:' - -function! FindTheSwitchIndent (lnum) " {{{ - - let test = GetLastRealCodeLNum(a:lnum - 1) - - if test <= 1 - return indent(1) - shiftwidth() * b:PHP_vintage_case_default_indent - end - - while getline(test) =~ '^\s*}' && test > 1 - let test = GetLastRealCodeLNum(FindOpenBracket(test, 0) - 1) - - if getline(test) =~ '^\s*switch\>' - let test = GetLastRealCodeLNum(test - 1) - endif - endwhile - - if getline(test) =~# '^\s*switch\>' - return indent(test) - elseif getline(test) =~# s:defaultORcase - return indent(test) - shiftwidth() * b:PHP_vintage_case_default_indent - else - return FindTheSwitchIndent(test) - endif - -endfunction "}}} - -let s:SynPHPMatchGroups = {'phpParent':1, 'Delimiter':1, 'Define':1, 'Storageclass':1, 'StorageClass':1, 'Structure':1, 'Exception':1} -function! IslinePHP (lnum, tofind) " {{{ - let cline = getline(a:lnum) - - if a:tofind=="" - let tofind = "^\\s*[\"'`]*\\s*\\zs\\S" - else - let tofind = a:tofind - endif - - let tofind = tofind . '\c' - - let coltotest = match (cline, tofind) + 1 - - let synname = synIDattr(synID(a:lnum, coltotest, 0), "name") - - if synname == 'phpStringSingle' || synname == 'phpStringDouble' || synname == 'phpBacktick' - if cline !~ '^\s*[''"`]' - return "SpecStringEntrails" - else - return synname - end - end - - if get(s:SynPHPMatchGroups, synname) || synname =~ '^php' || synname =~? '^javaScript' - return synname - else - return "" - endif -endfunction " }}} - -let s:autoresetoptions = 0 -if ! s:autoresetoptions - let s:autoresetoptions = 1 -endif - -function! ResetPhpOptions() - if ! b:optionsset && &filetype =~ "php" - if b:PHP_autoformatcomment - - setlocal comments=s1:/*,mb:*,ex:*/,://,:# - - setlocal formatoptions-=t - setlocal formatoptions+=q - setlocal formatoptions+=r - setlocal formatoptions+=o - setlocal formatoptions+=c - setlocal formatoptions+=b - endif - let b:optionsset = 1 - endif -endfunc - -call ResetPhpOptions() - -function! GetPhpIndent() - - let b:GetLastRealCodeLNum_ADD = 0 - - let UserIsEditing=0 - if b:PHP_oldchangetick != b:changedtick - let b:PHP_oldchangetick = b:changedtick - let UserIsEditing=1 - endif - - if b:PHP_default_indenting - let b:PHP_default_indenting = g:PHP_default_indenting * shiftwidth() - endif - - let cline = getline(v:lnum) - - if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast - if b:PHP_indentbeforelast - let b:PHP_indentinghuge = 1 - endif - let b:PHP_indentbeforelast = b:PHP_lastindented - endif - - if b:InPHPcode_checked && prevnonblank(v:lnum - 1) != b:PHP_lastindented - if b:PHP_indentinghuge - let b:PHP_indentinghuge = 0 - let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - endif - let real_PHP_lastindented = v:lnum - let b:PHP_LastIndentedWasComment=0 - let b:PHP_InsideMultilineComment=0 - let b:PHP_indentbeforelast = 0 - - let b:InPHPcode = 0 - let b:InPHPcode_checked = 0 - let b:InPHPcode_and_script = 0 - let b:InPHPcode_tofind = "" - - elseif v:lnum > b:PHP_lastindented - let real_PHP_lastindented = b:PHP_lastindented - else - let real_PHP_lastindented = v:lnum - endif - - let b:PHP_lastindented = v:lnum - - - if !b:InPHPcode_checked " {{{ One time check - let b:InPHPcode_checked = 1 - let b:UserIsTypingComment = 0 - - let synname = "" - if cline !~ '<?.*?>' - let synname = IslinePHP (prevnonblank(v:lnum), "") - endif - - if synname!="" - if synname == "SpecStringEntrails" - let b:InPHPcode = -1 " thumb down - let b:InPHPcode_tofind = "" - elseif synname != "phpHereDoc" && synname != "phpHereDocDelimiter" - let b:InPHPcode = 1 - let b:InPHPcode_tofind = "" - - if synname =~# '^php\%(Doc\)\?Comment' - let b:UserIsTypingComment = 1 - let b:InPHPcode_checked = 0 - endif - - if synname =~? '^javaScript' - let b:InPHPcode_and_script = 1 - endif - - else - let b:InPHPcode = 0 - - let lnum = v:lnum - 1 - while getline(lnum) !~? '<<<\s*[''"]\=\a\w*[''"]\=$' && lnum > 1 - let lnum = lnum - 1 - endwhile - - let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<\s*[''"]\=\(\a\w*\)[''"]\=$', '^\\s*\1;\\=$', '') - endif - else - let b:InPHPcode = 0 - let b:InPHPcode_tofind = s:PHP_startindenttag - endif - endif "!b:InPHPcode_checked }}} - - - " Test if we are indenting PHP code {{{ - let lnum = prevnonblank(v:lnum - 1) - let last_line = getline(lnum) - let endline= s:endline - - if b:InPHPcode_tofind!="" - if cline =~? b:InPHPcode_tofind - let b:InPHPcode_tofind = "" - let b:UserIsTypingComment = 0 - - if b:InPHPcode == -1 - let b:InPHPcode = 1 - return -1 - end - - let b:InPHPcode = 1 - - if cline =~ '\*/' - call cursor(v:lnum, 1) - if cline !~ '^\*/' - call search('\*/', 'W') - endif - let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()') - - let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - - let b:PHP_LastIndentedWasComment = 0 - - if cline =~ '^\s*\*/' - return indent(lnum) + 1 - else - return indent(lnum) - endif - - elseif cline =~? '<script\>' - let b:InPHPcode_and_script = 1 - let b:GetLastRealCodeLNum_ADD = v:lnum - endif - endif - endif - - if 1 == b:InPHPcode - - if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter" - if cline !~? s:PHP_startindenttag - let b:InPHPcode = 0 - let b:InPHPcode_tofind = s:PHP_startindenttag - elseif cline =~? '<script\>' - let b:InPHPcode_and_script = 1 - endif - - elseif last_line =~ '^[^''"`]\+[''"`]$' " 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*[''"]\=$' - let b:InPHPcode = 0 - let b:InPHPcode_tofind = substitute( last_line, '^.*<<<\s*[''"]\=\(\a\w*\)[''"]\=$', '^\\s*\1;\\=$', '') - - elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*' - let b:InPHPcode = 0 - let b:InPHPcode_tofind = '\*/' - - elseif cline =~? '^\s*</script>' - let b:InPHPcode = 0 - let b:InPHPcode_tofind = s:PHP_startindenttag - endif - endif " }}} - - - if 1 > b:InPHPcode && !b:InPHPcode_and_script - return -1 - endif - - " Indent successive // or # comment the same way the first is {{{ - let addSpecial = 0 - if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)' - let addSpecial = b:PHP_outdentSLComments - if b:PHP_LastIndentedWasComment == 1 - return indent(real_PHP_lastindented) - endif - let b:PHP_LastIndentedWasComment = 1 - else - let b:PHP_LastIndentedWasComment = 0 - endif " }}} - - " Indent multiline /* comments correctly {{{ - - if b:PHP_InsideMultilineComment || b:UserIsTypingComment - if cline =~ '^\s*\*\%(\/\)\@!' - if last_line =~ '^\s*/\*' - return indent(lnum) + 1 - else - return indent(lnum) - endif - else - let b:PHP_InsideMultilineComment = 0 - endif - endif - - if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*\%(.*\*/\)\@!' - if getline(v:lnum + 1) !~ '^\s*\*' - return -1 - endif - let b:PHP_InsideMultilineComment = 1 - endif " }}} - - - " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{ - if cline =~# '^\s*<?' && cline !~ '?>' && b:PHP_outdentphpescape - return 0 - endif - - if cline =~ '^\s*?>' && cline !~# '<?' && b:PHP_outdentphpescape - return 0 - endif - - if cline =~? '^\s*\a\w*;$\|^\a\w*$\|^\s*[''"`][;,]' && cline !~? s:notPhpHereDoc - return 0 - endif " }}} - - let s:level = 0 - - let lnum = GetLastRealCodeLNum(v:lnum - 1) - - let last_line = getline(lnum) - let ind = indent(lnum) - - if ind==0 && b:PHP_default_indenting - let ind = b:PHP_default_indenting - endif - - if lnum == 0 - return b:PHP_default_indenting + addSpecial - endif - - - if cline =~ '^\s*}\%(}}\)\@!' - let ind = indent(FindOpenBracket(v:lnum, 1)) - let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - return ind - endif - - if cline =~ '^\s*\*/' - call cursor(v:lnum, 1) - if cline !~ '^\*/' - call search('\*/', 'W') - endif - let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()') - - let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - - if cline =~ '^\s*\*/' - return indent(lnum) + 1 - else - return indent(lnum) - endif - endif - - - if last_line =~ '[;}]'.endline && last_line !~ '^[)\]]' && last_line !~# s:defaultORcase - 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 - return b:PHP_CurrentIndentLevel + addSpecial - endif - endif - - let LastLineClosed = 0 - - let terminated = s:terminated - - let unstated = s:unstated - - - if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>' - let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - return indent(FindTheIfOfAnElse(v:lnum, 1)) - elseif cline =~# s:defaultORcase - return FindTheSwitchIndent(v:lnum) + shiftwidth() * b:PHP_vintage_case_default_indent - elseif cline =~ '^\s*)\=\s*{' - let previous_line = last_line - let last_line_num = lnum - - while last_line_num > 1 - - if previous_line =~ terminated || previous_line =~ s:structureHead - - let ind = indent(last_line_num) - - if b:PHP_BracesAtCodeLevel - let ind = ind + shiftwidth() - endif - - return ind - endif - - let last_line_num = GetLastRealCodeLNum(last_line_num - 1) - let previous_line = getline(last_line_num) - endwhile - - elseif last_line =~# unstated && cline !~ '^\s*);\='.endline - let ind = ind + shiftwidth() " we indent one level further when the preceding line is not stated - return ind + addSpecial - - elseif (ind != b:PHP_default_indenting || last_line =~ '^[)\]]' ) && last_line =~ terminated - let previous_line = last_line - let last_line_num = lnum - let LastLineClosed = 1 - - let isSingleLineBlock = 0 - while 1 - if ! isSingleLineBlock && previous_line =~ '^\s*}\|;\s*}'.endline " XXX - - call cursor(last_line_num, 1) - if previous_line !~ '^}' - call search('}\|;\s*}'.endline, 'W') - end - let oldLastLine = last_line_num - let last_line_num = searchpair('{', '', '}', 'bW', 'Skippmatch()') - - if getline(last_line_num) =~ '^\s*{' - let last_line_num = GetLastRealCodeLNum(last_line_num - 1) - elseif oldLastLine == last_line_num - let isSingleLineBlock = 1 - continue - endif - - let previous_line = getline(last_line_num) - - continue - else - let isSingleLineBlock = 0 - - if getline(last_line_num) =~# '^\s*else\%(if\)\=\>' - let last_line_num = FindTheIfOfAnElse(last_line_num, 0) - continue - endif - - - let last_match = last_line_num - - let one_ahead_indent = indent(last_line_num) - let last_line_num = GetLastRealCodeLNum(last_line_num - 1) - let two_ahead_indent = indent(last_line_num) - let after_previous_line = previous_line - let previous_line = getline(last_line_num) - - - if previous_line =~# s:defaultORcase.'\|{'.endline - break - endif - - if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline - break - endif - - if one_ahead_indent == two_ahead_indent || last_line_num < 1 - if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1 - break - endif - endif - endif - endwhile - - if indent(last_match) != ind - let ind = indent(last_match) - let b:PHP_CurrentIndentLevel = b:PHP_default_indenting - - return ind + addSpecial - endif - endif - - if (last_line !~ '^\s*}\%(}}\)\@!') - let plinnum = GetLastRealCodeLNum(lnum - 1) - else - let plinnum = GetLastRealCodeLNum(FindOpenBracket(lnum, 1) - 1) - endif - - let AntepenultimateLine = getline(plinnum) - - let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','') - - - if ind == b:PHP_default_indenting - if last_line =~ terminated && last_line !~# s:defaultORcase - let LastLineClosed = 1 - endif - endif - - if !LastLineClosed - - - if last_line =~# '[{(\[]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(\[]'.endline && BalanceDirection(last_line) > 0 - - let dontIndent = 0 - if last_line =~ '\S\+\s*{'.endline && last_line !~ '^\s*[)\]]\+\s*{'.endline && last_line !~ s:structureHead - let dontIndent = 1 - endif - - if !dontIndent && (!b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{') - let ind = ind + shiftwidth() - endif - - if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1 - let b:PHP_CurrentIndentLevel = ind - - return ind + addSpecial - endif - - elseif last_line =~ '\S\+\s*),'.endline && BalanceDirection(last_line) < 0 - call cursor(lnum, 1) - call search('),'.endline, 'W') " line never begins with ) so no need for 'c' flag - let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()') - if openedparent != lnum - let ind = indent(openedparent) - endif - - elseif last_line =~ '^\s*'.s:blockstart - let ind = ind + shiftwidth() - - - elseif AntepenultimateLine =~ '{'.endline && AntepenultimateLine !~? '^\s*use\>' || AntepenultimateLine =~ terminated || AntepenultimateLine =~# s:defaultORcase - let ind = ind + shiftwidth() - endif - - endif - - if cline =~ '^\s*[)\]];\=' - let ind = ind - shiftwidth() - endif - - let b:PHP_CurrentIndentLevel = ind - return ind + addSpecial -endfunction - -endif diff --git a/indent/postscr.vim b/indent/postscr.vim deleted file mode 100644 index 53956b24..00000000 --- a/indent/postscr.vim +++ /dev/null @@ -1,72 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" PostScript indent file -" Language: PostScript -" Maintainer: Mike Williams <mrw@netcomuk.co.uk> -" Last Change: 2nd July 2001 -" - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=PostscrIndentGet(v:lnum) -setlocal indentkeys+=0],0=>>,0=%%,0=end,0=restore,0=grestore indentkeys-=:,0#,e - -" Catch multiple instantiations -if exists("*PostscrIndentGet") - finish -endif - -function! PostscrIndentGet(lnum) - " Find a non-empty non-comment line above the current line. - " Note: ignores DSC comments as well! - let lnum = a:lnum - 1 - while lnum != 0 - let lnum = prevnonblank(lnum) - if getline(lnum) !~ '^\s*%.*$' - break - endif - let lnum = lnum - 1 - endwhile - - " Hit the start of the file, use user indent. - if lnum == 0 - return -1 - endif - - " Start with the indent of the previous line - let ind = indent(lnum) - let pline = getline(lnum) - - " Indent for dicts, arrays, and saves with possible trailing comment - if pline =~ '\(begin\|<<\|g\=save\|{\|[\)\s*\(%.*\)\=$' - let ind = ind + shiftwidth() - endif - - " Remove indent for popped dicts, and restores. - if pline =~ '\(end\|g\=restore\)\s*$' - let ind = ind - shiftwidth() - - " Else handle immediate dedents of dicts, restores, and arrays. - elseif getline(a:lnum) =~ '\(end\|>>\|g\=restore\|}\|]\)' - let ind = ind - shiftwidth() - - " Else handle DSC comments - always start of line. - elseif getline(a:lnum) =~ '^\s*%%' - let ind = 0 - endif - - " For now catch excessive left indents if they occur. - if ind < 0 - let ind = -1 - endif - - return ind -endfunction - -" vim:sw=2 - -endif diff --git a/indent/pov.vim b/indent/pov.vim deleted file mode 100644 index 90f2cafb..00000000 --- a/indent/pov.vim +++ /dev/null @@ -1,88 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: PoV-Ray Scene Description Language -" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz> -" Last Change: 2017 Jun 13 -" URI: http://trific.ath.cx/Ftp/vim/indent/pov.vim - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" Some preliminary settings. -setlocal nolisp " Make sure lisp indenting doesn't supersede us. - -setlocal indentexpr=GetPoVRayIndent() -setlocal indentkeys+==else,=end,0] - -" Only define the function once. -if exists("*GetPoVRayIndent") - finish -endif - -" Counts matches of a regexp <rexp> in line number <line>. -" Doesn't count matches inside strings and comments (as defined by current -" syntax). -function! s:MatchCount(line, rexp) - let str = getline(a:line) - let i = 0 - let n = 0 - while i >= 0 - let i = matchend(str, a:rexp, i) - if i >= 0 && synIDattr(synID(a:line, i, 0), "name") !~? "string\|comment" - let n = n + 1 - endif - endwhile - return n -endfunction - -" The main function. Returns indent amount. -function GetPoVRayIndent() - " If we are inside a comment (may be nested in obscure ways), give up - if synIDattr(synID(v:lnum, indent(v:lnum)+1, 0), "name") =~? "string\|comment" - return -1 - endif - - " Search backwards for the frist non-empty, non-comment line. - let plnum = prevnonblank(v:lnum - 1) - let plind = indent(plnum) - while plnum > 0 && synIDattr(synID(plnum, plind+1, 0), "name") =~? "comment" - let plnum = prevnonblank(plnum - 1) - let plind = indent(plnum) - endwhile - - " Start indenting from zero - if plnum == 0 - return 0 - endif - - " Analyse previous nonempty line. - let chg = 0 - let chg = chg + s:MatchCount(plnum, '[[{(]') - let chg = chg + s:MatchCount(plnum, '#\s*\%(if\|ifdef\|ifndef\|switch\|while\|macro\|else\)\>') - let chg = chg - s:MatchCount(plnum, '#\s*end\>') - let chg = chg - s:MatchCount(plnum, '[]})]') - " Dirty hack for people writing #if and #else on the same line. - let chg = chg - s:MatchCount(plnum, '#\s*\%(if\|ifdef\|ifndef\|switch\)\>.*#\s*else\>') - " When chg > 0, then we opened groups and we should indent more, but when - " chg < 0, we closed groups and this already affected the previous line, - " so we should not dedent. And when everything else fails, scream. - let chg = chg > 0 ? chg : 0 - - " Analyse current line - " FIXME: If we have to dedent, we should try to find the indentation of the - " opening line. - let cur = s:MatchCount(v:lnum, '^\s*\%(#\s*\%(end\|else\)\>\|[]})]\)') - if cur > 0 - let final = plind + (chg - cur) * shiftwidth() - else - let final = plind + chg * shiftwidth() - endif - - return final < 0 ? 0 : final -endfunction - -endif diff --git a/indent/prolog.vim b/indent/prolog.vim deleted file mode 100644 index 8f66554e..00000000 --- a/indent/prolog.vim +++ /dev/null @@ -1,62 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" vim: set sw=4 sts=4: -" Maintainer : Gergely Kontra <kgergely@mcl.hu> -" Revised on : 2002.02.18. 23:34:05 -" Language : Prolog - -" TODO: -" checking with respect to syntax highlighting -" ignoring multiline comments -" detecting multiline strings - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -let b:did_indent = 1 - -setlocal indentexpr=GetPrologIndent() -setlocal indentkeys-=:,0# -setlocal indentkeys+=0%,-,0;,>,0) - -" Only define the function once. -"if exists("*GetPrologIndent") -" finish -"endif - -function! GetPrologIndent() - " Find a non-blank line above the current line. - let pnum = prevnonblank(v:lnum - 1) - " Hit the start of the file, use zero indent. - if pnum == 0 - return 0 - endif - let line = getline(v:lnum) - let pline = getline(pnum) - - let ind = indent(pnum) - " Previous line was comment -> use previous line's indent - if pline =~ '^\s*%' - retu ind - endif - " Check for clause head on previous line - if pline =~ ':-\s*\(%.*\)\?$' - let ind = ind + shiftwidth() - " Check for end of clause on previous line - elseif pline =~ '\.\s*\(%.*\)\?$' - let ind = ind - shiftwidth() - endif - " Check for opening conditional on previous line - if pline =~ '^\s*\([(;]\|->\)' - let ind = ind + shiftwidth() - endif - " Check for closing an unclosed paren, or middle ; or -> - if line =~ '^\s*\([);]\|->\)' - let ind = ind - shiftwidth() - endif - return ind -endfunction - -endif diff --git a/indent/pyrex.vim b/indent/pyrex.vim deleted file mode 100644 index bf1f703c..00000000 --- a/indent/pyrex.vim +++ /dev/null @@ -1,17 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Pyrex -" Maintainer: Marco Barisione <marco.bari@people.it> -" URL: http://marcobari.altervista.org/pyrex_vim.html -" Last Change: 2005 Jun 24 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Use Python formatting rules -runtime! indent/python.vim - -endif diff --git a/indent/python.vim b/indent/python.vim index 87a447ed..48b34469 100644 --- a/indent/python.vim +++ b/indent/python.vim @@ -1,205 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Python -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Original Author: David Bustos <bustos@caltech.edu> -" Last Change: 2013 Jul 9 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" Some preliminary settings -setlocal nolisp " Make sure lisp indenting doesn't supersede us -setlocal autoindent " indentexpr isn't much help otherwise - -setlocal indentexpr=GetPythonIndent(v:lnum) -setlocal indentkeys+=<:>,=elif,=except - -" Only define the function once. -if exists("*GetPythonIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -" Come here when loading the script the first time. - -let s:maxoff = 50 " maximum number of lines to look backwards for () - -function GetPythonIndent(lnum) - - " If this line is explicitly joined: If the previous line was also joined, - " line it up with that one, otherwise add two 'shiftwidth' - if getline(a:lnum - 1) =~ '\\$' - if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$' - return indent(a:lnum - 1) - endif - return indent(a:lnum - 1) + (exists("g:pyindent_continue") ? eval(g:pyindent_continue) : (shiftwidth() * 2)) - endif - - " If the start of the line is in a string don't change the indent. - if has('syntax_items') - \ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$" - return -1 - endif - - " Search backwards for the previous non-empty line. - let plnum = prevnonblank(v:lnum - 1) - - if plnum == 0 - " This is the first non-empty line, use zero indent. - return 0 - endif - - " If the previous line is inside parenthesis, use the indent of the starting - " line. - " Trick: use the non-existing "dummy" variable to break out of the loop when - " going too far back. - call cursor(plnum, 1) - let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', - \ "line('.') < " . (plnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|Todo\\|String\\)$'") - if parlnum > 0 - let plindent = indent(parlnum) - let plnumstart = parlnum - else - let plindent = indent(plnum) - let plnumstart = plnum - endif - - - " When inside parenthesis: If at the first line below the parenthesis add - " two 'shiftwidth', otherwise same as previous line. - " i = (a - " + b - " + c) - call cursor(a:lnum, 1) - let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', - \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|Todo\\|String\\)$'") - if p > 0 - if p == plnum - " When the start is inside parenthesis, only indent one 'shiftwidth'. - let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', - \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|Todo\\|String\\)$'") - if pp > 0 - return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : shiftwidth()) - endif - return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (shiftwidth() * 2)) - endif - if plnumstart == p - return indent(plnum) - endif - return plindent - endif - - - " Get the line and remove a trailing comment. - " Use syntax highlighting attributes when possible. - let pline = getline(plnum) - let pline_len = strlen(pline) - if has('syntax_items') - " If the last character in the line is a comment, do a binary search for - " the start of the comment. synID() is slow, a linear search would take - " too long on a long line. - if synIDattr(synID(plnum, pline_len, 1), "name") =~ "\\(Comment\\|Todo\\)$" - let min = 1 - let max = pline_len - while min < max - let col = (min + max) / 2 - if synIDattr(synID(plnum, col, 1), "name") =~ "\\(Comment\\|Todo\\)$" - let max = col - else - let min = col + 1 - endif - endwhile - let pline = strpart(pline, 0, min - 1) - endif - else - let col = 0 - while col < pline_len - if pline[col] == '#' - let pline = strpart(pline, 0, col) - break - endif - let col = col + 1 - endwhile - endif - - " If the previous line ended with a colon, indent this line - if pline =~ ':\s*$' - return plindent + shiftwidth() - endif - - " If the previous line was a stop-execution statement... - if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>' - " See if the user has already dedented - if indent(a:lnum) > indent(plnum) - shiftwidth() - " If not, recommend one dedent - return indent(plnum) - shiftwidth() - endif - " Otherwise, trust the user - return -1 - endif - - " If the current line begins with a keyword that lines up with "try" - if getline(a:lnum) =~ '^\s*\(except\|finally\)\>' - let lnum = a:lnum - 1 - while lnum >= 1 - if getline(lnum) =~ '^\s*\(try\|except\)\>' - let ind = indent(lnum) - if ind >= indent(a:lnum) - return -1 " indent is already less than this - endif - return ind " line up with previous try or except - endif - let lnum = lnum - 1 - endwhile - return -1 " no matching "try"! - endif - - " If the current line begins with a header keyword, dedent - if getline(a:lnum) =~ '^\s*\(elif\|else\)\>' - - " Unless the previous line was a one-liner - if getline(plnumstart) =~ '^\s*\(for\|if\|try\)\>' - return plindent - endif - - " Or the user has already dedented - if indent(a:lnum) <= plindent - shiftwidth() - return -1 - endif - - return plindent - shiftwidth() - endif - - " When after a () construct we probably want to go back to the start line. - " a = (b - " + c) - " here - if parlnum > 0 - return plindent - endif - - return -1 - -endfunction - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:sw=2 - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'python') == -1 " PEP8 compatible Python indent file diff --git a/indent/r.vim b/indent/r.vim deleted file mode 100644 index e23f8a24..00000000 --- a/indent/r.vim +++ /dev/null @@ -1,525 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: R -" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> -" Homepage: https://github.com/jalvesaq/R-Vim-runtime -" Last Change: Thu Feb 18, 2016 06:32AM - - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentkeys=0{,0},:,!^F,o,O,e -setlocal indentexpr=GetRIndent() - -" Only define the function once. -if exists("*GetRIndent") - finish -endif - -" Options to make the indentation more similar to Emacs/ESS: -if !exists("g:r_indent_align_args") - let g:r_indent_align_args = 1 -endif -if !exists("g:r_indent_ess_comments") - let g:r_indent_ess_comments = 0 -endif -if !exists("g:r_indent_comment_column") - let g:r_indent_comment_column = 40 -endif -if ! exists("g:r_indent_ess_compatible") - let g:r_indent_ess_compatible = 0 -endif -if ! exists("g:r_indent_op_pattern") - let g:r_indent_op_pattern = '\(&\||\|+\|-\|\*\|/\|=\|\~\|%\|->\)\s*$' -endif - -function s:RDelete_quotes(line) - let i = 0 - let j = 0 - let line1 = "" - let llen = strlen(a:line) - while i < llen - if a:line[i] == '"' - let i += 1 - let line1 = line1 . 's' - while !(a:line[i] == '"' && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen - let i += 1 - endwhile - if a:line[i] == '"' - let i += 1 - endif - else - if a:line[i] == "'" - let i += 1 - let line1 = line1 . 's' - while !(a:line[i] == "'" && ((i > 1 && a:line[i-1] == '\' && a:line[i-2] == '\') || a:line[i-1] != '\')) && i < llen - let i += 1 - endwhile - if a:line[i] == "'" - let i += 1 - endif - else - if a:line[i] == "`" - let i += 1 - let line1 = line1 . 's' - while a:line[i] != "`" && i < llen - let i += 1 - endwhile - if a:line[i] == "`" - let i += 1 - endif - endif - endif - endif - if i == llen - break - endif - let line1 = line1 . a:line[i] - let j += 1 - let i += 1 - endwhile - return line1 -endfunction - -" Convert foo(bar()) int foo() -function s:RDelete_parens(line) - if s:Get_paren_balance(a:line, "(", ")") != 0 - return a:line - endif - let i = 0 - let j = 0 - let line1 = "" - let llen = strlen(a:line) - while i < llen - let line1 = line1 . a:line[i] - if a:line[i] == '(' - let nop = 1 - while nop > 0 && i < llen - let i += 1 - if a:line[i] == ')' - let nop -= 1 - else - if a:line[i] == '(' - let nop += 1 - endif - endif - endwhile - let line1 = line1 . a:line[i] - endif - let i += 1 - endwhile - return line1 -endfunction - -function! s:Get_paren_balance(line, o, c) - let line2 = substitute(a:line, a:o, "", "g") - let openp = strlen(a:line) - strlen(line2) - let line3 = substitute(line2, a:c, "", "g") - let closep = strlen(line2) - strlen(line3) - return openp - closep -endfunction - -function! s:Get_matching_brace(linenr, o, c, delbrace) - let line = SanitizeRLine(getline(a:linenr)) - if a:delbrace == 1 - let line = substitute(line, '{$', "", "") - endif - let pb = s:Get_paren_balance(line, a:o, a:c) - let i = a:linenr - while pb != 0 && i > 1 - let i -= 1 - let pb += s:Get_paren_balance(SanitizeRLine(getline(i)), a:o, a:c) - endwhile - return i -endfunction - -" This function is buggy because there 'if's without 'else' -" It must be rewritten relying more on indentation -function! s:Get_matching_if(linenr, delif) - let line = SanitizeRLine(getline(a:linenr)) - if a:delif - let line = substitute(line, "if", "", "g") - endif - let elsenr = 0 - let i = a:linenr - let ifhere = 0 - while i > 0 - let line2 = substitute(line, '\<else\>', "xxx", "g") - let elsenr += strlen(line) - strlen(line2) - if line =~ '.*\s*if\s*()' || line =~ '.*\s*if\s*()' - let elsenr -= 1 - if elsenr == 0 - let ifhere = i - break - endif - endif - let i -= 1 - let line = SanitizeRLine(getline(i)) - endwhile - if ifhere - return ifhere - else - return a:linenr - endif -endfunction - -function! s:Get_last_paren_idx(line, o, c, pb) - let blc = a:pb - let line = substitute(a:line, '\t', s:curtabstop, "g") - let theidx = -1 - let llen = strlen(line) - let idx = 0 - while idx < llen - if line[idx] == a:o - let blc -= 1 - if blc == 0 - let theidx = idx - endif - else - if line[idx] == a:c - let blc += 1 - endif - endif - let idx += 1 - endwhile - return theidx + 1 -endfunction - -" Get previous relevant line. Search back until getting a line that isn't -" comment or blank -function s:Get_prev_line(lineno) - let lnum = a:lineno - 1 - let data = getline( lnum ) - while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$') - let lnum = lnum - 1 - let data = getline( lnum ) - endwhile - return lnum -endfunction - -" This function is also used by r-plugin/common_global.vim -" Delete from '#' to the end of the line, unless the '#' is inside a string. -function SanitizeRLine(line) - let newline = s:RDelete_quotes(a:line) - let newline = s:RDelete_parens(newline) - let newline = substitute(newline, '#.*', "", "") - let newline = substitute(newline, '\s*$', "", "") - if &filetype == "rhelp" && newline =~ '^\\method{.*}{.*}(.*' - let newline = substitute(newline, '^\\method{\(.*\)}{.*}', '\1', "") - endif - return newline -endfunction - -function GetRIndent() - - let clnum = line(".") " current line - - let cline = getline(clnum) - if cline =~ '^\s*#' - if g:r_indent_ess_comments == 1 - if cline =~ '^\s*###' - return 0 - endif - if cline !~ '^\s*##' - return g:r_indent_comment_column - endif - endif - endif - - let cline = SanitizeRLine(cline) - - if cline =~ '^\s*}' || cline =~ '^\s*}\s*)$' - let indline = s:Get_matching_brace(clnum, '{', '}', 1) - if indline > 0 && indline != clnum - let iline = SanitizeRLine(getline(indline)) - if s:Get_paren_balance(iline, "(", ")") == 0 || iline =~ '(\s*{$' - return indent(indline) - else - let indline = s:Get_matching_brace(indline, '(', ')', 1) - return indent(indline) - endif - endif - endif - - " Find the first non blank line above the current line - let lnum = s:Get_prev_line(clnum) - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - let line = SanitizeRLine(getline(lnum)) - - if &filetype == "rhelp" - if cline =~ '^\\dontshow{' || cline =~ '^\\dontrun{' || cline =~ '^\\donttest{' || cline =~ '^\\testonly{' - return 0 - endif - if line =~ '^\\examples{' || line =~ '^\\usage{' || line =~ '^\\dontshow{' || line =~ '^\\dontrun{' || line =~ '^\\donttest{' || line =~ '^\\testonly{' - return 0 - endif - endif - - if &filetype == "rnoweb" && line =~ "^<<.*>>=" - return 0 - endif - - if cline =~ '^\s*{' && s:Get_paren_balance(cline, '{', '}') > 0 - if g:r_indent_ess_compatible && line =~ ')$' - let nlnum = lnum - let nline = line - while s:Get_paren_balance(nline, '(', ')') < 0 - let nlnum = s:Get_prev_line(nlnum) - let nline = SanitizeRLine(getline(nlnum)) . nline - endwhile - if nline =~ '^\s*function\s*(' && indent(nlnum) == shiftwidth() - return 0 - endif - endif - if s:Get_paren_balance(line, "(", ")") == 0 - return indent(lnum) - endif - endif - - " line is an incomplete command: - if line =~ '\<\(if\|while\|for\|function\)\s*()$' || line =~ '\<else$' || line =~ '<-$' || line =~ '->$' - return indent(lnum) + shiftwidth() - endif - - " Deal with () and [] - - let pb = s:Get_paren_balance(line, '(', ')') - - if line =~ '^\s*{$' || line =~ '(\s*{' || (pb == 0 && (line =~ '{$' || line =~ '(\s*{$')) - return indent(lnum) + shiftwidth() - endif - - let s:curtabstop = repeat(' ', &tabstop) - - if g:r_indent_align_args == 1 - if pb > 0 && line =~ '{$' - return s:Get_last_paren_idx(line, '(', ')', pb) + shiftwidth() - endif - - let bb = s:Get_paren_balance(line, '[', ']') - - if pb > 0 - if &filetype == "rhelp" - let ind = s:Get_last_paren_idx(line, '(', ')', pb) - else - let ind = s:Get_last_paren_idx(getline(lnum), '(', ')', pb) - endif - return ind - endif - - if pb < 0 && line =~ '.*[,&|\-\*+<>]$' - let lnum = s:Get_prev_line(lnum) - while pb < 1 && lnum > 0 - let line = SanitizeRLine(getline(lnum)) - let line = substitute(line, '\t', s:curtabstop, "g") - let ind = strlen(line) - while ind > 0 - if line[ind] == ')' - let pb -= 1 - else - if line[ind] == '(' - let pb += 1 - endif - endif - if pb == 1 - return ind + 1 - endif - let ind -= 1 - endwhile - let lnum -= 1 - endwhile - return 0 - endif - - if bb > 0 - let ind = s:Get_last_paren_idx(getline(lnum), '[', ']', bb) - return ind - endif - endif - - let post_block = 0 - if line =~ '}$' && s:Get_paren_balance(line, '{', '}') < 0 - let lnum = s:Get_matching_brace(lnum, '{', '}', 0) - let line = SanitizeRLine(getline(lnum)) - if lnum > 0 && line =~ '^\s*{' - let lnum = s:Get_prev_line(lnum) - let line = SanitizeRLine(getline(lnum)) - endif - let pb = s:Get_paren_balance(line, '(', ')') - let post_block = 1 - endif - - " Indent after operator pattern - let olnum = s:Get_prev_line(lnum) - let oline = getline(olnum) - if olnum > 0 - if line =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0 - if oline =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0 - return indent(lnum) - else - return indent(lnum) + shiftwidth() - endif - else - if oline =~ g:r_indent_op_pattern && s:Get_paren_balance(line, "(", ")") == 0 - return indent(lnum) - shiftwidth() - endif - endif - endif - - let post_fun = 0 - if pb < 0 && line !~ ')\s*[,&|\-\*+<>]$' - let post_fun = 1 - while pb < 0 && lnum > 0 - let lnum -= 1 - let linepiece = SanitizeRLine(getline(lnum)) - let pb += s:Get_paren_balance(linepiece, "(", ")") - let line = linepiece . line - endwhile - if line =~ '{$' && post_block == 0 - return indent(lnum) + shiftwidth() - endif - - " Now we can do some tests again - if cline =~ '^\s*{' - return indent(lnum) - endif - if post_block == 0 - let newl = SanitizeRLine(line) - if newl =~ '\<\(if\|while\|for\|function\)\s*()$' || newl =~ '\<else$' || newl =~ '<-$' - return indent(lnum) + shiftwidth() - endif - endif - endif - - if cline =~ '^\s*else' - if line =~ '<-\s*if\s*()' - return indent(lnum) + shiftwidth() - else - if line =~ '\<if\s*()' - return indent(lnum) - else - return indent(lnum) - shiftwidth() - endif - endif - endif - - let bb = s:Get_paren_balance(line, '[', ']') - if bb < 0 && line =~ '.*]' - while bb < 0 && lnum > 0 - let lnum -= 1 - let linepiece = SanitizeRLine(getline(lnum)) - let bb += s:Get_paren_balance(linepiece, "[", "]") - let line = linepiece . line - endwhile - let line = s:RDelete_parens(line) - endif - - let plnum = s:Get_prev_line(lnum) - let ppost_else = 0 - if plnum > 0 - let pline = SanitizeRLine(getline(plnum)) - let ppost_block = 0 - if pline =~ '}$' - let ppost_block = 1 - let plnum = s:Get_matching_brace(plnum, '{', '}', 0) - let pline = SanitizeRLine(getline(plnum)) - if pline =~ '^\s*{$' && plnum > 0 - let plnum = s:Get_prev_line(plnum) - let pline = SanitizeRLine(getline(plnum)) - endif - endif - - if pline =~ 'else$' - let ppost_else = 1 - let plnum = s:Get_matching_if(plnum, 0) - let pline = SanitizeRLine(getline(plnum)) - endif - - if pline =~ '^\s*else\s*if\s*(' - let pplnum = s:Get_prev_line(plnum) - let ppline = SanitizeRLine(getline(pplnum)) - while ppline =~ '^\s*else\s*if\s*(' || ppline =~ '^\s*if\s*()\s*\S$' - let plnum = pplnum - let pline = ppline - let pplnum = s:Get_prev_line(plnum) - let ppline = SanitizeRLine(getline(pplnum)) - endwhile - while ppline =~ '\<\(if\|while\|for\|function\)\s*()$' || ppline =~ '\<else$' || ppline =~ '<-$' - let plnum = pplnum - let pline = ppline - let pplnum = s:Get_prev_line(plnum) - let ppline = SanitizeRLine(getline(pplnum)) - endwhile - endif - - let ppb = s:Get_paren_balance(pline, '(', ')') - if ppb < 0 && (pline =~ ')\s*{$' || pline =~ ')$') - while ppb < 0 && plnum > 0 - let plnum -= 1 - let linepiece = SanitizeRLine(getline(plnum)) - let ppb += s:Get_paren_balance(linepiece, "(", ")") - let pline = linepiece . pline - endwhile - let pline = s:RDelete_parens(pline) - endif - endif - - let ind = indent(lnum) - - if g:r_indent_align_args == 0 && pb != 0 - let ind += pb * shiftwidth() - return ind - endif - - if g:r_indent_align_args == 0 && bb != 0 - let ind += bb * shiftwidth() - return ind - endif - - if plnum > 0 - let pind = indent(plnum) - else - let pind = 0 - endif - - if ind == pind || (ind == (pind + shiftwidth()) && pline =~ '{$' && ppost_else == 0) - return ind - endif - - let pline = getline(plnum) - let pbb = s:Get_paren_balance(pline, '[', ']') - - while pind < ind && plnum > 0 && ppb == 0 && pbb == 0 - let ind = pind - let plnum = s:Get_prev_line(plnum) - let pline = getline(plnum) - let ppb = s:Get_paren_balance(pline, '(', ')') - let pbb = s:Get_paren_balance(pline, '[', ']') - while pline =~ '^\s*else' - let plnum = s:Get_matching_if(plnum, 1) - let pline = getline(plnum) - let ppb = s:Get_paren_balance(pline, '(', ')') - let pbb = s:Get_paren_balance(pline, '[', ']') - endwhile - let pind = indent(plnum) - if ind == (pind + shiftwidth()) && pline =~ '{$' - return ind - endif - endwhile - - return ind - -endfunction - -" vim: sw=2 - -endif diff --git a/indent/readline.vim b/indent/readline.vim deleted file mode 100644 index eca4d736..00000000 --- a/indent/readline.vim +++ /dev/null @@ -1,40 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: readline configuration file -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetReadlineIndent() -setlocal indentkeys=!^F,o,O,=$else,=$endif -setlocal nosmartindent - -if exists("*GetReadlineIndent") - finish -endif - -function GetReadlineIndent() - let lnum = prevnonblank(v:lnum - 1) - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - - if getline(lnum) =~ '^\s*$\(if\|else\)\>' - let ind = ind + shiftwidth() - endif - - if getline(v:lnum) =~ '^\s*$\(else\|endif\)\>' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -endif diff --git a/indent/rhelp.vim b/indent/rhelp.vim deleted file mode 100644 index a676a3a0..00000000 --- a/indent/rhelp.vim +++ /dev/null @@ -1,112 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: R Documentation (Help), *.Rd -" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> -" Homepage: https://github.com/jalvesaq/R-Vim-runtime -" Last Change: Tue Apr 07, 2015 04:38PM - - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -runtime indent/r.vim -let s:RIndent = function(substitute(&indentexpr, "()", "", "")) -let b:did_indent = 1 - -setlocal noautoindent -setlocal nocindent -setlocal nosmartindent -setlocal nolisp -setlocal indentkeys=0{,0},:,!^F,o,O,e -setlocal indentexpr=GetCorrectRHelpIndent() - -" Only define the functions once. -if exists("*GetRHelpIndent") - finish -endif - -function s:SanitizeRHelpLine(line) - let newline = substitute(a:line, '\\\\', "x", "g") - let newline = substitute(newline, '\\{', "x", "g") - let newline = substitute(newline, '\\}', "x", "g") - let newline = substitute(newline, '\\%', "x", "g") - let newline = substitute(newline, '%.*', "", "") - let newline = substitute(newline, '\s*$', "", "") - return newline -endfunction - -function GetRHelpIndent() - - let clnum = line(".") " current line - if clnum == 1 - return 0 - endif - let cline = getline(clnum) - - if cline =~ '^\s*}\s*$' - let i = clnum - let bb = -1 - while bb != 0 && i > 1 - let i -= 1 - let line = s:SanitizeRHelpLine(getline(i)) - let line2 = substitute(line, "{", "", "g") - let openb = strlen(line) - strlen(line2) - let line3 = substitute(line2, "}", "", "g") - let closeb = strlen(line2) - strlen(line3) - let bb += openb - closeb - endwhile - return indent(i) - endif - - if cline =~ '^\s*#ifdef\>' || cline =~ '^\s*#endif\>' - return 0 - endif - - let lnum = clnum - 1 - let line = getline(lnum) - if line =~ '^\s*#ifdef\>' || line =~ '^\s*#endif\>' - let lnum -= 1 - let line = getline(lnum) - endif - while lnum > 1 && (line =~ '^\s*$' || line =~ '^#ifdef' || line =~ '^#endif') - let lnum -= 1 - let line = getline(lnum) - endwhile - if lnum == 1 - return 0 - endif - let line = s:SanitizeRHelpLine(line) - let line2 = substitute(line, "{", "", "g") - let openb = strlen(line) - strlen(line2) - let line3 = substitute(line2, "}", "", "g") - let closeb = strlen(line2) - strlen(line3) - let bb = openb - closeb - - let ind = indent(lnum) + (bb * shiftwidth()) - - if line =~ '^\s*}\s*$' - let ind = indent(lnum) - endif - - if ind < 0 - return 0 - endif - - return ind -endfunction - -function GetCorrectRHelpIndent() - let lastsection = search('^\\[a-z]*{', "bncW") - let secname = getline(lastsection) - if secname =~ '^\\usage{' || secname =~ '^\\examples{' || secname =~ '^\\dontshow{' || secname =~ '^\\dontrun{' || secname =~ '^\\donttest{' || secname =~ '^\\testonly{' || secname =~ '^\\method{.*}{.*}(' - return s:RIndent() - else - return GetRHelpIndent() - endif -endfunction - -" vim: sw=2 - -endif diff --git a/indent/rmd.vim b/indent/rmd.vim deleted file mode 100644 index c9acd656..00000000 --- a/indent/rmd.vim +++ /dev/null @@ -1,51 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Rmd -" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> -" Homepage: https://github.com/jalvesaq/R-Vim-runtime -" Last Change: Tue Apr 07, 2015 04:38PM - - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -runtime indent/r.vim -let s:RIndent = function(substitute(&indentexpr, "()", "", "")) -let b:did_indent = 1 - -setlocal indentkeys=0{,0},:,!^F,o,O,e -setlocal indentexpr=GetRmdIndent() - -if exists("*GetRmdIndent") - finish -endif - -function GetMdIndent() - let pline = getline(v:lnum - 1) - let cline = getline(v:lnum) - if prevnonblank(v:lnum - 1) < v:lnum - 1 || cline =~ '^\s*[-\+\*]\s' || cline =~ '^\s*\d\+\.\s\+' - return indent(v:lnum) - elseif pline =~ '^\s*[-\+\*]\s' - return indent(v:lnum - 1) + 2 - elseif pline =~ '^\s*\d\+\.\s\+' - return indent(v:lnum - 1) + 3 - endif - return indent(prevnonblank(v:lnum - 1)) -endfunction - -function GetRmdIndent() - if getline(".") =~ '^[ \t]*```{r .*}$' || getline(".") =~ '^[ \t]*```$' - return 0 - endif - if search('^[ \t]*```{r', "bncW") > search('^[ \t]*```$', "bncW") - return s:RIndent() - else - return GetMdIndent() - endif -endfunction - -" vim: sw=2 - -endif diff --git a/indent/rnoweb.vim b/indent/rnoweb.vim deleted file mode 100644 index 7499970f..00000000 --- a/indent/rnoweb.vim +++ /dev/null @@ -1,51 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Rnoweb -" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> -" Homepage: https://github.com/jalvesaq/R-Vim-runtime -" Last Change: Fri Apr 15, 2016 10:58PM - - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -runtime indent/tex.vim - -function! s:NoTeXIndent() - return indent(line(".")) -endfunction - -if &indentexpr == "" || &indentexpr == "GetRnowebIndent()" - let s:TeXIndent = function("s:NoTeXIndent") -else - let s:TeXIndent = function(substitute(&indentexpr, "()", "", "")) -endif - -unlet b:did_indent -runtime indent/r.vim -let s:RIndent = function(substitute(&indentexpr, "()", "", "")) -let b:did_indent = 1 - -setlocal indentkeys=0{,0},!^F,o,O,e,},=\bibitem,=\item -setlocal indentexpr=GetRnowebIndent() - -if exists("*GetRnowebIndent") - finish -endif - -function GetRnowebIndent() - let curline = getline(".") - if curline =~ '^<<.*>>=$' || curline =~ '^\s*@$' - return 0 - endif - if search("^<<", "bncW") > search("^@", "bncW") - return s:RIndent() - endif - return s:TeXIndent() -endfunction - -" vim: sw=2 - -endif diff --git a/indent/rpl.vim b/indent/rpl.vim deleted file mode 100644 index a963363f..00000000 --- a/indent/rpl.vim +++ /dev/null @@ -1,67 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: RPL/2 -" Version: 0.2 -" Last Change: 2017 Jun 13 -" Maintainer: BERTRAND Joël <rpl2@free.fr> - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent -setlocal indentkeys+==~end,=~case,=~if,=~then,=~else,=~do,=~until,=~while,=~repeat,=~select,=~default,=~for,=~start,=~next,=~step,<<>,<>> - -" Define the appropriate indent function but only once -setlocal indentexpr=RplGetFreeIndent() -if exists("*RplGetFreeIndent") - finish -endif - -let b:undo_indent = "set ai< indentkeys< indentexpr<" - -function RplGetIndent(lnum) - let ind = indent(a:lnum) - let prevline=getline(a:lnum) - " Strip tail comment - let prevstat=substitute(prevline, '!.*$', '', '') - - " Add a shiftwidth to statements following if, iferr, then, else, elseif, - " case, select, default, do, until, while, repeat, for, start - if prevstat =~? '\<\(if\|iferr\|do\|while\)\>' && prevstat =~? '\<end\>' - elseif prevstat =~? '\(^\|\s\+\)<<\($\|\s\+\)' && prevstat =~? '\s\+>>\($\|\s\+\)' - elseif prevstat =~? '\<\(if\|iferr\|then\|else\|elseif\|select\|case\|do\|until\|while\|repeat\|for\|start\|default\)\>' || prevstat =~? '\(^\|\s\+\)<<\($\|\s\+\)' - let ind = ind + shiftwidth() - endif - - " Subtract a shiftwidth from then, else, elseif, end, until, repeat, next, - " step - let line = getline(v:lnum) - if line =~? '^\s*\(then\|else\|elseif\|until\|repeat\|next\|step\|default\|end\)\>' - let ind = ind - shiftwidth() - elseif line =~? '^\s*>>\($\|\s\+\)' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -function RplGetFreeIndent() - " Find the previous non-blank line - let lnum = prevnonblank(v:lnum - 1) - - " Use zero indent at the top of the file - if lnum == 0 - return 0 - endif - - let ind=RplGetIndent(lnum) - return ind -endfunction - -" vim:sw=2 tw=130 - -endif diff --git a/indent/rrst.vim b/indent/rrst.vim deleted file mode 100644 index 2266e8b1..00000000 --- a/indent/rrst.vim +++ /dev/null @@ -1,51 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Rrst -" Author: Jakson Alves de Aquino <jalvesaq@gmail.com> -" Homepage: https://github.com/jalvesaq/R-Vim-runtime -" Last Change: Tue Apr 07, 2015 04:38PM - - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -runtime indent/r.vim -let s:RIndent = function(substitute(&indentexpr, "()", "", "")) -let b:did_indent = 1 - -setlocal indentkeys=0{,0},:,!^F,o,O,e -setlocal indentexpr=GetRrstIndent() - -if exists("*GetRrstIndent") - finish -endif - -function GetRstIndent() - let pline = getline(v:lnum - 1) - let cline = getline(v:lnum) - if prevnonblank(v:lnum - 1) < v:lnum - 1 || cline =~ '^\s*[-\+\*]\s' || cline =~ '^\s*\d\+\.\s\+' - return indent(v:lnum) - elseif pline =~ '^\s*[-\+\*]\s' - return indent(v:lnum - 1) + 2 - elseif pline =~ '^\s*\d\+\.\s\+' - return indent(v:lnum - 1) + 3 - endif - return indent(prevnonblank(v:lnum - 1)) -endfunction - -function GetRrstIndent() - if getline(".") =~ '^\.\. {r .*}$' || getline(".") =~ '^\.\. \.\.$' - return 0 - endif - if search('^\.\. {r', "bncW") > search('^\.\. \.\.$', "bncW") - return s:RIndent() - else - return GetRstIndent() - endif -endfunction - -" vim: sw=2 - -endif diff --git a/indent/rst.vim b/indent/rst.vim deleted file mode 100644 index 20a67731..00000000 --- a/indent/rst.vim +++ /dev/null @@ -1,63 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: reStructuredText Documentation Format -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2011-08-03 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetRSTIndent() -setlocal indentkeys=!^F,o,O -setlocal nosmartindent - -if exists("*GetRSTIndent") - finish -endif - -let s:itemization_pattern = '^\s*[-*+]\s' -let s:enumeration_pattern = '^\s*\%(\d\+\|#\)\.\s\+' - -function GetRSTIndent() - let lnum = prevnonblank(v:lnum - 1) - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - let line = getline(lnum) - - if line =~ s:itemization_pattern - let ind += 2 - elseif line =~ s:enumeration_pattern - let ind += matchend(line, s:enumeration_pattern) - endif - - let line = getline(v:lnum - 1) - - " Indent :FIELD: lines. Don’t match if there is no text after the field or - " if the text ends with a sent-ender. - if line =~ '^:.\+:\s\{-1,\}\S.\+[^.!?:]$' - return matchend(line, '^:.\{-1,}:\s\+') - endif - - if line =~ '^\s*$' - execute lnum - call search('^\s*\%([-*+]\s\|\%(\d\+\|#\)\.\s\|\.\.\|$\)', 'bW') - let line = getline('.') - if line =~ s:itemization_pattern - let ind -= 2 - elseif line =~ s:enumeration_pattern - let ind -= matchend(line, s:enumeration_pattern) - elseif line =~ '^\s*\.\.' - let ind -= 3 - endif - endif - - return ind -endfunction - -endif diff --git a/indent/ruby.vim b/indent/ruby.vim index a4b9e043..3617a925 100644 --- a/indent/ruby.vim +++ b/indent/ruby.vim @@ -1,702 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Ruby -" Maintainer: Nikolai Weibull <now at bitwi.se> -" URL: https://github.com/vim-ruby/vim-ruby -" Release Coordinator: Doug Kearns <dougkearns@gmail.com> - -" 0. Initialization {{{1 -" ================= - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -if !exists('g:ruby_indent_access_modifier_style') - " Possible values: "normal", "indent", "outdent" - let g:ruby_indent_access_modifier_style = 'normal' -endif - -if !exists('g:ruby_indent_block_style') - " Possible values: "expression", "do" - let g:ruby_indent_block_style = 'expression' -endif - -setlocal nosmartindent - -" Now, set up our indentation expression and keys that trigger it. -setlocal indentexpr=GetRubyIndent(v:lnum) -setlocal indentkeys=0{,0},0),0],!^F,o,O,e,:,. -setlocal indentkeys+==end,=else,=elsif,=when,=ensure,=rescue,==begin,==end -setlocal indentkeys+==private,=protected,=public - -" Only define the function once. -if exists("*GetRubyIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" 1. Variables {{{1 -" ============ - -" Regex of syntax group names that are or delimit strings/symbols or are comments. -let s:syng_strcom = '\<ruby\%(Regexp\|RegexpDelimiter\|RegexpEscape' . - \ '\|Symbol\|String\|StringDelimiter\|StringEscape\|ASCIICode' . - \ '\|Interpolation\|InterpolationDelimiter\|NoInterpolation\|Comment\|Documentation\)\>' - -" Regex of syntax group names that are strings. -let s:syng_string = - \ '\<ruby\%(String\|Interpolation\|NoInterpolation\|StringEscape\)\>' - -" Regex of syntax group names that are strings or documentation. -let s:syng_stringdoc = - \'\<ruby\%(String\|Interpolation\|NoInterpolation\|StringEscape\|Documentation\)\>' - -" Expression used to check whether we should skip a match with searchpair(). -let s:skip_expr = - \ "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'" - -" Regex used for words that, at the start of a line, add a level of indent. -let s:ruby_indent_keywords = - \ '^\s*\zs\<\%(module\|class\|if\|for' . - \ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue' . - \ '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' . - \ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' . - \ '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>' - -" Regex used for words that, at the start of a line, remove a level of indent. -let s:ruby_deindent_keywords = - \ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|end\):\@!\>' - -" Regex that defines the start-match for the 'end' keyword. -"let s:end_start_regex = '\%(^\|[^.]\)\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\|do\)\>' -" TODO: the do here should be restricted somewhat (only at end of line)? -let s:end_start_regex = - \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' . - \ '\<\%(module\|class\|if\|for\|while\|until\|case\|unless\|begin' . - \ '\|\%(public\|protected\|private\)\=\s*def\):\@!\>' . - \ '\|\%(^\|[^.:@$]\)\@<=\<do:\@!\>' - -" Regex that defines the middle-match for the 'end' keyword. -let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue:\@!\>\|when\|elsif\):\@!\>' - -" Regex that defines the end-match for the 'end' keyword. -let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end:\@!\>' - -" Expression used for searchpair() call for finding match for 'end' keyword. -let s:end_skip_expr = s:skip_expr . - \ ' || (expand("<cword>") == "do"' . - \ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\):\\@!\\>")' - -" Regex that defines continuation lines, not including (, {, or [. -let s:non_bracket_continuation_regex = - \ '\%([\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.*\)\=$' - -" Regex that defines continuation lines. -let s:continuation_regex = - \ '\%(%\@<![({[\\.,:*/%+]\|\<and\|\<or\|\%(<%\)\@<![=-]\|:\@<![^[:alnum:]:][|&?]\|||\|&&\)\s*\%(#.*\)\=$' - -" Regex that defines continuable keywords -let s:continuable_regex = - \ '\C\%(^\s*\|[=,*/%+\-|;{]\|<<\|>>\|:\s\)\s*\zs' . - \ '\<\%(if\|for\|while\|until\|unless\):\@!\>' - -" Regex that defines bracket continuations -let s:bracket_continuation_regex = '%\@<!\%([({[]\)\s*\%(#.*\)\=$' - -" Regex that defines dot continuations -let s:dot_continuation_regex = '%\@<!\.\s*\%(#.*\)\=$' - -" Regex that defines backslash continuations -let s:backslash_continuation_regex = '%\@<!\\\s*$' - -" Regex that defines end of bracket continuation followed by another continuation -let s:bracket_switch_continuation_regex = '^\([^(]\+\zs).\+\)\+'.s:continuation_regex - -" Regex that defines the first part of a splat pattern -let s:splat_regex = '[[,(]\s*\*\s*\%(#.*\)\=$' - -" Regex that describes all indent access modifiers -let s:access_modifier_regex = '\C^\s*\%(public\|protected\|private\)\s*\%(#.*\)\=$' - -" Regex that describes the indent access modifiers (excludes public) -let s:indent_access_modifier_regex = '\C^\s*\%(protected\|private\)\s*\%(#.*\)\=$' - -" Regex that defines blocks. -" -" Note that there's a slight problem with this regex and s:continuation_regex. -" Code like this will be matched by both: -" -" method_call do |(a, b)| -" -" The reason is that the pipe matches a hanging "|" operator. -" -let s:block_regex = - \ '\%(\<do:\@!\>\|%\@<!{\)\s*\%(|[^|]*|\)\=\s*\%(#.*\)\=$' - -let s:block_continuation_regex = '^\s*[^])}\t ].*'.s:block_regex - -" Regex that describes a leading operator (only a method call's dot for now) -let s:leading_operator_regex = '^\s*[.]' - -" 2. Auxiliary Functions {{{1 -" ====================== - -" Check if the character at lnum:col is inside a string, comment, or is ascii. -function s:IsInStringOrComment(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom -endfunction - -" Check if the character at lnum:col is inside a string. -function s:IsInString(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string -endfunction - -" Check if the character at lnum:col is inside a string or documentation. -function s:IsInStringOrDocumentation(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_stringdoc -endfunction - -" Check if the character at lnum:col is inside a string delimiter -function s:IsInStringDelimiter(lnum, col) - return synIDattr(synID(a:lnum, a:col, 1), 'name') == 'rubyStringDelimiter' -endfunction - -" Find line above 'lnum' that isn't empty, in a comment, or in a string. -function s:PrevNonBlankNonString(lnum) - let in_block = 0 - let lnum = prevnonblank(a:lnum) - while lnum > 0 - " Go in and out of blocks comments as necessary. - " If the line isn't empty (with opt. comment) or in a string, end search. - let line = getline(lnum) - if line =~ '^=begin' - if in_block - let in_block = 0 - else - break - endif - elseif !in_block && line =~ '^=end' - let in_block = 1 - elseif !in_block && line !~ '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1) - \ && s:IsInStringOrComment(lnum, strlen(line))) - break - endif - let lnum = prevnonblank(lnum - 1) - endwhile - return lnum -endfunction - -" Find line above 'lnum' that started the continuation 'lnum' may be part of. -function s:GetMSL(lnum) - " Start on the line we're at and use its indent. - let msl = a:lnum - let msl_body = getline(msl) - let lnum = s:PrevNonBlankNonString(a:lnum - 1) - while lnum > 0 - " If we have a continuation line, or we're in a string, use line as MSL. - " Otherwise, terminate search as we have found our MSL already. - let line = getline(lnum) - - if !s:Match(msl, s:backslash_continuation_regex) && - \ s:Match(lnum, s:backslash_continuation_regex) - " If the current line doesn't end in a backslash, but the previous one - " does, look for that line's msl - " - " Example: - " foo = "bar" \ - " "baz" - " - let msl = lnum - elseif s:Match(msl, s:leading_operator_regex) - " If the current line starts with a leading operator, keep its indent - " and keep looking for an MSL. - let msl = lnum - elseif s:Match(lnum, s:splat_regex) - " If the above line looks like the "*" of a splat, use the current one's - " indentation. - " - " Example: - " Hash[* - " method_call do - " something - " - return msl - elseif s:Match(lnum, s:non_bracket_continuation_regex) && - \ s:Match(msl, s:non_bracket_continuation_regex) - " If the current line is a non-bracket continuation and so is the - " previous one, keep its indent and continue looking for an MSL. - " - " Example: - " method_call one, - " two, - " three - " - let msl = lnum - elseif s:Match(lnum, s:dot_continuation_regex) && - \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) - " If the current line is a bracket continuation or a block-starter, but - " the previous is a dot, keep going to see if the previous line is the - " start of another continuation. - " - " Example: - " parent. - " method_call { - " three - " - let msl = lnum - elseif s:Match(lnum, s:non_bracket_continuation_regex) && - \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) - " If the current line is a bracket continuation or a block-starter, but - " the previous is a non-bracket one, respect the previous' indentation, - " and stop here. - " - " Example: - " method_call one, - " two { - " three - " - return lnum - elseif s:Match(lnum, s:bracket_continuation_regex) && - \ (s:Match(msl, s:bracket_continuation_regex) || s:Match(msl, s:block_continuation_regex)) - " If both lines are bracket continuations (the current may also be a - " block-starter), use the current one's and stop here - " - " Example: - " method_call( - " other_method_call( - " foo - return msl - elseif s:Match(lnum, s:block_regex) && - \ !s:Match(msl, s:continuation_regex) && - \ !s:Match(msl, s:block_continuation_regex) - " If the previous line is a block-starter and the current one is - " mostly ordinary, use the current one as the MSL. - " - " Example: - " method_call do - " something - " something_else - return msl - else - let col = match(line, s:continuation_regex) + 1 - if (col > 0 && !s:IsInStringOrComment(lnum, col)) - \ || s:IsInString(lnum, strlen(line)) - let msl = lnum - else - break - endif - endif - - let msl_body = getline(msl) - let lnum = s:PrevNonBlankNonString(lnum - 1) - endwhile - return msl -endfunction - -" Check if line 'lnum' has more opening brackets than closing ones. -function s:ExtraBrackets(lnum) - let opening = {'parentheses': [], 'braces': [], 'brackets': []} - let closing = {'parentheses': [], 'braces': [], 'brackets': []} - - let line = getline(a:lnum) - let pos = match(line, '[][(){}]', 0) - - " Save any encountered opening brackets, and remove them once a matching - " closing one has been found. If a closing bracket shows up that doesn't - " close anything, save it for later. - while pos != -1 - if !s:IsInStringOrComment(a:lnum, pos + 1) - if line[pos] == '(' - call add(opening.parentheses, {'type': '(', 'pos': pos}) - elseif line[pos] == ')' - if empty(opening.parentheses) - call add(closing.parentheses, {'type': ')', 'pos': pos}) - else - let opening.parentheses = opening.parentheses[0:-2] - endif - elseif line[pos] == '{' - call add(opening.braces, {'type': '{', 'pos': pos}) - elseif line[pos] == '}' - if empty(opening.braces) - call add(closing.braces, {'type': '}', 'pos': pos}) - else - let opening.braces = opening.braces[0:-2] - endif - elseif line[pos] == '[' - call add(opening.brackets, {'type': '[', 'pos': pos}) - elseif line[pos] == ']' - if empty(opening.brackets) - call add(closing.brackets, {'type': ']', 'pos': pos}) - else - let opening.brackets = opening.brackets[0:-2] - endif - endif - endif - - let pos = match(line, '[][(){}]', pos + 1) - endwhile - - " Find the rightmost brackets, since they're the ones that are important in - " both opening and closing cases - let rightmost_opening = {'type': '(', 'pos': -1} - let rightmost_closing = {'type': ')', 'pos': -1} - - for opening in opening.parentheses + opening.braces + opening.brackets - if opening.pos > rightmost_opening.pos - let rightmost_opening = opening - endif - endfor - - for closing in closing.parentheses + closing.braces + closing.brackets - if closing.pos > rightmost_closing.pos - let rightmost_closing = closing - endif - endfor - - return [rightmost_opening, rightmost_closing] -endfunction - -function s:Match(lnum, regex) - let line = getline(a:lnum) - let offset = match(line, '\C'.a:regex) - let col = offset + 1 - - while offset > -1 && s:IsInStringOrComment(a:lnum, col) - let offset = match(line, '\C'.a:regex, offset + 1) - let col = offset + 1 - endwhile - - if offset > -1 - return col - else - return 0 - endif -endfunction - -" Locates the containing class/module's definition line, ignoring nested classes -" along the way. -" -function! s:FindContainingClass() - let saved_position = getpos('.') - - while searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW', - \ s:end_skip_expr) > 0 - if expand('<cword>') =~# '\<class\|module\>' - let found_lnum = line('.') - call setpos('.', saved_position) - return found_lnum - endif - endwhile - - call setpos('.', saved_position) - return 0 -endfunction - -" 3. GetRubyIndent Function {{{1 -" ========================= - -function GetRubyIndent(...) - " 3.1. Setup {{{2 - " ---------- - - " The value of a single shift-width - let sw = shiftwidth() - - " For the current line, use the first argument if given, else v:lnum - let clnum = a:0 ? a:1 : v:lnum - - " Set up variables for restoring position in file. Could use clnum here. - let vcol = col('.') - - " 3.2. Work on the current line {{{2 - " ----------------------------- - - " Get the current line. - let line = getline(clnum) - let ind = -1 - - " If this line is an access modifier keyword, align according to the closest - " class declaration. - if g:ruby_indent_access_modifier_style == 'indent' - if s:Match(clnum, s:access_modifier_regex) - let class_line = s:FindContainingClass() - if class_line > 0 - return indent(class_line) + sw - endif - endif - elseif g:ruby_indent_access_modifier_style == 'outdent' - if s:Match(clnum, s:access_modifier_regex) - let class_line = s:FindContainingClass() - if class_line > 0 - return indent(class_line) - endif - endif - endif - - " If we got a closing bracket on an empty line, find its match and indent - " according to it. For parentheses we indent to its column - 1, for the - " others we indent to the containing line's MSL's level. Return -1 if fail. - let col = matchend(line, '^\s*[]})]') - if col > 0 && !s:IsInStringOrComment(clnum, col) - call cursor(clnum, col) - let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2) - if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0 - if line[col-1]==')' && col('.') != col('$') - 1 - let ind = virtcol('.') - 1 - elseif g:ruby_indent_block_style == 'do' - let ind = indent(line('.')) - else " g:ruby_indent_block_style == 'expression' - let ind = indent(s:GetMSL(line('.'))) - endif - endif - return ind - endif - - " If we have a =begin or =end set indent to first column. - if match(line, '^\s*\%(=begin\|=end\)$') != -1 - return 0 - endif - - " If we have a deindenting keyword, find its match and indent to its level. - " TODO: this is messy - if s:Match(clnum, s:ruby_deindent_keywords) - call cursor(clnum, 1) - if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW', - \ s:end_skip_expr) > 0 - let msl = s:GetMSL(line('.')) - let line = getline(line('.')) - - if strpart(line, 0, col('.') - 1) =~ '=\s*$' && - \ strpart(line, col('.') - 1, 2) !~ 'do' - " assignment to case/begin/etc, on the same line, hanging indent - let ind = virtcol('.') - 1 - elseif g:ruby_indent_block_style == 'do' - " align to line of the "do", not to the MSL - let ind = indent(line('.')) - elseif getline(msl) =~ '=\s*\(#.*\)\=$' - " in the case of assignment to the MSL, align to the starting line, - " not to the MSL - let ind = indent(line('.')) - else - " align to the MSL - let ind = indent(msl) - endif - endif - return ind - endif - - " If we are in a multi-line string or line-comment, don't do anything to it. - if s:IsInStringOrDocumentation(clnum, matchend(line, '^\s*') + 1) - return indent('.') - endif - - " If we are at the closing delimiter of a "<<" heredoc-style string, set the - " indent to 0. - if line =~ '^\k\+\s*$' - \ && s:IsInStringDelimiter(clnum, 1) - \ && search('\V<<'.line, 'nbW') > 0 - return 0 - endif - - " If the current line starts with a leading operator, add a level of indent. - if s:Match(clnum, s:leading_operator_regex) - return indent(s:GetMSL(clnum)) + sw - endif - - " 3.3. Work on the previous line. {{{2 - " ------------------------------- - - " Find a non-blank, non-multi-line string line above the current line. - let lnum = s:PrevNonBlankNonString(clnum - 1) - - " If the line is empty and inside a string, use the previous line. - if line =~ '^\s*$' && lnum != prevnonblank(clnum - 1) - return indent(prevnonblank(clnum)) - endif - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - " Set up variables for the previous line. - let line = getline(lnum) - let ind = indent(lnum) - - if g:ruby_indent_access_modifier_style == 'indent' - " If the previous line was a private/protected keyword, add a - " level of indent. - if s:Match(lnum, s:indent_access_modifier_regex) - return indent(lnum) + sw - endif - elseif g:ruby_indent_access_modifier_style == 'outdent' - " If the previous line was a private/protected/public keyword, add - " a level of indent, since the keyword has been out-dented. - if s:Match(lnum, s:access_modifier_regex) - return indent(lnum) + sw - endif - endif - - if s:Match(lnum, s:continuable_regex) && s:Match(lnum, s:continuation_regex) - return indent(s:GetMSL(lnum)) + sw + sw - endif - - " If the previous line ended with a block opening, add a level of indent. - if s:Match(lnum, s:block_regex) - let msl = s:GetMSL(lnum) - - if g:ruby_indent_block_style == 'do' - " don't align to the msl, align to the "do" - let ind = indent(lnum) + sw - elseif getline(msl) =~ '=\s*\(#.*\)\=$' - " in the case of assignment to the msl, align to the starting line, - " not to the msl - let ind = indent(lnum) + sw - else - let ind = indent(msl) + sw - endif - return ind - endif - - " If the previous line started with a leading operator, use its MSL's level - " of indent - if s:Match(lnum, s:leading_operator_regex) - return indent(s:GetMSL(lnum)) - endif - - " If the previous line ended with the "*" of a splat, add a level of indent - if line =~ s:splat_regex - return indent(lnum) + sw - endif - - " If the previous line contained unclosed opening brackets and we are still - " in them, find the rightmost one and add indent depending on the bracket - " type. - " - " If it contained hanging closing brackets, find the rightmost one, find its - " match and indent according to that. - if line =~ '[[({]' || line =~ '[])}]\s*\%(#.*\)\=$' - let [opening, closing] = s:ExtraBrackets(lnum) - - if opening.pos != -1 - if opening.type == '(' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0 - if col('.') + 1 == col('$') - return ind + sw - else - return virtcol('.') - endif - else - let nonspace = matchend(line, '\S', opening.pos + 1) - 1 - return nonspace > 0 ? nonspace : ind + sw - endif - elseif closing.pos != -1 - call cursor(lnum, closing.pos + 1) - normal! % - - if s:Match(line('.'), s:ruby_indent_keywords) - return indent('.') + sw - else - return indent(s:GetMSL(line('.'))) - endif - else - call cursor(clnum, vcol) - end - endif - - " If the previous line ended with an "end", match that "end"s beginning's - " indent. - let col = s:Match(lnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$') - if col > 0 - call cursor(lnum, col) - if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW', - \ s:end_skip_expr) > 0 - let n = line('.') - let ind = indent('.') - let msl = s:GetMSL(n) - if msl != n - let ind = indent(msl) - end - return ind - endif - end - - let col = s:Match(lnum, s:ruby_indent_keywords) - if col > 0 - call cursor(lnum, col) - let ind = virtcol('.') - 1 + sw - " TODO: make this better (we need to count them) (or, if a searchpair - " fails, we know that something is lacking an end and thus we indent a - " level - if s:Match(lnum, s:end_end_regex) - let ind = indent('.') - endif - return ind - endif - - " 3.4. Work on the MSL line. {{{2 - " -------------------------- - - " Set up variables to use and search for MSL to the previous line. - let p_lnum = lnum - let lnum = s:GetMSL(lnum) - - " If the previous line wasn't a MSL. - if p_lnum != lnum - " If previous line ends bracket and begins non-bracket continuation decrease indent by 1. - if s:Match(p_lnum, s:bracket_switch_continuation_regex) - return ind - 1 - " If previous line is a continuation return its indent. - " TODO: the || s:IsInString() thing worries me a bit. - elseif s:Match(p_lnum, s:non_bracket_continuation_regex) || s:IsInString(p_lnum,strlen(line)) - return ind - endif - endif - - " Set up more variables, now that we know we wasn't continuation bound. - let line = getline(lnum) - let msl_ind = indent(lnum) - - " If the MSL line had an indenting keyword in it, add a level of indent. - " TODO: this does not take into account contrived things such as - " module Foo; class Bar; end - if s:Match(lnum, s:ruby_indent_keywords) - let ind = msl_ind + sw - if s:Match(lnum, s:end_end_regex) - let ind = ind - sw - endif - return ind - endif - - " If the previous line ended with [*+/.,-=], but wasn't a block ending or a - " closing bracket, indent one extra level. - if s:Match(lnum, s:non_bracket_continuation_regex) && !s:Match(lnum, '^\s*\([\])}]\|end\)') - if lnum == p_lnum - let ind = msl_ind + sw - else - let ind = msl_ind - endif - return ind - endif - - " }}}2 - - return ind -endfunction - -" }}}1 - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim:set sw=2 sts=2 ts=8 et: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'ruby') == -1 " Vim indent file diff --git a/indent/rust.vim b/indent/rust.vim index 5f5c74b9..042e2ab5 100644 --- a/indent/rust.vim +++ b/indent/rust.vim @@ -1,220 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Rust -" Author: Chris Morgan <me@chrismorgan.info> -" Last Change: 2017 Jun 13 -" For bugs, patches and license go to https://github.com/rust-lang/rust.vim - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal cindent -setlocal cinoptions=L0,(0,Ws,J1,j1 -setlocal cinkeys=0{,0},!^F,o,O,0[,0] -" Don't think cinwords will actually do anything at all... never mind -setlocal cinwords=for,if,else,while,loop,impl,mod,unsafe,trait,struct,enum,fn,extern - -" Some preliminary settings -setlocal nolisp " Make sure lisp indenting doesn't supersede us -setlocal autoindent " indentexpr isn't much help otherwise -" Also do indentkeys, otherwise # gets shoved to column 0 :-/ -setlocal indentkeys=0{,0},!^F,o,O,0[,0] - -setlocal indentexpr=GetRustIndent(v:lnum) - -" Only define the function once. -if exists("*GetRustIndent") - finish -endif - -let s:save_cpo = &cpo -set cpo&vim - -" Come here when loading the script the first time. - -function! s:get_line_trimmed(lnum) - " Get the line and remove a trailing comment. - " Use syntax highlighting attributes when possible. - " NOTE: this is not accurate; /* */ or a line continuation could trick it - let line = getline(a:lnum) - let line_len = strlen(line) - if has('syntax_items') - " If the last character in the line is a comment, do a binary search for - " the start of the comment. synID() is slow, a linear search would take - " too long on a long line. - if synIDattr(synID(a:lnum, line_len, 1), "name") =~ 'Comment\|Todo' - let min = 1 - let max = line_len - while min < max - let col = (min + max) / 2 - if synIDattr(synID(a:lnum, col, 1), "name") =~ 'Comment\|Todo' - let max = col - else - let min = col + 1 - endif - endwhile - let line = strpart(line, 0, min - 1) - endif - return substitute(line, "\s*$", "", "") - else - " Sorry, this is not complete, nor fully correct (e.g. string "//"). - " Such is life. - return substitute(line, "\s*//.*$", "", "") - endif -endfunction - -function! s:is_string_comment(lnum, col) - if has('syntax_items') - for id in synstack(a:lnum, a:col) - let synname = synIDattr(id, "name") - if synname == "rustString" || synname =~ "^rustComment" - return 1 - endif - endfor - else - " without syntax, let's not even try - return 0 - endif -endfunction - -function GetRustIndent(lnum) - - " Starting assumption: cindent (called at the end) will do it right - " normally. We just want to fix up a few cases. - - let line = getline(a:lnum) - - if has('syntax_items') - let synname = synIDattr(synID(a:lnum, 1, 1), "name") - if synname == "rustString" - " If the start of the line is in a string, don't change the indent - return -1 - elseif synname =~ '\(Comment\|Todo\)' - \ && line !~ '^\s*/\*' " not /* opening line - if synname =~ "CommentML" " multi-line - if line !~ '^\s*\*' && getline(a:lnum - 1) =~ '^\s*/\*' - " This is (hopefully) the line after a /*, and it has no - " leader, so the correct indentation is that of the - " previous line. - return GetRustIndent(a:lnum - 1) - endif - endif - " If it's in a comment, let cindent take care of it now. This is - " for cases like "/*" where the next line should start " * ", not - " "* " as the code below would otherwise cause for module scope - " Fun fact: " /*\n*\n*/" takes two calls to get right! - return cindent(a:lnum) - endif - endif - - " cindent gets second and subsequent match patterns/struct members wrong, - " as it treats the comma as indicating an unfinished statement:: - " - " match a { - " b => c, - " d => e, - " f => g, - " }; - - " Search backwards for the previous non-empty line. - let prevlinenum = prevnonblank(a:lnum - 1) - let prevline = s:get_line_trimmed(prevlinenum) - while prevlinenum > 1 && prevline !~ '[^[:blank:]]' - let prevlinenum = prevnonblank(prevlinenum - 1) - let prevline = s:get_line_trimmed(prevlinenum) - endwhile - - " Handle where clauses nicely: subsequent values should line up nicely. - if prevline[len(prevline) - 1] == "," - \ && prevline =~# '^\s*where\s' - return indent(prevlinenum) + 6 - endif - - if prevline[len(prevline) - 1] == "," - \ && s:get_line_trimmed(a:lnum) !~ '^\s*[\[\]{}]' - \ && prevline !~ '^\s*fn\s' - \ && prevline !~ '([^()]\+,$' - \ && s:get_line_trimmed(a:lnum) !~ '^\s*\S\+\s*=>' - " Oh ho! The previous line ended in a comma! I bet cindent will try to - " take this too far... For now, let's normally use the previous line's - " indent. - - " One case where this doesn't work out is where *this* line contains - " square or curly brackets; then we normally *do* want to be indenting - " further. - " - " Another case where we don't want to is one like a function - " definition with arguments spread over multiple lines: - " - " fn foo(baz: Baz, - " baz: Baz) // <-- cindent gets this right by itself - " - " Another case is similar to the previous, except calling a function - " instead of defining it, or any conditional expression that leaves - " an open paren: - " - " foo(baz, - " baz); - " - " if baz && (foo || - " bar) { - " - " Another case is when the current line is a new match arm. - " - " There are probably other cases where we don't want to do this as - " well. Add them as needed. - return indent(prevlinenum) - endif - - if !has("patch-7.4.355") - " cindent before 7.4.355 doesn't do the module scope well at all; e.g.:: - " - " static FOO : &'static [bool] = [ - " true, - " false, - " false, - " true, - " ]; - " - " uh oh, next statement is indented further! - - " Note that this does *not* apply the line continuation pattern properly; - " that's too hard to do correctly for my liking at present, so I'll just - " start with these two main cases (square brackets and not returning to - " column zero) - - call cursor(a:lnum, 1) - if searchpair('{\|(', '', '}\|)', 'nbW', - \ 's:is_string_comment(line("."), col("."))') == 0 - if searchpair('\[', '', '\]', 'nbW', - \ 's:is_string_comment(line("."), col("."))') == 0 - " Global scope, should be zero - return 0 - else - " At the module scope, inside square brackets only - "if getline(a:lnum)[0] == ']' || search('\[', '', '\]', 'nW') == a:lnum - if line =~ "^\\s*]" - " It's the closing line, dedent it - return 0 - else - return shiftwidth() - endif - endif - endif - endif - - " Fall back on cindent, which does it mostly right - return cindent(a:lnum) -endfunction - -let &cpo = s:save_cpo -unlet s:save_cpo - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'rust') == -1 " Vim indent file diff --git a/indent/sas.vim b/indent/sas.vim deleted file mode 100644 index 0f8adfdb..00000000 --- a/indent/sas.vim +++ /dev/null @@ -1,142 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: SAS -" Maintainer: Zhen-Huan Hu <wildkeny@gmail.com> -" Version: 3.0.1 -" Last Change: Mar 13, 2017 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetSASIndent() -setlocal indentkeys+=;,=~data,=~proc,=~macro - -if exists("*GetSASIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" Regex that captures the start of a data/proc section -let s:section_str = '\v%(^|;)\s*%(data|proc)>' -" Regex that captures the end of a run-processing section -let s:section_run = '\v%(^|;)\s*run\s*;' -" Regex that captures the end of a data/proc section -let s:section_end = '\v%(^|;)\s*%(quit|enddata)\s*;' - -" Regex that captures the start of a control block (anything inside a section) -let s:block_str = '\v<%(do>%([^;]+<%(to|over)>[^;]+)=|%(define|layout|method|select)>[^;]+|begingraph)\s*;' -" Regex that captures the end of a control block (anything inside a section) -let s:block_end = '\v<%(end|endlayout|endgraph)\s*;' - -" Regex that captures the start of a macro -let s:macro_str = '\v%(^|;)\s*\%macro>' -" Regex that captures the end of a macro -let s:macro_end = '\v%(^|;)\s*\%mend\s*;' - -" Regex that defines the end of the program -let s:program_end = '\v%(^|;)\s*endsas\s*;' - -" List of procs supporting run-processing -let s:run_processing_procs = [ - \ 'catalog', 'chart', 'datasets', 'document', 'ds2', 'plot', 'sql', - \ 'gareabar', 'gbarline', 'gchart', 'gkpi', 'gmap', 'gplot', 'gradar', 'greplay', 'gslide', 'gtile', - \ 'anova', 'arima', 'catmod', 'factex', 'glm', 'model', 'optex', 'plan', 'reg', - \ 'iml', - \ ] - -" Find the line number of previous keyword defined by the regex -function! s:PrevMatch(lnum, regex) - let prev_lnum = prevnonblank(a:lnum - 1) - while prev_lnum > 0 - let prev_line = getline(prev_lnum) - if prev_line =~ a:regex - break - else - let prev_lnum = prevnonblank(prev_lnum - 1) - endif - endwhile - return prev_lnum -endfunction - -" Main function -function! GetSASIndent() - let prev_lnum = prevnonblank(v:lnum - 1) - if prev_lnum ==# 0 - " Leave the indentation of the first line unchanged - return indent(1) - else - let prev_line = getline(prev_lnum) - " Previous non-blank line contains the start of a macro/section/block - " while not the end of a macro/section/block (at the same line) - if (prev_line =~ s:section_str && prev_line !~ s:section_run && prev_line !~ s:section_end) || - \ (prev_line =~ s:block_str && prev_line !~ s:block_end) || - \ (prev_line =~ s:macro_str && prev_line !~ s:macro_end) - let ind = indent(prev_lnum) + &sts - elseif prev_line =~ s:section_run && prev_line !~ s:section_end - let prev_section_str_lnum = s:PrevMatch(v:lnum, s:section_str) - let prev_section_end_lnum = max([ - \ s:PrevMatch(v:lnum, s:section_end), - \ s:PrevMatch(v:lnum, s:macro_end ), - \ s:PrevMatch(v:lnum, s:program_end)]) - " Check if the section supports run-processing - if prev_section_end_lnum < prev_section_str_lnum && - \ getline(prev_section_str_lnum) =~ '\v%(^|;)\s*proc\s+%(' . - \ join(s:run_processing_procs, '|') . ')>' - let ind = indent(prev_lnum) + &sts - else - let ind = indent(prev_lnum) - endif - else - let ind = indent(prev_lnum) - endif - endif - " Re-adjustments based on the inputs of the current line - let curr_line = getline(v:lnum) - if curr_line =~ s:program_end - " End of the program - " Same indentation as the first non-blank line - return indent(nextnonblank(1)) - elseif curr_line =~ s:macro_end - " Current line is the end of a macro - " Match the indentation of the start of the macro - return indent(s:PrevMatch(v:lnum, s:macro_str)) - elseif curr_line =~ s:block_end && curr_line !~ s:block_str - " Re-adjust if current line is the end of a block - " while not the beginning of a block (at the same line) - " Returning the indent of previous block start directly - " would not work due to nesting - let ind = ind - &sts - elseif curr_line =~ s:section_str || curr_line =~ s:section_run || curr_line =~ s:section_end - " Re-adjust if current line is the start/end of a section - " since the end of a section could be inexplicit - let prev_section_str_lnum = s:PrevMatch(v:lnum, s:section_str) - " Check if the previous section supports run-processing - if getline(prev_section_str_lnum) =~ '\v%(^|;)\s*proc\s+%(' . - \ join(s:run_processing_procs, '|') . ')>' - let prev_section_end_lnum = max([ - \ s:PrevMatch(v:lnum, s:section_end), - \ s:PrevMatch(v:lnum, s:macro_end ), - \ s:PrevMatch(v:lnum, s:program_end)]) - else - let prev_section_end_lnum = max([ - \ s:PrevMatch(v:lnum, s:section_end), - \ s:PrevMatch(v:lnum, s:section_run), - \ s:PrevMatch(v:lnum, s:macro_end ), - \ s:PrevMatch(v:lnum, s:program_end)]) - endif - if prev_section_end_lnum < prev_section_str_lnum - let ind = ind - &sts - endif - endif - return ind -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif diff --git a/indent/sass.vim b/indent/sass.vim deleted file mode 100644 index 89c2f485..00000000 --- a/indent/sass.vim +++ /dev/null @@ -1,42 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Sass -" Maintainer: Tim Pope <vimNOSPAM@tpope.org> -" Last Change: 2017 Jun 13 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent sw=2 et -setlocal indentexpr=GetSassIndent() -setlocal indentkeys=o,O,*<Return>,<:>,!^F - -" Only define the function once. -if exists("*GetSassIndent") - finish -endif - -let s:property = '^\s*:\|^\s*[[:alnum:]#{}-]\+\%(:\|\s*=\)' -let s:extend = '^\s*\%(@extend\|@include\|+\)' - -function! GetSassIndent() - let lnum = prevnonblank(v:lnum-1) - let line = substitute(getline(lnum),'\s\+$','','') - let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','') - let lastcol = strlen(line) - let line = substitute(line,'^\s\+','','') - let indent = indent(lnum) - let cindent = indent(v:lnum) - if line !~ s:property && line !~ s:extend && cline =~ s:property - return indent + shiftwidth() - else - return -1 - endif -endfunction - -" vim:set sw=2: - -endif diff --git a/indent/scala.vim b/indent/scala.vim index 78dcf8ad..da6c2f5c 100644 --- a/indent/scala.vim +++ b/indent/scala.vim @@ -1,616 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Scala (http://scala-lang.org/) -" Original Author: Stefan Matthias Aust -" Modifications By: Derek Wyatt -" URL: https://github.com/derekwyatt/vim-scala -" Last Change: 2016 Aug 26 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent -setlocal indentexpr=GetScalaIndent() -setlocal indentkeys=0{,0},0),!^F,<>>,o,O,e,=case,<CR> - -if exists("*GetScalaIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -let s:defMatcher = '\%(\%(private\|protected\)\%(\[[^\]]*\]\)\?\s\+\|abstract\s\+\|override\s\+\)*\<def\>' -let s:funcNameMatcher = '\w\+' -let s:typeSpecMatcher = '\%(\s*\[\_[^\]]*\]\)' -let s:defArgMatcher = '\%((\_.\{-})\)' -let s:returnTypeMatcher = '\%(:\s*\w\+' . s:typeSpecMatcher . '\?\)' -let g:fullDefMatcher = '^\s*' . s:defMatcher . '\s\+' . s:funcNameMatcher . '\s*' . s:typeSpecMatcher . '\?\s*' . s:defArgMatcher . '\?\s*' . s:returnTypeMatcher . '\?\s*[={]' - -function! scala#ConditionalConfirm(msg) - if 0 - call confirm(a:msg) - endif -endfunction - -function! scala#GetLine(lnum) - let line = substitute(getline(a:lnum), '//.*$', '', '') - let line = substitute(line, '"\(.\|\\"\)\{-}"', '""', 'g') - return line -endfunction - -function! scala#CountBrackets(line, openBracket, closedBracket) - let line = substitute(a:line, '"\(.\|\\"\)\{-}"', '', 'g') - let open = substitute(line, '[^' . a:openBracket . ']', '', 'g') - let close = substitute(line, '[^' . a:closedBracket . ']', '', 'g') - return strlen(open) - strlen(close) -endfunction - -function! scala#CountParens(line) - return scala#CountBrackets(a:line, '(', ')') -endfunction - -function! scala#CountCurlies(line) - return scala#CountBrackets(a:line, '{', '}') -endfunction - -function! scala#LineEndsInIncomplete(line) - if a:line =~ '[.,]\s*$' - return 1 - else - return 0 - endif -endfunction - -function! scala#LineIsAClosingXML(line) - if a:line =~ '^\s*</\w' - return 1 - else - return 0 - endif -endfunction - -function! scala#LineCompletesXML(lnum, line) - let savedpos = getpos('.') - call setpos('.', [savedpos[0], a:lnum, 0, savedpos[3]]) - let tag = substitute(a:line, '^.*</\([^>]*\)>.*$', '\1', '') - let [lineNum, colnum] = searchpairpos('<' . tag . '>', '', '</' . tag . '>', 'Wbn') - call setpos('.', savedpos) - let pline = scala#GetLine(prevnonblank(lineNum - 1)) - if pline =~ '=\s*$' - return 1 - else - return 0 - endif -endfunction - -function! scala#IsParentCase() - let savedpos = getpos('.') - call setpos('.', [savedpos[0], savedpos[1], 0, savedpos[3]]) - let [l, c] = searchpos('^\s*\%(' . s:defMatcher . '\|\%(\<case\>\)\)', 'bnW') - let retvalue = -1 - if l != 0 && search('\%' . l . 'l\s*\<case\>', 'bnW') - let retvalue = l - endif - call setpos('.', savedpos) - return retvalue -endfunction - -function! scala#CurlyMatcher() - let matchline = scala#GetLineThatMatchesBracket('{', '}') - if scala#CountParens(scala#GetLine(matchline)) < 0 - let savedpos = getpos('.') - call setpos('.', [savedpos[0], matchline, 9999, savedpos[3]]) - call searchpos('{', 'Wbc') - call searchpos(')', 'Wb') - let [lnum, colnum] = searchpairpos('(', '', ')', 'Wbn') - call setpos('.', savedpos) - let line = scala#GetLine(lnum) - if line =~ '^\s*' . s:defMatcher - return lnum - else - return matchline - endif - else - return matchline - endif -endfunction - -function! scala#GetLineAndColumnThatMatchesCurly() - return scala#GetLineAndColumnThatMatchesBracket('{', '}') -endfunction - -function! scala#GetLineAndColumnThatMatchesParen() - return scala#GetLineAndColumnThatMatchesBracket('(', ')') -endfunction - -function! scala#GetLineAndColumnThatMatchesBracket(openBracket, closedBracket) - let savedpos = getpos('.') - let curline = scala#GetLine(line('.')) - if curline =~ a:closedBracket . '.*' . a:openBracket . '.*' . a:closedBracket - call setpos('.', [savedpos[0], savedpos[1], 0, savedpos[3]]) - call searchpos(a:closedBracket . '\ze[^' . a:closedBracket . a:openBracket . ']*' . a:openBracket, 'W') - else - call setpos('.', [savedpos[0], savedpos[1], 9999, savedpos[3]]) - call searchpos(a:closedBracket, 'Wbc') - endif - let [lnum, colnum] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbn') - call setpos('.', savedpos) - return [lnum, colnum] -endfunction - -function! scala#GetLineThatMatchesCurly() - return scala#GetLineThatMatchesBracket('{', '}') -endfunction - -function! scala#GetLineThatMatchesParen() - return scala#GetLineThatMatchesBracket('(', ')') -endfunction - -function! scala#GetLineThatMatchesBracket(openBracket, closedBracket) - let [lnum, colnum] = scala#GetLineAndColumnThatMatchesBracket(a:openBracket, a:closedBracket) - return lnum -endfunction - -function! scala#NumberOfBraceGroups(line) - let line = substitute(a:line, '[^()]', '', 'g') - if strlen(line) == 0 - return 0 - endif - let line = substitute(line, '^)*', '', 'g') - if strlen(line) == 0 - return 0 - endif - let line = substitute(line, '^(', '', 'g') - if strlen(line) == 0 - return 0 - endif - let c = 1 - let counter = 0 - let groupCount = 0 - while counter < strlen(line) - let char = strpart(line, counter, 1) - if char == '(' - let c = c + 1 - elseif char == ')' - let c = c - 1 - endif - if c == 0 - let groupCount = groupCount + 1 - endif - let counter = counter + 1 - endwhile - return groupCount -endfunction - -function! scala#MatchesIncompleteDefValr(line) - if a:line =~ '^\s*\%(' . s:defMatcher . '\|\<va[lr]\>\).*[=({]\s*$' - return 1 - else - return 0 - endif -endfunction - -function! scala#LineIsCompleteIf(line) - if scala#CountBrackets(a:line, '{', '}') == 0 && - \ scala#CountBrackets(a:line, '(', ')') == 0 && - \ a:line =~ '^\s*\<if\>\s*([^)]*)\s*\S.*$' - return 1 - else - return 0 - endif -endfunction - -function! scala#LineCompletesIfElse(lnum, line) - if a:line =~ '^\s*\%(\<if\>\|\%(}\s*\)\?\<else\>\)' - return 0 - endif - let result = search('^\%(\s*\<if\>\s*(.*).*\n\|\s*\<if\>\s*(.*)\s*\n.*\n\)\%(\s*\<else\>\s*\<if\>\s*(.*)\s*\n.*\n\)*\%(\s*\<else\>\s*\n\|\s*\<else\>[^{]*\n\)\?\%' . a:lnum . 'l', 'Wbn') - if result != 0 && scala#GetLine(prevnonblank(a:lnum - 1)) !~ '{\s*$' - return result - endif - return 0 -endfunction - -function! scala#GetPrevCodeLine(lnum) - " This needs to skip comment lines - return prevnonblank(a:lnum - 1) -endfunction - -function! scala#InvertBracketType(openBracket, closedBracket) - if a:openBracket == '(' - return [ '{', '}' ] - else - return [ '(', ')' ] - endif -endfunction - -function! scala#Testhelper(lnum, line, openBracket, closedBracket, iteration) - let bracketCount = scala#CountBrackets(a:line, a:openBracket, a:closedBracket) - " There are more '}' braces than '{' on this line so it may be completing the function definition - if bracketCount < 0 - let [matchedLNum, matchedColNum] = scala#GetLineAndColumnThatMatchesBracket(a:openBracket, a:closedBracket) - if matchedLNum == a:lnum - return -1 - endif - let matchedLine = scala#GetLine(matchedLNum) - if ! scala#MatchesIncompleteDefValr(matchedLine) - let bracketLine = substitute(substitute(matchedLine, '\%' . matchedColNum . 'c.*$', '', ''), '[^{}()]', '', 'g') - if bracketLine =~ '}$' - return scala#Testhelper(matchedLNum, matchedLine, '{', '}', a:iteration + 1) - elseif bracketLine =~ ')$' - return scala#Testhelper(matchedLNum, matchedLine, '(', ')', a:iteration + 1) - else - let prevCodeLNum = scala#GetPrevCodeLine(matchedLNum) - if scala#MatchesIncompleteDefValr(scala#GetLine(prevCodeLNum)) - return prevCodeLNum - else - return -1 - endif - endif - else - " return indent value instead - return matchedLNum - endif - " There's an equal number of '{' and '}' on this line so it may be a single line function definition - elseif bracketCount == 0 - if a:iteration == 0 - let otherBracketType = scala#InvertBracketType(a:openBracket, a:closedBracket) - return scala#Testhelper(a:lnum, a:line, otherBracketType[0], otherBracketType[1], a:iteration + 1) - else - let prevCodeLNum = scala#GetPrevCodeLine(a:lnum) - let prevCodeLine = scala#GetLine(prevCodeLNum) - if scala#MatchesIncompleteDefValr(prevCodeLine) && prevCodeLine !~ '{\s*$' - return prevCodeLNum - else - let possibleIfElse = scala#LineCompletesIfElse(a:lnum, a:line) - if possibleIfElse != 0 - let defValrLine = prevnonblank(possibleIfElse - 1) - let possibleDefValr = scala#GetLine(defValrLine) - if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$' - return possibleDefValr - else - return -1 - endif - else - return -1 - endif - endif - endif - else - return -1 - endif -endfunction - -function! scala#Test(lnum, line, openBracket, closedBracket) - return scala#Testhelper(a:lnum, a:line, a:openBracket, a:closedBracket, 0) -endfunction - -function! scala#LineCompletesDefValr(lnum, line) - let bracketCount = scala#CountBrackets(a:line, '{', '}') - if bracketCount < 0 - let matchedBracket = scala#GetLineThatMatchesBracket('{', '}') - if ! scala#MatchesIncompleteDefValr(scala#GetLine(matchedBracket)) - let possibleDefValr = scala#GetLine(prevnonblank(matchedBracket - 1)) - if matchedBracket != -1 && scala#MatchesIncompleteDefValr(possibleDefValr) - return 1 - else - return 0 - endif - else - return 0 - endif - elseif bracketCount == 0 - let bracketCount = scala#CountBrackets(a:line, '(', ')') - if bracketCount < 0 - let matchedBracket = scala#GetLineThatMatchesBracket('(', ')') - if ! scala#MatchesIncompleteDefValr(scala#GetLine(matchedBracket)) - let possibleDefValr = scala#GetLine(prevnonblank(matchedBracket - 1)) - if matchedBracket != -1 && scala#MatchesIncompleteDefValr(possibleDefValr) - return 1 - else - return 0 - endif - else - return 0 - endif - elseif bracketCount == 0 - let possibleDefValr = scala#GetLine(prevnonblank(a:lnum - 1)) - if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$' - return 1 - else - let possibleIfElse = scala#LineCompletesIfElse(a:lnum, a:line) - if possibleIfElse != 0 - let possibleDefValr = scala#GetLine(prevnonblank(possibleIfElse - 1)) - if scala#MatchesIncompleteDefValr(possibleDefValr) && possibleDefValr =~ '^.*=\s*$' - return 2 - else - return 0 - endif - else - return 0 - endif - endif - else - return 0 - endif - endif -endfunction - -function! scala#SpecificLineCompletesBrackets(lnum, openBracket, closedBracket) - let savedpos = getpos('.') - call setpos('.', [savedpos[0], a:lnum, 9999, savedpos[3]]) - let retv = scala#LineCompletesBrackets(a:openBracket, a:closedBracket) - call setpos('.', savedpos) - - return retv -endfunction - -function! scala#LineCompletesBrackets(openBracket, closedBracket) - let savedpos = getpos('.') - let offline = 0 - while offline == 0 - let [lnum, colnum] = searchpos(a:closedBracket, 'Wb') - let [lnumA, colnumA] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbn') - if lnum != lnumA - let [lnumB, colnumB] = searchpairpos(a:openBracket, '', a:closedBracket, 'Wbnr') - let offline = 1 - endif - endwhile - call setpos('.', savedpos) - if lnumA == lnumB && colnumA == colnumB - return lnumA - else - return -1 - endif -endfunction - -function! GetScalaIndent() - " Find a non-blank line above the current line. - let prevlnum = prevnonblank(v:lnum - 1) - - " Hit the start of the file, use zero indent. - if prevlnum == 0 - return 0 - endif - - let ind = indent(prevlnum) - let originalIndentValue = ind - let prevline = scala#GetLine(prevlnum) - let curlnum = v:lnum - let curline = scala#GetLine(curlnum) - if get(g:, 'scala_scaladoc_indent', 0) - let star_indent = 2 - else - let star_indent = 1 - end - - if prevline =~ '^\s*/\*\*' - if prevline =~ '\*/\s*$' - return ind - else - return ind + star_indent - endif - endif - - if curline =~ '^\s*\*' - return cindent(curlnum) - endif - - " If this line starts with a { then make it indent the same as the previous line - if curline =~ '^\s*{' - call scala#ConditionalConfirm("1") - " Unless, of course, the previous one is a { as well - if prevline !~ '^\s*{' - call scala#ConditionalConfirm("2") - return indent(prevlnum) - endif - endif - - " '.' continuations - if curline =~ '^\s*\.' - if prevline =~ '^\s*\.' - return ind - else - return ind + shiftwidth() - endif - endif - - " Indent html literals - if prevline !~ '/>\s*$' && prevline =~ '^\s*<[a-zA-Z][^>]*>\s*$' - call scala#ConditionalConfirm("3") - return ind + shiftwidth() - endif - - " assumes curly braces around try-block - if curline =~ '^\s*}\s*\<catch\>' - return ind - shiftwidth() - elseif curline =~ '^\s*\<catch\>' - return ind - endif - - " Add a shiftwidth()' after lines that start a block - " If 'if', 'for' or 'while' end with ), this is a one-line block - " If 'val', 'var', 'def' end with =, this is a one-line block - if (prevline =~ '^\s*\<\%(\%(}\?\s*else\s\+\)\?if\|for\|while\)\>.*[)=]\s*$' && scala#NumberOfBraceGroups(prevline) <= 1) - \ || prevline =~ '^\s*' . s:defMatcher . '.*=\s*$' - \ || prevline =~ '^\s*\<va[lr]\>.*[=]\s*$' - \ || prevline =~ '^\s*\%(}\s*\)\?\<else\>\s*$' - \ || prevline =~ '=\s*$' - call scala#ConditionalConfirm("4") - let ind = ind + shiftwidth() - elseif prevline =~ '^\s*\<\%(}\?\s*else\s\+\)\?if\>' && curline =~ '^\s*}\?\s*\<else\>' - return ind - endif - - let lineCompletedBrackets = 0 - let bracketCount = scala#CountBrackets(prevline, '{', '}') - if bracketCount > 0 || prevline =~ '.*{\s*$' - call scala#ConditionalConfirm("5b") - let ind = ind + shiftwidth() - elseif bracketCount < 0 - call scala#ConditionalConfirm("6b") - " if the closing brace actually completes the braces entirely, then we - " have to indent to line that started the whole thing - let completeLine = scala#LineCompletesBrackets('{', '}') - if completeLine != -1 - call scala#ConditionalConfirm("8b") - let prevCompleteLine = scala#GetLine(prevnonblank(completeLine - 1)) - " However, what actually started this part looks like it was a function - " definition, so we need to indent to that line instead. This is - " actually pretty weak at the moment. - if prevCompleteLine =~ '=\s*$' - call scala#ConditionalConfirm("9b") - let ind = indent(prevnonblank(completeLine - 1)) - else - call scala#ConditionalConfirm("10b") - let ind = indent(completeLine) - endif - else - let lineCompletedBrackets = 1 - endif - endif - - if ind == originalIndentValue - let bracketCount = scala#CountBrackets(prevline, '(', ')') - if bracketCount > 0 || prevline =~ '.*(\s*$' - call scala#ConditionalConfirm("5a") - let ind = ind + shiftwidth() - elseif bracketCount < 0 - call scala#ConditionalConfirm("6a") - " if the closing brace actually completes the braces entirely, then we - " have to indent to line that started the whole thing - let completeLine = scala#LineCompletesBrackets('(', ')') - if completeLine != -1 && prevline !~ '^.*{\s*$' - call scala#ConditionalConfirm("8a") - let prevCompleteLine = scala#GetLine(prevnonblank(completeLine - 1)) - " However, what actually started this part looks like it was a function - " definition, so we need to indent to that line instead. This is - " actually pretty weak at the moment. - if prevCompleteLine =~ '=\s*$' - call scala#ConditionalConfirm("9a") - let ind = indent(prevnonblank(completeLine - 1)) - else - call scala#ConditionalConfirm("10a") - let ind = indent(completeLine) - endif - else - " This is the only part that's different from from the '{', '}' one below - " Yup... some refactoring is necessary at some point. - let ind = ind + (bracketCount * shiftwidth()) - let lineCompletedBrackets = 1 - endif - endif - endif - - if curline =~ '^\s*}\?\s*\<else\>\%(\s\+\<if\>\s*(.*)\)\?\s*{\?\s*$' && - \ ! scala#LineIsCompleteIf(prevline) && - \ prevline !~ '^.*}\s*$' - let ind = ind - shiftwidth() - endif - - " Subtract a shiftwidth()' on '}' or html - let curCurlyCount = scala#CountCurlies(curline) - if curCurlyCount < 0 - call scala#ConditionalConfirm("14a") - let matchline = scala#CurlyMatcher() - return indent(matchline) - elseif curline =~ '^\s*</[a-zA-Z][^>]*>' - call scala#ConditionalConfirm("14c") - return ind - shiftwidth() - endif - - let prevParenCount = scala#CountParens(prevline) - if prevline =~ '^\s*\<for\>.*$' && prevParenCount > 0 - call scala#ConditionalConfirm("15") - let ind = indent(prevlnum) + 5 - endif - - let prevCurlyCount = scala#CountCurlies(prevline) - if prevCurlyCount == 0 && prevline =~ '^.*\%(=>\|⇒\)\s*$' && prevline !~ '^\s*this\s*:.*\%(=>\|⇒\)\s*$' && curline !~ '^\s*\<case\>' - call scala#ConditionalConfirm("16") - let ind = ind + shiftwidth() - endif - - if ind == originalIndentValue && curline =~ '^\s*\<case\>' - call scala#ConditionalConfirm("17") - let parentCase = scala#IsParentCase() - if parentCase != -1 - call scala#ConditionalConfirm("17a") - return indent(parentCase) - endif - endif - - if prevline =~ '^\s*\*/' - \ || prevline =~ '*/\s*$' - call scala#ConditionalConfirm("18") - let ind = ind - star_indent - endif - - if scala#LineEndsInIncomplete(prevline) - call scala#ConditionalConfirm("19") - return ind - endif - - if scala#LineIsAClosingXML(prevline) - if scala#LineCompletesXML(prevlnum, prevline) - call scala#ConditionalConfirm("20a") - return ind - shiftwidth() - else - call scala#ConditionalConfirm("20b") - return ind - endif - endif - - if ind == originalIndentValue - "let indentMultiplier = scala#LineCompletesDefValr(prevlnum, prevline) - "if indentMultiplier != 0 - " call scala#ConditionalConfirm("19a") - " let ind = ind - (indentMultiplier * shiftwidth()) - let defValrLine = scala#Test(prevlnum, prevline, '{', '}') - if defValrLine != -1 - call scala#ConditionalConfirm("21a") - let ind = indent(defValrLine) - elseif lineCompletedBrackets == 0 - call scala#ConditionalConfirm("21b") - if scala#GetLine(prevnonblank(prevlnum - 1)) =~ '^.*\<else\>\s*\%(//.*\)\?$' - call scala#ConditionalConfirm("21c") - let ind = ind - shiftwidth() - elseif scala#LineCompletesIfElse(prevlnum, prevline) - call scala#ConditionalConfirm("21d") - let ind = ind - shiftwidth() - elseif scala#CountParens(curline) < 0 && curline =~ '^\s*)' && scala#GetLine(scala#GetLineThatMatchesBracket('(', ')')) =~ '.*(\s*$' - " Handles situations that look like this: - " - " val a = func( - " 10 - " ) - " - " or - " - " val a = func( - " 10 - " ).somethingHere() - call scala#ConditionalConfirm("21e") - let ind = ind - shiftwidth() - endif - endif - endif - - call scala#ConditionalConfirm("returning " . ind) - - return ind -endfunction - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:set sw=2 sts=2 ts=8 et: -" vim600:fdm=marker fdl=1 fdc=0: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'scala') == -1 " Vim indent file diff --git a/indent/scheme.vim b/indent/scheme.vim deleted file mode 100644 index cdcca5e4..00000000 --- a/indent/scheme.vim +++ /dev/null @@ -1,15 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Scheme -" Maintainer: Sergey Khorev <sergey.khorev@gmail.com> -" Last Change: 2005 Jun 24 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -runtime! indent/lisp.vim - -endif diff --git a/indent/scss.vim b/indent/scss.vim deleted file mode 100644 index 6f62e718..00000000 --- a/indent/scss.vim +++ /dev/null @@ -1,16 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: SCSS -" Maintainer: Tim Pope <vimNOSPAM@tpope.org> -" Last Change: 2010 Jul 26 - -if exists("b:did_indent") - finish -endif - -runtime! indent/css.vim - -" vim:set sw=2: - -endif diff --git a/indent/sdl.vim b/indent/sdl.vim deleted file mode 100644 index 131dce06..00000000 --- a/indent/sdl.vim +++ /dev/null @@ -1,97 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: SDL -" Maintainer: Michael Piefel <entwurf@piefel.de> -" Last Change: 10 December 2011 - -" Shamelessly stolen from the Vim-Script indent file - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetSDLIndent() -setlocal indentkeys+==~end,=~state,*<Return> - -" Only define the function once. -if exists("*GetSDLIndent") -" finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -function! GetSDLIndent() - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - let virtuality = '^\s*\(\(virtual\|redefined\|finalized\)\s\+\)\=\s*' - - " Add a single space to comments which use asterisks - if getline(lnum) =~ '^\s*\*' - let ind = ind - 1 - endif - if getline(v:lnum) =~ '^\s*\*' - let ind = ind + 1 - endif - - " Add a 'shiftwidth' after states, different blocks, decision (and alternatives), inputs - if (getline(lnum) =~? '^\s*\(start\|state\|system\|package\|connection\|channel\|alternative\|macro\|operator\|newtype\|select\|substructure\|decision\|generator\|refinement\|service\|method\|exceptionhandler\|asntype\|syntype\|value\|(.*):\|\(priority\s\+\)\=input\|provided\)' - \ || getline(lnum) =~? virtuality . '\(process\|procedure\|block\|object\)') - \ && getline(lnum) !~? 'end[[:alpha:]]\+;$' - let ind = ind + shiftwidth() - endif - - " Subtract a 'shiftwidth' after states - if getline(lnum) =~? '^\s*\(stop\|return\>\|nextstate\)' - let ind = ind - shiftwidth() - endif - - " Subtract a 'shiftwidth' on on end (uncompleted line) - if getline(v:lnum) =~? '^\s*end\>' - let ind = ind - shiftwidth() - endif - - " Put each alternatives where the corresponding decision was - if getline(v:lnum) =~? '^\s*\((.*)\|else\):' - normal k - let ind = indent(searchpair('^\s*decision', '', '^\s*enddecision', 'bW', - \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "sdlString"')) - endif - - " Put each state where the preceding state was - if getline(v:lnum) =~? '^\s*state\>' - let ind = indent(search('^\s*start', 'bW')) - endif - - " Systems and packages are always in column 0 - if getline(v:lnum) =~? '^\s*\(\(end\)\=system\|\(end\)\=package\)' - return 0 - endif - - " Put each end* where the corresponding begin was - if getline(v:lnum) =~? '^\s*end[[:alpha:]]' - normal k - let partner=matchstr(getline(v:lnum), '\(' . virtuality . 'end\)\@<=[[:alpha:]]\+') - let ind = indent(searchpair(virtuality . partner, '', '^\s*end' . partner, 'bW', - \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "sdlString"')) - endif - - return ind -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim:sw=2 - -endif diff --git a/indent/sh.vim b/indent/sh.vim deleted file mode 100644 index 23a2d2ce..00000000 --- a/indent/sh.vim +++ /dev/null @@ -1,203 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Shell Script -" Maintainer: Christian Brabandt <cb@256bit.org> -" Previous Maintainer: Peter Aronoff <telemachus@arpinum.org> -" Original Author: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2017-08-08 -" License: Vim (see :h license) -" Repository: https://github.com/chrisbra/vim-sh-indent -" Changelog: -" 20170808: - better indent of line continuation -" 20170502: - get rid of buffer-shiftwidth function -" 20160912: - preserve indentation of here-doc blocks -" 20160627: - detect heredocs correctly -" 20160213: - detect function definition correctly -" 20160202: - use shiftwidth() function -" 20151215: - set b:undo_indent variable -" 20150728: - add foreach detection for zsh - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetShIndent() -setlocal indentkeys+=0=then,0=do,0=else,0=elif,0=fi,0=esac,0=done,0=end,),0=;;,0=;& -setlocal indentkeys+=0=fin,0=fil,0=fip,0=fir,0=fix -setlocal indentkeys-=:,0# -setlocal nosmartindent - -let b:undo_indent = 'setlocal indentexpr< indentkeys< smartindent<' - -if exists("*GetShIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -let s:sh_indent_defaults = { - \ 'default': function('shiftwidth'), - \ 'continuation-line': function('shiftwidth'), - \ 'case-labels': function('shiftwidth'), - \ 'case-statements': function('shiftwidth'), - \ 'case-breaks': 0 } - -function! s:indent_value(option) - let Value = exists('b:sh_indent_options') - \ && has_key(b:sh_indent_options, a:option) ? - \ b:sh_indent_options[a:option] : - \ s:sh_indent_defaults[a:option] - if type(Value) == type(function('type')) - return Value() - endif - return Value -endfunction - -function! GetShIndent() - let lnum = prevnonblank(v:lnum - 1) - if lnum == 0 - return 0 - endif - - let pnum = prevnonblank(lnum - 1) - - let ind = indent(lnum) - let line = getline(lnum) - if line =~ '^\s*\%(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 - elseif s:is_case_label(line, pnum) - 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*{' - 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)) - 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)) - endif - - let pine = line - let line = getline(v:lnum) - if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\|end\)\>' || line =~ '^\s*}' - let ind -= s:indent_value('default') - elseif line =~ '^\s*esac\>' && s:is_case_empty(getline(v:lnum - 1)) - let ind -= s:indent_value('default') - elseif line =~ '^\s*esac\>' - let ind -= (s:is_case_label(pine, lnum) && s:is_case_ended(pine) ? - \ 0 : s:indent_value('case-statements')) + - \ s:indent_value('case-labels') - if s:is_case_break(pine) - let ind += s:indent_value('case-breaks') - endif - elseif s:is_case_label(line, lnum) - if s:is_case(pine) - let ind = indent(lnum) + s:indent_value('case-labels') - else - let ind -= (s:is_case_label(pine, lnum) && s:is_case_ended(pine) ? - \ 0 : s:indent_value('case-statements')) - - \ s:indent_value('case-breaks') - endif - elseif s:is_case_break(line) - let ind -= s:indent_value('case-breaks') - elseif s:is_here_doc(line) - let ind = 0 - " 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) - endif - - return ind -endfunction - -function! s:is_continuation_line(line) - return a:line =~ '\%(\%(^\|[^\\]\)\\\|&&\|||\||\)' . - \ '\s*\({\s*\)\=\(#.*\)\=$' -endfunction - -function! s:find_continued_lnum(lnum) - let i = a:lnum - while i > 1 && s:is_continuation_line(getline(i - 1)) - let i -= 1 - endwhile - return i -endfunction - -function! s:is_case_label(line, pnum) - if a:line !~ '^\s*(\=.*)' - return 0 - endif - - if a:pnum > 0 - let pine = getline(a:pnum) - if !(s:is_case(pine) || s:is_case_ended(pine)) - return 0 - endif - endif - - let suffix = substitute(a:line, '^\s*(\=', "", "") - let nesting = 0 - let i = 0 - let n = strlen(suffix) - while i < n - let c = suffix[i] - let i += 1 - if c == '\\' - let i += 1 - elseif c == '(' - let nesting += 1 - elseif c == ')' - if nesting == 0 - return 1 - endif - let nesting -= 1 - endif - endwhile - return 0 -endfunction - -function! s:is_case(line) - return a:line =~ '^\s*case\>' -endfunction - -function! s:is_case_break(line) - return a:line =~ '^\s*;[;&]' -endfunction - -function! s:is_here_doc(line) - if a:line =~ '^\w\+$' - let here_pat = '<<-\?'. s:escape(a:line). '\$' - return search(here_pat, 'bnW') > 0 - endif - return 0 -endfunction - -function! s:is_case_ended(line) - return s:is_case_break(a:line) || a:line =~ ';[;&]\s*\%(#.*\)\=$' -endfunction - -function! s:is_case_empty(line) - if a:line =~ '^\s*$' || a:line =~ '^\s*#' - return s:is_case_empty(getline(v:lnum - 1)) - else - return a:line =~ '^\s*case\>' - endif -endfunction - -function! s:escape(pattern) - return '\V'. escape(a:pattern, '\\') -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif diff --git a/indent/sml.vim b/indent/sml.vim deleted file mode 100644 index 286daf68..00000000 --- a/indent/sml.vim +++ /dev/null @@ -1,221 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: SML -" Maintainer: Saikat Guha <sg266@cornell.edu> -" Hubert Chao <hc85@cornell.edu> -" Original OCaml Version: -" Jean-Francois Yuen <jfyuen@ifrance.com> -" Mike Leary <leary@nwlink.com> -" Markus Mottl <markus@oefai.at> -" OCaml URL: http://www.oefai.at/~markus/vim/indent/ocaml.vim -" Last Change: 2003 Jan 04 - Adapted to SML -" 2002 Nov 06 - Some fixes (JY) -" 2002 Oct 28 - Fixed bug with indentation of ']' (MM) -" 2002 Oct 22 - Major rewrite (JY) - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal expandtab -setlocal indentexpr=GetSMLIndent() -setlocal indentkeys+=0=and,0=else,0=end,0=handle,0=if,0=in,0=let,0=then,0=val,0=fun,0=\|,0=*),0) -setlocal nolisp -setlocal nosmartindent -setlocal textwidth=80 -setlocal shiftwidth=2 - -" Comment formatting -if (has("comments")) - set comments=sr:(*,mb:*,ex:*) - set fo=cqort -endif - -" Only define the function once. -"if exists("*GetSMLIndent") -"finish -"endif - -" Define some patterns: -let s:beflet = '^\s*\(initializer\|method\|try\)\|\(\<\(begin\|do\|else\|in\|then\|try\)\|->\|;\)\s*$' -let s:letpat = '^\s*\(let\|type\|module\|class\|open\|exception\|val\|include\|external\)\>' -let s:letlim = '\(\<\(sig\|struct\)\|;;\)\s*$' -let s:lim = '^\s*\(exception\|external\|include\|let\|module\|open\|type\|val\)\>' -let s:module = '\<\%(let\|sig\|struct\)\>' -let s:obj = '^\s*\(constraint\|inherit\|initializer\|method\|val\)\>\|\<\(object\|object\s*(.*)\)\s*$' -let s:type = '^\s*\%(let\|type\)\>.*=' -let s:val = '^\s*\(val\|external\)\>.*:' - -" Skipping pattern, for comments -function! s:SkipPattern(lnum, pat) - let def = prevnonblank(a:lnum - 1) - while def > 0 && getline(def) =~ a:pat - let def = prevnonblank(def - 1) - endwhile - return def -endfunction - -" Indent for ';;' to match multiple 'let' -function! s:GetInd(lnum, pat, lim) - let llet = search(a:pat, 'bW') - let old = indent(a:lnum) - while llet > 0 - let old = indent(llet) - let nb = s:SkipPattern(llet, '^\s*(\*.*\*)\s*$') - if getline(nb) =~ a:lim - return old - endif - let llet = search(a:pat, 'bW') - endwhile - return old -endfunction - -" Indent pairs -function! s:FindPair(pstart, pmid, pend) - call search(a:pend, 'bW') -" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')) - let lno = searchpair(a:pstart, a:pmid, a:pend, 'bW', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"') - if lno == -1 - return indent(lno) - else - return col(".") - 1 - endif -endfunction - -function! s:FindLet(pstart, pmid, pend) - call search(a:pend, 'bW') -" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')) - let lno = searchpair(a:pstart, a:pmid, a:pend, 'bW', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"') - let moduleLine = getline(lno) - if lno == -1 || moduleLine =~ '^\s*\(fun\|structure\|signature\)\>' - return indent(lno) - else - return col(".") - 1 - endif -endfunction - -" Indent 'let' -"function! s:FindLet(pstart, pmid, pend) -" call search(a:pend, 'bW') -" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ "^\\s*let\\>.*=\\s*$\\|" . s:beflet')) -"endfunction - -function! GetSMLIndent() - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - let lline = getline(lnum) - - " Return double 'shiftwidth' after lines matching: - if lline =~ '^\s*|.*=>\s*$' - return ind + 2 *shiftwidth() - elseif lline =~ '^\s*val\>.*=\s*$' - return ind + shiftwidth() - endif - - let line = getline(v:lnum) - - " Indent lines starting with 'end' to matching module - if line =~ '^\s*end\>' - return s:FindLet(s:module, '', '\<end\>') - - " Match 'else' with 'if' - elseif line =~ '^\s*else\>' - if lline !~ '^\s*\(if\|else\|then\)\>' - return s:FindPair('\<if\>', '', '\<then\>') - else - return ind - endif - - " Match 'then' with 'if' - elseif line =~ '^\s*then\>' - if lline !~ '^\s*\(if\|else\|then\)\>' - return s:FindPair('\<if\>', '', '\<then\>') - else - return ind - endif - - " Indent if current line begins with ']' - elseif line =~ '^\s*\]' - return s:FindPair('\[','','\]') - - " Indent current line starting with 'in' to last matching 'let' - elseif line =~ '^\s*in\>' - let ind = s:FindLet('\<let\>','','\<in\>') - - " Indent from last matching module if line matches: - elseif line =~ '^\s*\(fun\|val\|open\|structure\|and\|datatype\|type\|exception\)\>' - cursor(lnum,1) - let lastModule = indent(searchpair(s:module, '', '\<end\>', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')) - if lastModule == -1 - return 0 - else - return lastModule + shiftwidth() - endif - - " Indent lines starting with '|' from matching 'case', 'handle' - elseif line =~ '^\s*|' - " cursor(lnum,1) - let lastSwitch = search('\<\(case\|handle\|fun\|datatype\)\>','bW') - let switchLine = getline(lastSwitch) - let switchLineIndent = indent(lastSwitch) - if lline =~ '^\s*|' - return ind - endif - if switchLine =~ '\<case\>' - return col(".") + 2 - elseif switchLine =~ '\<handle\>' - return switchLineIndent + shiftwidth() - elseif switchLine =~ '\<datatype\>' - call search('=') - return col(".") - 1 - else - return switchLineIndent + 2 - endif - - - " Indent if last line ends with 'sig', 'struct', 'let', 'then', 'else', - " 'in' - elseif lline =~ '\<\(sig\|struct\|let\|in\|then\|else\)\s*$' - let ind = ind + shiftwidth() - - " Indent if last line ends with 'of', align from 'case' - elseif lline =~ '\<\(of\)\s*$' - call search('\<case\>',"bW") - let ind = col(".")+4 - - " Indent if current line starts with 'of' - elseif line =~ '^\s*of\>' - call search('\<case\>',"bW") - let ind = col(".")+1 - - - " Indent if last line starts with 'fun', 'case', 'fn' - elseif lline =~ '^\s*\(fun\|fn\|case\)\>' - let ind = ind + shiftwidth() - - endif - - " Don't indent 'let' if last line started with 'fun', 'fn' - if line =~ '^\s*let\>' - if lline =~ '^\s*\(fun\|fn\)' - let ind = ind - shiftwidth() - endif - endif - - return ind - -endfunction - -" vim:sw=2 - -endif diff --git a/indent/sql.vim b/indent/sql.vim deleted file mode 100644 index f7eaf3fd..00000000 --- a/indent/sql.vim +++ /dev/null @@ -1,43 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file loader -" Language: SQL -" Maintainer: David Fishburn <fishburn at ianywhere dot com> -" Last Change: Thu Sep 15 2005 10:27:51 AM -" Version: 1.0 -" Download: http://vim.sourceforge.net/script.php?script_id=495 - -" Description: Checks for a: -" buffer local variable, -" global variable, -" If the above exist, it will source the type specified. -" If none exist, it will source the default sqlanywhere.vim file. - - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Default to the standard Vim distribution file -let filename = 'sqlanywhere' - -" Check for overrides. Buffer variables have the highest priority. -if exists("b:sql_type_override") - " Check the runtimepath to see if the file exists - if globpath(&runtimepath, 'indent/'.b:sql_type_override.'.vim') != '' - let filename = b:sql_type_override - endif -elseif exists("g:sql_type_default") - if globpath(&runtimepath, 'indent/'.g:sql_type_default.'.vim') != '' - let filename = g:sql_type_default - endif -endif - -" Source the appropriate file -exec 'runtime indent/'.filename.'.vim' - - -" vim:sw=4: - -endif diff --git a/indent/sqlanywhere.vim b/indent/sqlanywhere.vim deleted file mode 100644 index afcfaf14..00000000 --- a/indent/sqlanywhere.vim +++ /dev/null @@ -1,397 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: SQL -" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com> -" Last Change: 2017 Jun 13 -" Version: 3.0 -" Download: http://vim.sourceforge.net/script.php?script_id=495 - -" Notes: -" Indenting keywords are based on Oracle and Sybase Adaptive Server -" Anywhere (ASA). Test indenting was done with ASA stored procedures and -" fuctions and Oracle packages which contain stored procedures and -" functions. -" This has not been tested against Microsoft SQL Server or -" Sybase Adaptive Server Enterprise (ASE) which use the Transact-SQL -" syntax. That syntax does not have end tags for IF's, which makes -" indenting more difficult. -" -" Known Issues: -" The Oracle MERGE statement does not have an end tag associated with -" it, this can leave the indent hanging to the right one too many. -" -" History: -" 3.0 (Dec 2012) -" Added cpo check -" -" 2.0 -" Added the FOR keyword to SQLBlockStart to handle (Alec Tica): -" for i in 1..100 loop -" |<-- I expect to have indentation here -" end loop; -" - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 -let b:current_indent = "sqlanywhere" - -setlocal indentkeys-=0{ -setlocal indentkeys-=0} -setlocal indentkeys-=: -setlocal indentkeys-=0# -setlocal indentkeys-=e - -" This indicates formatting should take place when one of these -" expressions is used. These expressions would normally be something -" you would type at the BEGINNING of a line -" SQL is generally case insensitive, so this files assumes that -" These keywords are something that would trigger an indent LEFT, not -" an indent right, since the SQLBlockStart is used for those keywords -setlocal indentkeys+==~end,=~else,=~elseif,=~elsif,0=~when,0=) - -" GetSQLIndent is executed whenever one of the expressions -" in the indentkeys is typed -setlocal indentexpr=GetSQLIndent() - -" Only define the functions once. -if exists("*GetSQLIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -" List of all the statements that start a new block. -" These are typically words that start a line. -" IS is excluded, since it is difficult to determine when the -" ending block is (especially for procedures/functions). -let s:SQLBlockStart = '^\s*\%('. - \ 'if\|else\|elseif\|elsif\|'. - \ 'while\|loop\|do\|for\|'. - \ 'begin\|'. - \ 'case\|when\|merge\|exception'. - \ '\)\>' -let s:SQLBlockEnd = '^\s*\(end\)\>' - -" The indent level is also based on unmatched paranethesis -" If a line has an extra "(" increase the indent -" If a line has an extra ")" decrease the indent -function! s:CountUnbalancedParan( line, paran_to_check ) - let l = a:line - let lp = substitute(l, '[^(]', '', 'g') - let l = a:line - let rp = substitute(l, '[^)]', '', 'g') - - if a:paran_to_check =~ ')' - " echom 'CountUnbalancedParan ) returning: ' . - " \ (strlen(rp) - strlen(lp)) - return (strlen(rp) - strlen(lp)) - elseif a:paran_to_check =~ '(' - " echom 'CountUnbalancedParan ( returning: ' . - " \ (strlen(lp) - strlen(rp)) - return (strlen(lp) - strlen(rp)) - else - " echom 'CountUnbalancedParan unknown paran to check: ' . - " \ a:paran_to_check - return 0 - endif -endfunction - -" Unindent commands based on previous indent level -function! s:CheckToIgnoreRightParan( prev_lnum, num_levels ) - let lnum = a:prev_lnum - let line = getline(lnum) - let ends = 0 - let num_right_paran = a:num_levels - let ignore_paran = 0 - let vircol = 1 - - while num_right_paran > 0 - silent! exec 'norm! '.lnum."G\<bar>".vircol."\<bar>" - let right_paran = search( ')', 'W' ) - if right_paran != lnum - " This should not happen since there should be at least - " num_right_paran matches for this line - break - endif - let vircol = virtcol(".") - - " if getline(".") =~ '^)' - let matching_paran = searchpair('(', '', ')', 'bW', - \ 's:IsColComment(line("."), col("."))') - - if matching_paran < 1 - " No match found - " echom 'CTIRP - no match found, ignoring' - break - endif - - if matching_paran == lnum - " This was not an unmatched parantenses, start the search again - " again after this column - " echom 'CTIRP - same line match, ignoring' - continue - endif - - " echom 'CTIRP - match: ' . line(".") . ' ' . getline(".") - - if getline(matching_paran) =~? '\(if\|while\)\>' - " echom 'CTIRP - if/while ignored: ' . line(".") . ' ' . getline(".") - let ignore_paran = ignore_paran + 1 - endif - - " One match found, decrease and check for further matches - let num_right_paran = num_right_paran - 1 - - endwhile - - " Fallback - just move back one - " return a:prev_indent - shiftwidth() - return ignore_paran -endfunction - -" Based on the keyword provided, loop through previous non empty -" non comment lines to find the statement that initated the keyword. -" Return its indent level -" CASE .. -" WHEN ... -" Should return indent level of CASE -" EXCEPTION .. -" WHEN ... -" something; -" WHEN ... -" Should return indent level of exception. -function! s:GetStmtStarterIndent( keyword, curr_lnum ) - let lnum = a:curr_lnum - - " Default - reduce indent by 1 - let ind = indent(a:curr_lnum) - shiftwidth() - - if a:keyword =~? 'end' - exec 'normal! ^' - let stmts = '^\s*\%('. - \ '\<begin\>\|' . - \ '\%(\%(\<end\s\+\)\@<!\<loop\>\)\|' . - \ '\%(\%(\<end\s\+\)\@<!\<case\>\)\|' . - \ '\%(\%(\<end\s\+\)\@<!\<for\>\)\|' . - \ '\%(\%(\<end\s\+\)\@<!\<if\>\)'. - \ '\)' - let matching_lnum = searchpair(stmts, '', '\<end\>\zs', 'bW', - \ 's:IsColComment(line("."), col(".")) == 1') - exec 'normal! $' - if matching_lnum > 0 && matching_lnum < a:curr_lnum - let ind = indent(matching_lnum) - endif - elseif a:keyword =~? 'when' - exec 'normal! ^' - let matching_lnum = searchpair( - \ '\%(\<end\s\+\)\@<!\<case\>\|\<exception\>\|\<merge\>', - \ '', - \ '\%(\%(\<when\s\+others\>\)\|\%(\<end\s\+case\>\)\)', - \ 'bW', - \ 's:IsColComment(line("."), col(".")) == 1') - exec 'normal! $' - if matching_lnum > 0 && matching_lnum < a:curr_lnum - let ind = indent(matching_lnum) - else - let ind = indent(a:curr_lnum) - endif - endif - - return ind -endfunction - - -" Check if the line is a comment -function! s:IsLineComment(lnum) - let rc = synIDattr( - \ synID(a:lnum, - \ match(getline(a:lnum), '\S')+1, 0) - \ , "name") - \ =~? "comment" - - return rc -endfunction - - -" Check if the column is a comment -function! s:IsColComment(lnum, cnum) - let rc = synIDattr(synID(a:lnum, a:cnum, 0), "name") - \ =~? "comment" - - return rc -endfunction - - -" Instead of returning a column position, return -" an appropriate value as a factor of shiftwidth. -function! s:ModuloIndent(ind) - let ind = a:ind - - if ind > 0 - let modulo = ind % shiftwidth() - - if modulo > 0 - let ind = ind - modulo - endif - endif - - return ind -endfunction - - -" Find correct indent of a new line based upon the previous line -function! GetSQLIndent() - let lnum = v:lnum - let ind = indent(lnum) - - " If the current line is a comment, leave the indent as is - " Comment out this additional check since it affects the - " indenting of =, and will not reindent comments as it should - " if s:IsLineComment(lnum) == 1 - " return ind - " endif - - " Get previous non-blank line - let prevlnum = prevnonblank(lnum - 1) - if prevlnum <= 0 - return ind - endif - - if s:IsLineComment(prevlnum) == 1 - if getline(v:lnum) =~ '^\s*\*' - let ind = s:ModuloIndent(indent(prevlnum)) - return ind + 1 - endif - " If the previous line is a comment, then return -1 - " to tell Vim to use the formatoptions setting to determine - " the indent to use - " But only if the next line is blank. This would be true if - " the user is typing, but it would not be true if the user - " is reindenting the file - if getline(v:lnum) =~ '^\s*$' - return -1 - endif - endif - - " echom 'PREVIOUS INDENT: ' . indent(prevlnum) . ' LINE: ' . getline(prevlnum) - - " This is the line you just hit return on, it is not the current line - " which is new and empty - " Based on this line, we can determine how much to indent the new - " line - - " Get default indent (from prev. line) - let ind = indent(prevlnum) - let prevline = getline(prevlnum) - - " Now check what's on the previous line to determine if the indent - " should be changed, for example IF, BEGIN, should increase the indent - " where END IF, END, should decrease the indent. - if prevline =~? s:SQLBlockStart - " Move indent in - let ind = ind + shiftwidth() - " echom 'prevl - SQLBlockStart - indent ' . ind . ' line: ' . prevline - elseif prevline =~ '[()]' - if prevline =~ '(' - let num_unmatched_left = s:CountUnbalancedParan( prevline, '(' ) - else - let num_unmatched_left = 0 - endif - if prevline =~ ')' - let num_unmatched_right = s:CountUnbalancedParan( prevline, ')' ) - else - let num_unmatched_right = 0 - " let num_unmatched_right = s:CountUnbalancedParan( prevline, ')' ) - endif - if num_unmatched_left > 0 - " There is a open left paranethesis - " increase indent - let ind = ind + ( shiftwidth() * num_unmatched_left ) - elseif num_unmatched_right > 0 - " if it is an unbalanced paranethesis only unindent if - " it was part of a command (ie create table(..) ) - " instead of part of an if (ie if (....) then) which should - " maintain the indent level - let ignore = s:CheckToIgnoreRightParan( prevlnum, num_unmatched_right ) - " echom 'prevl - ) unbalanced - CTIRP - ignore: ' . ignore - - if prevline =~ '^\s*)' - let ignore = ignore + 1 - " echom 'prevl - begins ) unbalanced ignore: ' . ignore - endif - - if (num_unmatched_right - ignore) > 0 - let ind = ind - ( shiftwidth() * (num_unmatched_right - ignore) ) - endif - - endif - endif - - - " echom 'CURRENT INDENT: ' . ind . ' LINE: ' . getline(v:lnum) - - " This is a new blank line since we just typed a carriage return - " Check current line; search for simplistic matching start-of-block - let line = getline(v:lnum) - - if line =~? '^\s*els' - " Any line when you type else will automatically back up one - " ident level (ie else, elseif, elsif) - let ind = ind - shiftwidth() - " echom 'curr - else - indent ' . ind - elseif line =~? '^\s*end\>' - let ind = s:GetStmtStarterIndent('end', v:lnum) - " General case for end - " let ind = ind - shiftwidth() - " echom 'curr - end - indent ' . ind - elseif line =~? '^\s*when\>' - let ind = s:GetStmtStarterIndent('when', v:lnum) - " If the WHEN clause is used with a MERGE or EXCEPTION - " clause, do not change the indent level, since these - " statements do not have a corresponding END statement. - " if stmt_starter =~? 'case' - " let ind = ind - shiftwidth() - " endif - " elseif line =~ '^\s*)\s*;\?\s*$' - " elseif line =~ '^\s*)' - elseif line =~ '^\s*)' - let num_unmatched_right = s:CountUnbalancedParan( line, ')' ) - let ignore = s:CheckToIgnoreRightParan( v:lnum, num_unmatched_right ) - " If the line ends in a ), then reduce the indent - " This catches items like: - " CREATE TABLE T1( - " c1 int, - " c2 int - " ); - " But we do not want to unindent a line like: - " IF ( c1 = 1 - " AND c2 = 3 ) THEN - " let num_unmatched_right = s:CountUnbalancedParan( line, ')' ) - " if num_unmatched_right > 0 - " elseif strpart( line, strlen(line)-1, 1 ) =~ ')' - " let ind = ind - shiftwidth() - if line =~ '^\s*)' - " let ignore = ignore + 1 - " echom 'curr - begins ) unbalanced ignore: ' . ignore - endif - - if (num_unmatched_right - ignore) > 0 - let ind = ind - ( shiftwidth() * (num_unmatched_right - ignore) ) - endif - " endif - endif - - " echom 'final - indent ' . ind - return s:ModuloIndent(ind) -endfunction - -" Restore: -let &cpo= s:keepcpo -unlet s:keepcpo -" vim: ts=4 fdm=marker sw=4 - -endif diff --git a/indent/systemd.vim b/indent/systemd.vim deleted file mode 100644 index b8fad530..00000000 --- a/indent/systemd.vim +++ /dev/null @@ -1,14 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: systemd.unit(5) - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Looks a lot like dosini files. -runtime! indent/dosini.vim - -endif diff --git a/indent/systemverilog.vim b/indent/systemverilog.vim deleted file mode 100644 index 3d791762..00000000 --- a/indent/systemverilog.vim +++ /dev/null @@ -1,234 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: SystemVerilog -" Maintainer: kocha <kocha.lsifrontend@gmail.com> -" Last Change: 12-Aug-2013. - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=SystemVerilogIndent() -setlocal indentkeys=!^F,o,O,0),0},=begin,=end,=join,=endcase,=join_any,=join_none -setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify -setlocal indentkeys+==endclass,=endpackage,=endsequence,=endclocking -setlocal indentkeys+==endinterface,=endgroup,=endprogram,=endproperty,=endchecker -setlocal indentkeys+==`else,=`endif - -" Only define the function once. -if exists("*SystemVerilogIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -function SystemVerilogIndent() - - if exists('b:systemverilog_indent_width') - let offset = b:systemverilog_indent_width - else - let offset = shiftwidth() - endif - if exists('b:systemverilog_indent_modules') - let indent_modules = offset - else - let indent_modules = 0 - endif - - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - let lnum2 = prevnonblank(lnum - 1) - let curr_line = getline(v:lnum) - let last_line = getline(lnum) - let last_line2 = getline(lnum2) - let ind = indent(lnum) - let ind2 = indent(lnum - 1) - let offset_comment1 = 1 - " Define the condition of an open statement - " Exclude the match of //, /* or */ - let sv_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)' - " Define the condition when the statement ends with a one-line comment - let sv_comment = '\(//.*\|/\*.*\*/\s*\)' - if exists('b:verilog_indent_verbose') - let vverb_str = 'INDENT VERBOSE:' - let vverb = 1 - else - let vverb = 0 - endif - - " Indent accoding to last line - " End of multiple-line comment - if last_line =~ '\*/\s*$' && last_line !~ '/\*.\{-}\*/' - let ind = ind - offset_comment1 - if vverb - echo vverb_str "De-indent after a multiple-line comment." - endif - - " Indent after if/else/for/case/always/initial/specify/fork blocks - elseif last_line =~ '`\@<!\<\(if\|else\)\>' || - \ last_line =~ '^\s*\<\(for\|case\%[[zx]]\|do\|foreach\|randcase\)\>' || - \ last_line =~ '^\s*\<\(always\|always_comb\|always_ff\|always_latch\)\>' || - \ last_line =~ '^\s*\<\(initial\|specify\|fork\|final\)\>' - if last_line !~ '\(;\|\<end\>\)\s*' . sv_comment . '*$' || - \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . sv_comment . '*$' - let ind = ind + offset - if vverb | echo vverb_str "Indent after a block statement." | endif - endif - " Indent after function/task/class/package/sequence/clocking/ - " interface/covergroup/property/checkerprogram blocks - elseif last_line =~ '^\s*\<\(function\|task\|class\|package\)\>' || - \ last_line =~ '^\s*\<\(sequence\|clocking\|interface\)\>' || - \ last_line =~ '^\s*\(\w\+\s*:\)\=\s*\<covergroup\>' || - \ last_line =~ '^\s*\<\(property\|checker\|program\)\>' - if last_line !~ '\<end\>\s*' . sv_comment . '*$' || - \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . sv_comment . '*$' - let ind = ind + offset - if vverb - echo vverb_str "Indent after function/task/class block statement." - endif - endif - - " Indent after module/function/task/specify/fork blocks - elseif last_line =~ '^\s*\(\<extern\>\s*\)\=\<module\>' - let ind = ind + indent_modules - if vverb && indent_modules - echo vverb_str "Indent after module statement." - endif - if last_line =~ '[(,]\s*' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*[(,]\s*' . sv_comment . '*$' - let ind = ind + offset - if vverb - echo vverb_str "Indent after a multiple-line module statement." - endif - endif - - " Indent after a 'begin' statement - elseif last_line =~ '\(\<begin\>\)\(\s*:\s*\w\+\)*' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*\(\<begin\>\)' && - \ ( last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' || - \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . sv_comment . '*$' ) - let ind = ind + offset - if vverb | echo vverb_str "Indent after begin statement." | endif - - " Indent after a '{' or a '(' - elseif last_line =~ '[{(]' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*[{(]' && - \ ( last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' || - \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . sv_comment . '*$' ) - let ind = ind + offset - if vverb | echo vverb_str "Indent after begin statement." | endif - - " De-indent for the end of one-line block - elseif ( last_line !~ '\<begin\>' || - \ last_line =~ '\(//\|/\*\).*\<begin\>' ) && - \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|final\)\>.*' . - \ sv_comment . '*$' && - \ last_line2 !~ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|final\)\>' && - \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' && - \ ( last_line2 !~ '\<begin\>' || - \ last_line2 =~ '\(//\|/\*\).*\<begin\>' ) - let ind = ind - offset - if vverb - echo vverb_str "De-indent after the end of one-line statement." - endif - - " Multiple-line statement (including case statement) - " Open statement - " Ident the first open line - elseif last_line =~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*' . sv_openstat . '\s*$' && - \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' - let ind = ind + offset - if vverb | echo vverb_str "Indent after an open statement." | endif - - " Close statement - " De-indent for an optional close parenthesis and a semicolon, and only - " if there exists precedent non-whitespace char - elseif last_line =~ ')*\s*;\s*' . sv_comment . '*$' && - \ last_line !~ '^\s*)*\s*;\s*' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . sv_comment . '*$' && - \ ( last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line2 !~ ';\s*//.*$') && - \ last_line2 !~ '^\s*' . sv_comment . '$' - let ind = ind - offset - if vverb | echo vverb_str "De-indent after a close statement." | endif - - " `ifdef and `else - elseif last_line =~ '^\s*`\<\(ifdef\|else\)\>' - let ind = ind + offset - if vverb - echo vverb_str "Indent after a `ifdef or `else statement." - endif - - endif - - " Re-indent current line - - " De-indent on the end of the block - " join/end/endcase/endfunction/endtask/endspecify - if curr_line =~ '^\s*\<\(join\|join_any\|join_none\|\|end\|endcase\|while\)\>' || - \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\|endclass\)\>' || - \ curr_line =~ '^\s*\<\(endpackage\|endsequence\|endclocking\|endinterface\)\>' || - \ curr_line =~ '^\s*\<\(endgroup\|endproperty\|endchecker\|endprogram\)\>' || - \ curr_line =~ '^\s*}' - let ind = ind - offset - if vverb | echo vverb_str "De-indent the end of a block." | endif - elseif curr_line =~ '^\s*\<endmodule\>' - let ind = ind - indent_modules - if vverb && indent_modules - echo vverb_str "De-indent the end of a module." - endif - - " De-indent on a stand-alone 'begin' - elseif curr_line =~ '^\s*\<begin\>' - if last_line !~ '^\s*\<\(function\|task\|specify\|module\|class\|package\)\>' || - \ last_line !~ '^\s*\<\(sequence\|clocking\|interface\|covergroup\)\>' || - \ last_line !~ '^\s*\<\(property\|checker\|program\)\>' && - \ last_line !~ '^\s*\()*\s*;\|)\+\)\s*' . sv_comment . '*$' && - \ ( last_line =~ - \ '\<\(`\@<!if\|`\@<!else\|for\|case\%[[zx]]\|always\|initial\|do\|foreach\|randcase\|final\)\>' || - \ last_line =~ ')\s*' . sv_comment . '*$' || - \ last_line =~ sv_openstat . '\s*' . sv_comment . '*$' ) - let ind = ind - offset - if vverb - echo vverb_str "De-indent a stand alone begin statement." - endif - endif - - " De-indent after the end of multiple-line statement - elseif curr_line =~ '^\s*)' && - \ ( last_line =~ sv_openstat . '\s*' . sv_comment . '*$' || - \ last_line !~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' ) - let ind = ind - offset - if vverb - echo vverb_str "De-indent the end of a multiple statement." - endif - - " De-indent `else and `endif - elseif curr_line =~ '^\s*`\<\(else\|endif\)\>' - let ind = ind - offset - if vverb | echo vverb_str "De-indent `else and `endif statement." | endif - - endif - - " Return the indention - return ind -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim:sw=2 - -endif diff --git a/indent/tcl.vim b/indent/tcl.vim deleted file mode 100644 index 7641e144..00000000 --- a/indent/tcl.vim +++ /dev/null @@ -1,79 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Tcl -" Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetTclIndent() -setlocal indentkeys=0{,0},!^F,o,O,0] -setlocal nosmartindent - -if exists("*GetTclIndent") - finish -endif - -function s:prevnonblanknoncomment(lnum) - let lnum = prevnonblank(a:lnum) - while lnum > 0 - let line = getline(lnum) - if line !~ '^\s*\(#\|$\)' - break - endif - let lnum = prevnonblank(lnum - 1) - endwhile - return lnum -endfunction - -function s:count_braces(lnum, count_open) - let n_open = 0 - let n_close = 0 - let line = getline(a:lnum) - let pattern = '[{}]' - let i = match(line, pattern) - while i != -1 - if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'tcl\%(Comment\|String\)' - if line[i] == '{' - let n_open += 1 - elseif line[i] == '}' - if n_open > 0 - let n_open -= 1 - else - let n_close += 1 - endif - endif - endif - let i = match(line, pattern, i + 1) - endwhile - return a:count_open ? n_open : n_close -endfunction - -function GetTclIndent() - let line = getline(v:lnum) - if line =~ '^\s*\*' - return cindent(v:lnum) - elseif line =~ '^\s*}' - return indent(v:lnum) - shiftwidth() - endif - - let pnum = s:prevnonblanknoncomment(v:lnum - 1) - if pnum == 0 - return 0 - endif - - let ind = indent(pnum) + s:count_braces(pnum, 1) * shiftwidth() - - let pline = getline(pnum) - if pline =~ '}\s*$' - let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * shiftwidth() - endif - - return ind -endfunction - -endif diff --git a/indent/tcsh.vim b/indent/tcsh.vim deleted file mode 100644 index 43d19a1e..00000000 --- a/indent/tcsh.vim +++ /dev/null @@ -1,53 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: C-shell (tcsh) -" Maintainer: GI <a@b.c>, where a='gi1242+vim', b='gmail', c='com' -" Last Modified: Sat 10 Dec 2011 09:23:00 AM EST - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -let b:did_indent = 1 - -setlocal indentexpr=TcshGetIndent() -setlocal indentkeys+=e,0=end,0=endsw indentkeys-=0{,0},0),:,0# - -" Only define the function once. -if exists("*TcshGetIndent") - finish -endif - -function TcshGetIndent() - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - " Add indent if previous line begins with while or foreach - " OR line ends with case <str>:, default:, else, then or \ - let ind = indent(lnum) - let line = getline(lnum) - if line =~ '\v^\s*%(while|foreach)>|^\s*%(case\s.*:|default:|else)\s*$|%(<then|\\)$' - let ind = ind + shiftwidth() - endif - - if line =~ '\v^\s*breaksw>' - let ind = ind - shiftwidth() - endif - - " Subtract indent if current line has on end, endif, case commands - let line = getline(v:lnum) - if line =~ '\v^\s*%(else|end|endif)\s*$' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -endif diff --git a/indent/teraterm.vim b/indent/teraterm.vim deleted file mode 100644 index 5aff4012..00000000 --- a/indent/teraterm.vim +++ /dev/null @@ -1,59 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Tera Term Language (TTL) -" Based on Tera Term Version 4.92 -" Maintainer: Ken Takata -" URL: https://github.com/k-takata/vim-teraterm -" Last Change: 2017 Jun 13 -" Filenames: *.ttl -" License: VIM License - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal nosmartindent -setlocal noautoindent -setlocal indentexpr=GetTeraTermIndent(v:lnum) -setlocal indentkeys=!^F,o,O,e -setlocal indentkeys+==elseif,=endif,=loop,=next,=enduntil,=endwhile - -if exists("*GetTeraTermIndent") - finish -endif - -function! GetTeraTermIndent(lnum) - let l:prevlnum = prevnonblank(a:lnum-1) - if l:prevlnum == 0 - " top of file - return 0 - endif - - " grab the previous and current line, stripping comments. - let l:prevl = substitute(getline(l:prevlnum), ';.*$', '', '') - let l:thisl = substitute(getline(a:lnum), ';.*$', '', '') - let l:previ = indent(l:prevlnum) - - let l:ind = l:previ - - if l:prevl =~ '^\s*if\>.*\<then\>' - " previous line opened a block - let l:ind += shiftwidth() - endif - if l:prevl =~ '^\s*\%(elseif\|else\|do\|until\|while\|for\)\>' - " previous line opened a block - let l:ind += shiftwidth() - endif - if l:thisl =~ '^\s*\%(elseif\|else\|endif\|enduntil\|endwhile\|loop\|next\)\>' - " this line closed a block - let l:ind -= shiftwidth() - endif - - return l:ind -endfunction - -" vim: ts=8 sw=2 sts=2 - -endif diff --git a/indent/tex.vim b/indent/tex.vim index ca1d0a5a..14af7b28 100644 --- a/indent/tex.vim +++ b/indent/tex.vim @@ -1,424 +1,3 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: LaTeX -" Maintainer: Yichao Zhou <broken.zhou AT gmail.com> -" Created: Sat, 16 Feb 2002 16:50:19 +0100 -" Version: 0.9.4 -" Please email me if you found something I can do. Comments, bug report and -" feature request are welcome. - -" Last Update: {{{ -" 25th Sep 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 AT math.huji.ac.il> -" (*) New variables: -" g:tex_items, g:tex_itemize_env, g:tex_noindent_env -" 2011/3/6, by Yichao Zhou <broken.zhou AT 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 -" 2011/9/25, by Yichao Zhou <broken.zhou AT gmail.com> -" (*) Bug fix: smartindent-like indent for "[]" -" (*) New features: Align with "&". -" (*) New variable: g:tex_indent_and. -" 2011/10/23 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) Bug fix: improve the smartindent-like indent for "{}" and -" "[]". -" 2012/02/27 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) Bug fix: support default folding marker. -" (*) Indent with "&" is not very handy. Make it not enable by -" default. -" 2012/03/06 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) 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 <broken.zhou AT gmail.com> -" (*) Modify "&" so that only indent when current line start with -" "&". -" 2012/03/12 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) Modify indentkeys. -" 2012/03/18 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) Add &cpo -" 2013/05/02 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) Fix problem about GetTeXIndent checker. Thank Albert Netymk -" for reporting this. -" 2014/06/23 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) 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 <broken.zhou AT gmail.com> -" (*) Indent current line if last line has larger indentation -" 2016/11/08 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) Fix problems for \[ and \]. Thanks Bruno for reporting. -" 2017/04/30 by Yichao Zhou <broken.zhou AT gmail.com> -" (*) 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. -" -" }}} - -" 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. -" -" 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'. -" }}} - -" Only define the function once -if exists("b:did_indent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" Define global variable {{{ - -let b:did_indent = 1 - -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 !exists("g:tex_max_scan_line") - let g:tex_max_scan_line = 60 -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\|lstlisting' -endif "}}} - -" VIM Setting " {{{ -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() " {{{ - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - let cnum = v:lnum - - " Comment line is not what we need. - while lnum != 0 && getline(lnum) =~ '^\s*%' - let lnum = prevnonblank(lnum - 1) - endwhile - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - let line = substitute(getline(lnum), '\s*%.*', '','g') " last line - let cline = substitute(getline(v:lnum), '\s*%.*', '', 'g') " current line - - " We are in verbatim, so do what our user what. - if synIDattr(synID(v:lnum, indent(v:lnum), 1), "name") == "texZone" - if empty(cline) - return indent(lnum) - else - return indent(v:lnum) - end - endif - - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - let stay = 1 - - " New code for comment: retain the indent of current line - if cline =~ '^\s*%' - 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 - - if g:tex_indent_items - " Add another sw for item-environments - if line =~ g:tex_itemize_env - let ind = ind + shiftwidth() - let stay = 0 - endif - endif - endif - - if cline =~ '\\end{.*}' - let retn = s:GetEndIndentation(v:lnum) - if retn != -1 - return retn - endif - end - " Subtract a 'shiftwidth' when an environment ends - if cline =~ '\\end{.*}' - \ && cline !~ g:tex_noindent_env - \ && cline !~ '\\begin{.*}.*\\end{.*}' - if g:tex_indent_items - " Remove another sw for item-environments - if cline =~ g:tex_itemize_env - let ind = ind - shiftwidth() - let stay = 0 - endif - endif - - let ind = ind - shiftwidth() - let stay = 0 - endif - - if g:tex_indent_brace - if line =~ '[[{]$' - let ind += shiftwidth() - let stay = 0 - endif - - if cline =~ '^\s*\\\?[\]}]' && s:CheckPairedIsLastCharacter(v:lnum, indent(v:lnum)) - 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 - endif - endfor - endif - endif - - " Special treatment for 'item' - " ---------------------------- - - if g:tex_indent_items - " '\item' or '\bibitem' itself: - if cline =~ g:tex_items - let ind = ind - shiftwidth() - let stay = 0 - endif - " lines following to '\item' are intented once again: - if line =~ g:tex_items - let ind = ind + shiftwidth() - let stay = 0 - endif - endif - - if stay - " If there is no obvious indentation hint, we trust our user. - if empty(cline) - return ind - else - return max([indent(v:lnum), s:GetLastBeginIndentation(v:lnum)]) - endif - else - return ind - endif -endfunction "}}} - -function! s:GetLastBeginIndentation(lnum) " {{{ - let matchend = 1 - for lnum in range(a:lnum-1, max([a:lnum - g:tex_max_scan_line, 1]), -1) - let line = getline(lnum) - if line =~ '\\end{.*}' - let matchend += 1 - endif - if line =~ '\\begin{.*}' - 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 - return indent(lnum) + shiftwidth() - endif - endfor - return -1 -endfunction - -function! s:GetEndIndentation(lnum) " {{{ - if getline(a:lnum) =~ '\\begin{.*}.*\\end{.*}' - return -1 - endif - - let min_indent = 100 - let matchend = 1 - for lnum in range(a:lnum-1, max([a:lnum-g:tex_max_scan_line, 1]), -1) - let line = getline(lnum) - if line =~ '\\end{.*}' - let matchend += 1 - endif - if line =~ '\\begin{.*}' - let matchend -= 1 - endif - if matchend == 0 - return indent(lnum) - endif - if !empty(line) - let min_indent = min([min_indent, indent(lnum)]) - endif - endfor - return min_indent - shiftwidth() -endfunction - -" Most of the code is from matchparen.vim -function! s:CheckPairedIsLastCharacter(lnum, col) "{{{ - 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 plist = split(&matchpairs, '.\zs[:,]') - let i = index(plist, c) - if i < 0 - return 0 - endif - - " Figure out the arguments for searchpairpos(). - if i % 2 == 0 - let s_flags = 'nW' - let c2 = plist[i + 1] - else - let s_flags = 'nbW' - let c2 = c - let c = plist[i - 1] - endif - if c == '[' - let c = '\[' - let c2 = '\]' - endif - - " Find the match. When it was just before the cursor move it there for a - " moment. - let save_cursor = winsaveview() - call cursor(c_lnum, c_col) - - " When not in a string or comment ignore matches inside them. - " We match "escape" for special items, such as lispEscapeSpecial. - let s_skip ='synIDattr(synID(line("."), col("."), 0), "name") ' . - \ '=~? "string\\|character\\|singlequote\\|escape\\|comment"' - execute 'if' s_skip '| let s_skip = 0 | endif' - - let stopline = max([0, c_lnum - g:tex_max_scan_line]) - - " Limit the search time to 300 msec to avoid a hang on very long lines. - " This fails when a timeout is not supported. - try - let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 100) - catch /E118/ - endtry - - call winrestview(save_cursor) - - if m_lnum > 0 - let line = getline(m_lnum) - return strlen(line) == m_col - endif - - return 0 -endfunction "}}} - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim: set sw=4 textwidth=80: - -endif if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1 " LaTeX indent file (part of LaTeX Box) diff --git a/indent/tf.vim b/indent/tf.vim deleted file mode 100644 index 69bd783f..00000000 --- a/indent/tf.vim +++ /dev/null @@ -1,76 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: tf (TinyFugue) -" Maintainer: Christian J. Robinson <heptite@gmail.com> -" URL: http://www.vim.org/scripts/script.php?script_id=174 -" Last Change: 2017 Feb 25 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetTFIndent() -setlocal indentkeys-=0{,0} indentkeys-=0# indentkeys-=: -setlocal indentkeys+==/endif,=/then,=/else,=/done,0; - -" Only define the function once: -if exists("*GetTFIndent") - finish -endif - -function GetTFIndent() - " Find a non-blank line above the current line: - let lnum = prevnonblank(v:lnum - 1) - - " No indent for the start of the file: - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - let line = getline(lnum) - - " No indentation if the previous line didn't end with "\": - " (Could be annoying, but it lets you know if you made a mistake.) - if line !~ '\\$' - return 0 - endif - - if line =~ '\(/def.*\\\|/for.*\(%;\s*\)\@\<!\\\)$' - let ind = ind + shiftwidth() - elseif line =~ '\(/if\|/else\|/then\)' - if line !~ '/endif' - let ind = ind + shiftwidth() - endif - elseif line =~ '/while' - if line !~ '/done' - let ind = ind + shiftwidth() - endif - endif - - let line = getline(v:lnum) - - if line =~ '\(/else\|/endif\|/then\)' - if line !~ '/if' - let ind = ind - shiftwidth() - endif - elseif line =~ '/done' - if line !~ '/while' - let ind = ind - shiftwidth() - endif - endif - - " Comments at the beginning of a line: - if line =~ '^\s*;' - let ind = 0 - endif - - - return ind - -endfunction - -endif diff --git a/indent/tilde.vim b/indent/tilde.vim deleted file mode 100644 index 58e6723c..00000000 --- a/indent/tilde.vim +++ /dev/null @@ -1,40 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -"Description: Indent scheme for the tilde weblanguage -"Author: Tobias Rundström <tobi@tobi.nu> -"URL: http://tilde.tildesoftware.net -"Last Change: May 8 09:15:09 CEST 2002 - -if exists ("b:did_indent") - finish -endif - -let b:did_indent = 1 - -setlocal autoindent -setlocal indentexpr=GetTildeIndent(v:lnum) -setlocal indentkeys=o,O,) - -if exists("*GetTildeIndent") - finish -endif - -function GetTildeIndent(lnum) - let plnum = prevnonblank(v:lnum-1) - - if plnum == 0 - return 0 - endif - - if getline(v:lnum) =~ '^\s*\~\(endif\|else\|elseif\|end\)\>' - return indent(v:lnum) - shiftwidth() - endif - - if getline(plnum) =~ '^\s*\~\(if\|foreach\|foreach_row\|xml_loop\|file_loop\|file_write\|file_append\|imap_loopsections\|imap_index\|imap_list\|ldap_search\|post_loopall\|post_loop\|file_loop\|sql_loop_num\|sql_dbmsselect\|search\|sql_loop\|post\|for\|function_define\|silent\|while\|setvalbig\|mail_create\|systempipe\|mail_send\|dual\|elseif\|else\)\>' - return indent(plnum) + shiftwidth() - else - return -1 - endif -endfunction - -endif diff --git a/indent/treetop.vim b/indent/treetop.vim deleted file mode 100644 index 542aabb2..00000000 --- a/indent/treetop.vim +++ /dev/null @@ -1,42 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Treetop -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2011-03-14 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetTreetopIndent() -setlocal indentkeys=0{,0},!^F,o,O,=end -setlocal nosmartindent - -if exists("*GetTreetopIndent") - finish -endif - -function GetTreetopIndent() - let pnum = prevnonblank(v:lnum - 1) - if pnum == 0 - return 0 - endif - - let ind = indent(pnum) - let line = getline(pnum) - - if line =~ '^\s*\%(grammar\|module\|rule\)\>' - let ind += shiftwidth() - endif - - let line = getline(v:lnum) - if line =~ '^\s*end\>' - let ind -= shiftwidth() - end - - retur ind -endfunction - -endif diff --git a/indent/vb.vim b/indent/vb.vim deleted file mode 100644 index 853d8e38..00000000 --- a/indent/vb.vim +++ /dev/null @@ -1,82 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: VisualBasic (ft=vb) / Basic (ft=basic) / SaxBasic (ft=vb) -" Author: Johannes Zellner <johannes@zellner.org> -" Last Change: Fri, 18 Jun 2004 07:22:42 CEST -" Small update 2010 Jul 28 by Maxim Kim - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal autoindent -setlocal indentexpr=VbGetIndent(v:lnum) -setlocal indentkeys& -setlocal indentkeys+==~else,=~elseif,=~end,=~wend,=~case,=~next,=~select,=~loop,<:> - -let b:undo_indent = "set ai< indentexpr< indentkeys<" - -" Only define the function once. -if exists("*VbGetIndent") - finish -endif - -fun! VbGetIndent(lnum) - " labels and preprocessor get zero indent immediately - let this_line = getline(a:lnum) - let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)' - if this_line =~? LABELS_OR_PREPROC - return 0 - endif - - " Find a non-blank line above the current line. - " Skip over labels and preprocessor directives. - let lnum = a:lnum - while lnum > 0 - let lnum = prevnonblank(lnum - 1) - let previous_line = getline(lnum) - if previous_line !~? LABELS_OR_PREPROC - break - endif - endwhile - - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - - " Add - if previous_line =~? '^\s*\<\(begin\|\%(\%(private\|public\|friend\)\s\+\)\=\%(function\|sub\|property\)\|select\|case\|default\|if\|else\|elseif\|do\|for\|while\|enum\|with\)\>' - let ind = ind + shiftwidth() - endif - - " Subtract - if this_line =~? '^\s*\<end\>\s\+\<select\>' - if previous_line !~? '^\s*\<select\>' - let ind = ind - 2 * shiftwidth() - else - " this case is for an empty 'select' -- 'end select' - " (w/o any case statements) like: - " - " select case readwrite - " end select - let ind = ind - shiftwidth() - endif - elseif this_line =~? '^\s*\<\(end\|else\|elseif\|until\|loop\|next\|wend\)\>' - let ind = ind - shiftwidth() - elseif this_line =~? '^\s*\<\(case\|default\)\>' - if previous_line !~? '^\s*\<select\>' - let ind = ind - shiftwidth() - endif - endif - - return ind -endfun - -" vim:sw=4 - -endif diff --git a/indent/verilog.vim b/indent/verilog.vim deleted file mode 100644 index e8dd64a6..00000000 --- a/indent/verilog.vim +++ /dev/null @@ -1,233 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Language: Verilog HDL -" Maintainer: Chih-Tsun Huang <cthuang@cs.nthu.edu.tw> -" Last Change: 2017 Aug 25 by Chih-Tsun Huang -" URL: http://www.cs.nthu.edu.tw/~cthuang/vim/indent/verilog.vim -" -" Credits: -" Suggestions for improvement, bug reports by -" Takuya Fujiwara <tyru.exe@gmail.com> -" Thilo Six <debian@Xk2c.de> -" Leo Butlero <lbutler@brocade.com> -" -" Buffer Variables: -" b:verilog_indent_modules : indenting after the declaration -" of module blocks -" b:verilog_indent_width : indenting width -" b:verilog_indent_verbose : verbose to each indenting -" - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetVerilogIndent() -setlocal indentkeys=!^F,o,O,0),=begin,=end,=join,=endcase -setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify -setlocal indentkeys+==endconfig,=endgenerate,=endprimitive,=endtable -setlocal indentkeys+==`else,=`elsif,=`endif - -" Only define the function once. -if exists("*GetVerilogIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -function GetVerilogIndent() - - if exists('b:verilog_indent_width') - let offset = b:verilog_indent_width - else - let offset = shiftwidth() - endif - if exists('b:verilog_indent_modules') - let indent_modules = offset - else - let indent_modules = 0 - endif - - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - - let lnum2 = prevnonblank(lnum - 1) - let curr_line = getline(v:lnum) - let last_line = getline(lnum) - let last_line2 = getline(lnum2) - let ind = indent(lnum) - let ind2 = indent(lnum - 1) - let offset_comment1 = 1 - " Define the condition of an open statement - " Exclude the match of //, /* or */ - let vlog_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)' - " Define the condition when the statement ends with a one-line comment - let vlog_comment = '\(//.*\|/\*.*\*/\s*\)' - if exists('b:verilog_indent_verbose') - let vverb_str = 'INDENT VERBOSE:' - let vverb = 1 - else - let vverb = 0 - endif - - " Indent accoding to last line - " End of multiple-line comment - if last_line =~ '\*/\s*$' && last_line !~ '/\*.\{-}\*/' - let ind = ind - offset_comment1 - if vverb - echo vverb_str "De-indent after a multiple-line comment." - endif - - " Indent after if/else/for/case/always/initial/specify/fork blocks - " Note: We exclude '`if' or '`else' and consider 'end else' - " 'end if' is redundant here - elseif last_line =~ '^\s*\(end\)\=\s*`\@<!\<\(if\|else\)\>' || - \ last_line =~ '^\s*\<\(for\|case\%[[zx]]\)\>' || - \ last_line =~ '^\s*\<\(always\|initial\)\>' || - \ last_line =~ '^\s*\<\(specify\|fork\)\>' - if last_line !~ '\(;\|\<end\>\)\s*' . vlog_comment . '*$' || - \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$' - let ind = ind + offset - if vverb | echo vverb_str "Indent after a block statement." | endif - endif - " Indent after function/task/config/generate/primitive/table blocks - elseif last_line =~ '^\s*\<\(function\|task\|config\|generate\|primitive\|table\)\>' - if last_line !~ '\<end\>\s*' . vlog_comment . '*$' || - \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$' - let ind = ind + offset - if vverb - echo vverb_str "Indent after function/task block statement." - endif - endif - - " Indent after module/function/task/specify/fork blocks - elseif last_line =~ '^\s*\<module\>' - let ind = ind + indent_modules - if vverb && indent_modules - echo vverb_str "Indent after module statement." - endif - if last_line =~ '[(,]\s*' . vlog_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*[(,]\s*' . vlog_comment . '*$' - let ind = ind + offset - if vverb - echo vverb_str "Indent after a multiple-line module statement." - endif - endif - - " Indent after a 'begin' statement - elseif last_line =~ '\(\<begin\>\)\(\s*:\s*\w\+\)*' . vlog_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*\(\<begin\>\)' && - \ ( last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' || - \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . vlog_comment . '*$' ) - let ind = ind + offset - if vverb | echo vverb_str "Indent after begin statement." | endif - - " De-indent for the end of one-line block - elseif ( last_line !~ '\<begin\>' || - \ last_line =~ '\(//\|/\*\).*\<begin\>' ) && - \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>.*' . - \ vlog_comment . '*$' && - \ last_line2 !~ - \ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>' && - \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' && - \ ( last_line2 !~ '\<begin\>' || - \ last_line2 =~ '\(//\|/\*\).*\<begin\>' ) - let ind = ind - offset - if vverb - echo vverb_str "De-indent after the end of one-line statement." - endif - - " Multiple-line statement (including case statement) - " Open statement - " Ident the first open line - elseif last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*' . vlog_openstat . '\s*$' && - \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' - let ind = ind + offset - if vverb | echo vverb_str "Indent after an open statement." | endif - - " Close statement - " De-indent for an optional close parenthesis and a semicolon, and only - " if there exists precedent non-whitespace char - elseif last_line =~ ')*\s*;\s*' . vlog_comment . '*$' && - \ last_line !~ '^\s*)*\s*;\s*' . vlog_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . vlog_comment . '*$' && - \ ( last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' && - \ last_line2 !~ ';\s*//.*$') && - \ last_line2 !~ '^\s*' . vlog_comment . '$' - let ind = ind - offset - if vverb | echo vverb_str "De-indent after a close statement." | endif - - " `ifdef or `ifndef or `elsif or `else - elseif last_line =~ '^\s*`\<\(ifn\?def\|elsif\|else\)\>' - let ind = ind + offset - if vverb - echo vverb_str "Indent after a `ifdef or `ifndef or `elsif or `else statement." - endif - - endif - - " Re-indent current line - - " De-indent on the end of the block - " join/end/endcase/endfunction/endtask/endspecify - if curr_line =~ '^\s*\<\(join\|end\|endcase\)\>' || - \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\)\>' || - \ curr_line =~ '^\s*\<\(endconfig\|endgenerate\|endprimitive\|endtable\)\>' - let ind = ind - offset - if vverb | echo vverb_str "De-indent the end of a block." | endif - elseif curr_line =~ '^\s*\<endmodule\>' - let ind = ind - indent_modules - if vverb && indent_modules - echo vverb_str "De-indent the end of a module." - endif - - " De-indent on a stand-alone 'begin' - elseif curr_line =~ '^\s*\<begin\>' - if last_line !~ '^\s*\<\(function\|task\|specify\|module\|config\|generate\|primitive\|table\)\>' && - \ last_line !~ '^\s*\()*\s*;\|)\+\)\s*' . vlog_comment . '*$' && - \ ( last_line =~ - \ '\<\(`\@<!if\|`\@<!else\|for\|case\%[[zx]]\|always\|initial\)\>' || - \ last_line =~ ')\s*' . vlog_comment . '*$' || - \ last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' ) - let ind = ind - offset - if vverb - echo vverb_str "De-indent a stand alone begin statement." - endif - endif - - " De-indent after the end of multiple-line statement - elseif curr_line =~ '^\s*)' && - \ ( last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' || - \ last_line !~ vlog_openstat . '\s*' . vlog_comment . '*$' && - \ last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' ) - let ind = ind - offset - if vverb - echo vverb_str "De-indent the end of a multiple statement." - endif - - " De-indent `elsif or `else or `endif - elseif curr_line =~ '^\s*`\<\(elsif\|else\|endif\)\>' - let ind = ind - offset - if vverb | echo vverb_str "De-indent `elsif or `else or `endif statement." | endif - - endif - - " Return the indention - return ind -endfunction - -let &cpo = s:cpo_save -unlet s:cpo_save - -" vim:sw=2 - -endif diff --git a/indent/vhdl.vim b/indent/vhdl.vim deleted file mode 100644 index 1b2ff817..00000000 --- a/indent/vhdl.vim +++ /dev/null @@ -1,438 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" VHDL indent ('93 syntax) -" Language: VHDL -" Maintainer: Gerald Lai <laigera+vim?gmail.com> -" Version: 1.60 -" Last Change: 2017 Jun 13 -" URL: http://www.vim.org/scripts/script.php?script_id=1450 - -" only load this indent file when no other was loaded -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -" setup indent options for local VHDL buffer -setlocal indentexpr=GetVHDLindent() -setlocal indentkeys=!^F,o,O,0(,0) -setlocal indentkeys+==~begin,=~end\ ,=~end\ ,=~is,=~select,=~when -setlocal indentkeys+==~if,=~then,=~elsif,=~else -setlocal indentkeys+==~case,=~loop,=~for,=~generate,=~record,=~units,=~process,=~block,=~function,=~component,=~procedure -setlocal indentkeys+==~architecture,=~configuration,=~entity,=~package - -" constants -" not a comment -let s:NC = '\%(--.*\)\@<!' -" end of string -let s:ES = '\s*\%(--.*\)\=$' -" no "end" keyword in front -let s:NE = '\%(\<end\s\+\)\@<!' - -" option to disable alignment of generic/port mappings -if !exists("g:vhdl_indent_genportmap") - let g:vhdl_indent_genportmap = 1 -endif - -" option to disable alignment of right-hand side assignment "<=" statements -if !exists("g:vhdl_indent_rhsassign") - let g:vhdl_indent_rhsassign = 1 -endif - -" only define indent function once -if exists("*GetVHDLindent") - finish -endif - -function GetVHDLindent() - " store current line & string - let curn = v:lnum - let curs = getline(curn) - - " find previous line that is not a comment - let prevn = prevnonblank(curn - 1) - let prevs = getline(prevn) - while prevn > 0 && prevs =~ '^\s*--' - let prevn = prevnonblank(prevn - 1) - let prevs = getline(prevn) - endwhile - let prevs_noi = substitute(prevs, '^\s*', '', '') - - " default indent starts as previous non-comment line's indent - let ind = prevn > 0 ? indent(prevn) : 0 - " backup default - let ind2 = ind - - " indent: special; kill string so it would not affect other filters - " keywords: "report" + string - " where: anywhere in current or previous line - let s0 = s:NC.'\<report\>\s*".*"' - if curs =~? s0 - let curs = "" - endif - if prevs =~? s0 - let prevs = "" - endif - - " indent: previous line's comment position, otherwise follow next non-comment line if possible - " keyword: "--" - " where: start of current line - if curs =~ '^\s*--' - let pn = curn - 1 - let ps = getline(pn) - if curs =~ '^\s*--\s' && ps =~ '--' - return indent(pn) + stridx(substitute(ps, '^\s*', '', ''), '--') - else - " find nextnonblank line that is not a comment - let nn = nextnonblank(curn + 1) - let ns = getline(nn) - while nn > 0 && ns =~ '^\s*--' - let nn = nextnonblank(nn + 1) - let ns = getline(nn) - endwhile - let n = indent(nn) - return n != -1 ? n : ind - endif - endif - - " **************************************************************************************** - " indent: align generic variables & port names - " keywords: "procedure" + name, "generic", "map", "port" + "(", provided current line is part of mapping - " where: anywhere in previous 2 lines - " find following previous non-comment line - let pn = prevnonblank(prevn - 1) - let ps = getline(pn) - while pn > 0 && ps =~ '^\s*--' - let pn = prevnonblank(pn - 1) - let ps = getline(pn) - endwhile - if (curs =~ '^\s*)' || curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*\((.*)\)*\s*\%(=>\s*\S\+\|:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\s\+\)\)') && (prevs =~? s:NC.'\<\%(procedure\s\+\S\+\|generic\|map\|port\)\s*(\%(\s*\w\)\=' || (ps =~? s:NC.'\<\%(procedure\|generic\|map\|port\)'.s:ES && prevs =~ '^\s*(')) - " align closing ")" with opening "(" - if curs =~ '^\s*)' - return ind2 + stridx(prevs_noi, '(') - endif - let m = matchend(prevs_noi, '(\s*\ze\w') - if m != -1 - return ind2 + m - else - if g:vhdl_indent_genportmap - return ind2 + stridx(prevs_noi, '(') + shiftwidth() - else - return ind2 + shiftwidth() - endif - endif - endif - - " indent: align conditional/select statement - " keywords: variable + "<=" without ";" ending - " where: start of previous line - if prevs =~? '^\s*\S\+\s*<=[^;]*'.s:ES - if g:vhdl_indent_rhsassign - return ind2 + matchend(prevs_noi, '<=\s*\ze.') - else - return ind2 + shiftwidth() - endif - endif - - " indent: backtrace previous non-comment lines for next smaller or equal size indent - " keywords: "end" + "record", "units" - " where: start of previous line - " keyword: ")" - " where: start of previous line - " keyword: without "<=" + ";" ending - " where: anywhere in previous line - " keyword: "=>" + ")" ending, provided current line does not begin with ")" - " where: anywhere in previous line - " _note_: indent allowed to leave this filter - let m = 0 - if prevs =~? '^\s*end\s\+\%(record\|units\)\>' - let m = 3 - elseif prevs =~ '^\s*)' - let m = 1 - elseif prevs =~ s:NC.'\%(<=.*\)\@<!;'.s:ES || (curs !~ '^\s*)' && prevs =~ s:NC.'=>.*'.s:NC.')'.s:ES) - let m = 2 - endif - - if m > 0 - let pn = prevnonblank(prevn - 1) - let ps = getline(pn) - while pn > 0 - let t = indent(pn) - if ps !~ '^\s*--' && (t < ind || (t == ind && m == 3)) - " make sure one of these is true - " keywords: variable + "<=" without ";" ending - " where: start of previous non-comment line - " keywords: "procedure", "generic", "map", "port" - " where: anywhere in previous non-comment line - " keyword: "(" - " where: start of previous non-comment line - if m < 3 && ps !~? '^\s*\S\+\s*<=[^;]*'.s:ES - if ps =~? s:NC.'\<\%(procedure\|generic\|map\|port\)\>' || ps =~ '^\s*(' - let ind = t - endif - break - endif - let ind = t - if m > 1 - " find following previous non-comment line - let ppn = prevnonblank(pn - 1) - let pps = getline(ppn) - while ppn > 0 && pps =~ '^\s*--' - let ppn = prevnonblank(ppn - 1) - let pps = getline(ppn) - endwhile - " indent: follow - " keyword: "select" - " where: end of following previous non-comment line - " keyword: "type" - " where: start of following previous non-comment line - if m == 2 - let s1 = s:NC.'\<select'.s:ES - if ps !~? s1 && pps =~? s1 - let ind = indent(ppn) - endif - elseif m == 3 - let s1 = '^\s*type\>' - if ps !~? s1 && pps =~? s1 - let ind = indent(ppn) - endif - endif - endif - break - endif - let pn = prevnonblank(pn - 1) - let ps = getline(pn) - endwhile - endif - - " indent: follow indent of previous opening statement, otherwise -sw - " keyword: "begin" - " where: anywhere in current line - if curs =~? s:NC.'\<begin\>' - " find previous opening statement of - " keywords: "architecture", "block", "entity", "function", "generate", "procedure", "process" - let s2 = s:NC.s:NE.'\<\%(architecture\|block\|entity\|function\|generate\|procedure\|process\)\>' - - let pn = prevnonblank(curn - 1) - let ps = getline(pn) - while pn > 0 && (ps =~ '^\s*--' || ps !~? s2) - let pn = prevnonblank(pn - 1) - let ps = getline(pn) - - if (ps =~? s:NC.'\<begin\>') - return indent(pn) - shiftwidth() - endif - endwhile - - if (pn == 0) - return ind - shiftwidth() - else - return indent(pn) - endif - endif - - " indent: +sw if previous line is previous opening statement - " keywords: "record", "units" - " where: anywhere in current line - if curs =~? s:NC.s:NE.'\<\%(record\|units\)\>' - " find previous opening statement of - " keyword: "type" - let s3 = s:NC.s:NE.'\<type\>' - if curs !~? s3.'.*'.s:NC.'\<\%(record\|units\)\>.*'.s:ES && prevs =~? s3 - let ind = ind + shiftwidth() - endif - return ind - endif - - " **************************************************************************************** - " indent: 0 - " keywords: "architecture", "configuration", "entity", "library", "package" - " where: start of current line - if curs =~? '^\s*\%(architecture\|configuration\|entity\|library\|package\)\>' - return 0 - endif - - " indent: maintain indent of previous opening statement - " keyword: "is" - " where: start of current line - " find previous opening statement of - " keywords: "architecture", "block", "configuration", "entity", "function", "package", "procedure", "process", "type" - if curs =~? '^\s*\<is\>' && prevs =~? s:NC.s:NE.'\<\%(architecture\|block\|configuration\|entity\|function\|package\|procedure\|process\|type\)\>' - return ind2 - endif - - " indent: maintain indent of previous opening statement - " keyword: "then" - " where: start of current line - " find previous opening statement of - " keywords: "elsif", "if" - if curs =~? '^\s*\<then\>' && prevs =~? s:NC.'\%(\<elsif\>\|'.s:NE.'\<if\>\)' - return ind2 - endif - - " indent: maintain indent of previous opening statement - " keyword: "generate" - " where: start of current line - " find previous opening statement of - " keywords: "for", "if" - if curs =~? '^\s*\<generate\>' && prevs =~? s:NC.s:NE.'\%(\%(\<wait\s\+\)\@<!\<for\|\<if\)\>' - return ind2 - endif - - " indent: +sw - " keywords: "block", "process" - " removed: "begin", "case", "elsif", "if", "loop", "record", "units", "while" - " where: anywhere in previous line - if prevs =~? s:NC.s:NE.'\<\%(block\|process\)\>' - return ind + shiftwidth() - endif - - " indent: +sw - " keywords: "architecture", "configuration", "entity", "package" - " removed: "component", "for", "when", "with" - " where: start of previous line - if prevs =~? '^\s*\%(architecture\|configuration\|entity\|package\)\>' - return ind + shiftwidth() - endif - - " indent: +sw - " keyword: "select" - " removed: "generate", "is", "=>" - " where: end of previous line - if prevs =~? s:NC.'\<select'.s:ES - return ind + shiftwidth() - endif - - " indent: +sw - " keyword: "begin", "loop", "record", "units" - " where: anywhere in previous line - " keyword: "component", "else", "for" - " where: start of previous line - " keyword: "generate", "is", "then", "=>" - " where: end of previous line - " _note_: indent allowed to leave this filter - if prevs =~? s:NC.'\%(\<begin\>\|'.s:NE.'\<\%(loop\|record\|units\)\>\)' || prevs =~? '^\s*\%(component\|else\|for\)\>' || prevs =~? s:NC.'\%('.s:NE.'\<generate\|\<\%(is\|then\)\|=>\)'.s:ES - let ind = ind + shiftwidth() - endif - - " **************************************************************************************** - " indent: -sw - " keywords: "when", provided previous line does not begin with "when", does not end with "is" - " where: start of current line - let s4 = '^\s*when\>' - if curs =~? s4 - if prevs =~? s:NC.'\<is'.s:ES - return ind - elseif prevs !~? s4 - return ind - shiftwidth() - else - return ind2 - endif - endif - - " indent: -sw - " keywords: "else", "elsif", "end" + "block", "for", "function", "generate", "if", "loop", "procedure", "process", "record", "units" - " where: start of current line - let s5 = 'block\|for\|function\|generate\|if\|loop\|procedure\|process\|record\|units' - if curs =~? '^\s*\%(else\|elsif\|end\s\+\%('.s5.'\)\)\>' - if prevs =~? '^\s*\%(elsif\|'.s5.'\)' - return ind - else - return ind - shiftwidth() - endif - endif - - " indent: backtrace previous non-comment lines - " keyword: "end" + "case", "component" - " where: start of current line - let m = 0 - if curs =~? '^\s*end\s\+case\>' - let m = 1 - elseif curs =~? '^\s*end\s\+component\>' - let m = 2 - endif - - if m > 0 - " find following previous non-comment line - let pn = prevn - let ps = getline(pn) - while pn > 0 - if ps !~ '^\s*--' - "indent: -2sw - "keywords: "end" + "case" - "where: start of previous non-comment line - "indent: -sw - "keywords: "when" - "where: start of previous non-comment line - "indent: follow - "keywords: "case" - "where: start of previous non-comment line - if m == 1 - if ps =~? '^\s*end\s\+case\>' - return indent(pn) - 2 * shiftwidth() - elseif ps =~? '^\s*when\>' - return indent(pn) - shiftwidth() - elseif ps =~? '^\s*case\>' - return indent(pn) - endif - "indent: follow - "keyword: "component" - "where: start of previous non-comment line - elseif m == 2 - if ps =~? '^\s*component\>' - return indent(pn) - endif - endif - endif - let pn = prevnonblank(pn - 1) - let ps = getline(pn) - endwhile - return ind - shiftwidth() - endif - - " indent: -sw - " keyword: ")" - " where: start of current line - if curs =~ '^\s*)' - return ind - shiftwidth() - endif - - " indent: 0 - " keywords: "end" + "architecture", "configuration", "entity", "package" - " where: start of current line - if curs =~? '^\s*end\s\+\%(architecture\|configuration\|entity\|package\)\>' - return 0 - endif - - " indent: -sw - " keywords: "end" + identifier, ";" - " where: start of current line - "if curs =~? '^\s*end\s\+\w\+\>' - if curs =~? '^\s*end\%(\s\|;'.s:ES.'\)' - return ind - shiftwidth() - endif - - " **************************************************************************************** - " indent: maintain indent of previous opening statement - " keywords: without "procedure", "generic", "map", "port" + ":" but not ":=" + eventually ;$ - " where: start of current line - if curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=].*;.*$' - return ind2 - endif - " **************************************************************************************** - " indent: maintain indent of previous opening statement, corner case which - " does not end in ;, but is part of a mapping - " keywords: without "procedure", "generic", "map", "port" + ":" but not ":=", never + ;$ and - " prevline without "procedure", "generic", "map", "port" + ":" but not ":=" + eventually ;$ - " where: start of current line - if curs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=].*[^;].*$' - if prevs =~? '^\s*\%(\<\%(procedure\|generic\|map\|port\)\>.*\)\@<!\w\+\s*\w*\s*:[^=].*;.*$' - return ind2 - endif - endif - - " return leftover filtered indent - return ind -endfunction - -endif diff --git a/indent/vim.vim b/indent/vim.vim deleted file mode 100644 index e39e4dc5..00000000 --- a/indent/vim.vim +++ /dev/null @@ -1,106 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Vim script -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2016 Jun 27 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetVimIndent() -setlocal indentkeys+==end,=else,=cat,=fina,=END,0\\ - -let b:undo_indent = "setl indentkeys< indentexpr<" - -" Only define the function once. -if exists("*GetVimIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -function GetVimIndent() - let ignorecase_save = &ignorecase - try - let &ignorecase = 0 - return GetVimIndentIntern() - finally - let &ignorecase = ignorecase_save - endtry -endfunc - -function GetVimIndentIntern() - " Find a non-blank line above the current line. - let lnum = prevnonblank(v:lnum - 1) - - " If the current line doesn't start with '\' and below a line that starts - " with '\', use the indent of the line above it. - let cur_text = getline(v:lnum) - if cur_text !~ '^\s*\\' - while lnum > 0 && getline(lnum) =~ '^\s*\\' - let lnum = lnum - 1 - endwhile - endif - - " At the start of the file use zero indent. - if lnum == 0 - return 0 - endif - let prev_text = getline(lnum) - - " Add a 'shiftwidth' after :if, :while, :try, :catch, :finally, :function - " and :else. Add it three times for a line that starts with '\' after - " a line that doesn't (or g:vim_indent_cont if it exists). - let ind = indent(lnum) - if cur_text =~ '^\s*\\' && v:lnum > 1 && prev_text !~ '^\s*\\' - if exists("g:vim_indent_cont") - let ind = ind + g:vim_indent_cont - else - let ind = ind + shiftwidth() * 3 - endif - elseif prev_text =~ '^\s*aug\%[roup]\s\+' && prev_text !~ '^\s*aug\%[roup]\s\+[eE][nN][dD]\>' - let ind = ind + shiftwidth() - else - " A line starting with :au does not increment/decrement indent. - if prev_text !~ '^\s*au\%[tocmd]' - let i = match(prev_text, '\(^\||\)\s*\(if\|wh\%[ile]\|for\|try\|cat\%[ch]\|fina\%[lly]\|fu\%[nction]\|el\%[seif]\)\>') - if i >= 0 - let ind += shiftwidth() - if strpart(prev_text, i, 1) == '|' && has('syntax_items') - \ && synIDattr(synID(lnum, i, 1), "name") =~ '\(Comment\|String\)$' - let ind -= shiftwidth() - endif - endif - endif - endif - - " If the previous line contains an "end" after a pipe, but not in an ":au" - " command. And not when there is a backslash before the pipe. - " And when syntax HL is enabled avoid a match inside a string. - let i = match(prev_text, '[^\\]|\s*\(ene\@!\)') - if i > 0 && prev_text !~ '^\s*au\%[tocmd]' - if !has('syntax_items') || synIDattr(synID(lnum, i + 2, 1), "name") !~ '\(Comment\|String\)$' - let ind = ind - shiftwidth() - endif - endif - - - " Subtract a 'shiftwidth' on a :endif, :endwhile, :catch, :finally, :endtry, - " :endfun, :else and :augroup END. - if cur_text =~ '^\s*\(ene\@!\|cat\|fina\|el\|aug\%[roup]\s\+[eE][nN][dD]\)' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:sw=2 - -endif diff --git a/indent/vroom.vim b/indent/vroom.vim deleted file mode 100644 index 29188466..00000000 --- a/indent/vroom.vim +++ /dev/null @@ -1,25 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Vroom (vim testing and executable documentation) -" Maintainer: David Barnett (https://github.com/google/vim-ft-vroom) -" Last Change: 2014 Jul 23 - -if exists('b:did_indent') - finish -endif -let b:did_indent = 1 - -let s:cpo_save = &cpo -set cpo-=C - - -let b:undo_indent = 'setlocal autoindent<' - -setlocal autoindent - - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif diff --git a/indent/xf86conf.vim b/indent/xf86conf.vim deleted file mode 100644 index f45a828c..00000000 --- a/indent/xf86conf.vim +++ /dev/null @@ -1,41 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: XFree86 Configuration File -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetXF86ConfIndent() -setlocal indentkeys=!^F,o,O,=End -setlocal nosmartindent - -if exists("*GetXF86ConfIndent") - finish -endif - -function GetXF86ConfIndent() - let lnum = prevnonblank(v:lnum - 1) - - if lnum == 0 - return 0 - endif - - let ind = indent(lnum) - - if getline(lnum) =~? '^\s*\(Sub\)\=Section\>' - let ind = ind + shiftwidth() - endif - - if getline(v:lnum) =~? '^\s*End\(Sub\)\=Section\>' - let ind = ind - shiftwidth() - endif - - return ind -endfunction - -endif diff --git a/indent/xhtml.vim b/indent/xhtml.vim deleted file mode 100644 index 28d4056f..00000000 --- a/indent/xhtml.vim +++ /dev/null @@ -1,16 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: XHTML -" Maintainer: Bram Moolenaar <Bram@vim.org> (for now) -" Last Change: 2005 Jun 24 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Handled like HTML for now. -runtime! indent/html.vim - -endif diff --git a/indent/xinetd.vim b/indent/xinetd.vim deleted file mode 100644 index e290638e..00000000 --- a/indent/xinetd.vim +++ /dev/null @@ -1,59 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: xinetd.conf(5) configuration file -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal indentexpr=GetXinetdIndent() -setlocal indentkeys=0{,0},!^F,o,O -setlocal nosmartindent - -if exists("*GetXinetdIndent") - finish -endif -let s:keepcpo= &cpo -set cpo&vim - -function s:count_braces(lnum, count_open) - let n_open = 0 - let n_close = 0 - let line = getline(a:lnum) - let pattern = '[{}]' - let i = match(line, pattern) - while i != -1 - if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'ld\%(Comment\|String\)' - if line[i] == '{' - let n_open += 1 - elseif line[i] == '}' - if n_open > 0 - let n_open -= 1 - else - let n_close += 1 - endif - endif - endif - let i = match(line, pattern, i + 1) - endwhile - return a:count_open ? n_open : n_close -endfunction - -function GetXinetdIndent() - let pnum = prevnonblank(v:lnum - 1) - if pnum == 0 - return 0 - endif - - return indent(pnum) + s:count_braces(pnum, 1) * shiftwidth() - \ - s:count_braces(v:lnum, 0) * shiftwidth() -endfunction - -let &cpo = s:keepcpo -unlet s:keepcpo - -endif diff --git a/indent/xml.vim b/indent/xml.vim deleted file mode 100644 index cdd0ed9d..00000000 --- a/indent/xml.vim +++ /dev/null @@ -1,111 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Language: xml -" Maintainer: Johannes Zellner <johannes@zellner.org> -" Last Change: 2017 Jun 13 -" Notes: 1) does not indent pure non-xml code (e.g. embedded scripts) -" 2) will be confused by unbalanced tags in comments -" or CDATA sections. -" 2009-05-26 patch by Nikolai Weibull -" TODO: implement pre-like tags, see xml_indent_open / xml_indent_close - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 -let s:keepcpo= &cpo -set cpo&vim - -" [-- local settings (must come before aborting the script) --] -setlocal indentexpr=XmlIndentGet(v:lnum,1) -setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,} - -if !exists('b:xml_indent_open') - let b:xml_indent_open = '.\{-}<\a' - " pre tag, e.g. <address> - " let b:xml_indent_open = '.\{-}<[/]\@!\(address\)\@!' -endif - -if !exists('b:xml_indent_close') - let b:xml_indent_close = '.\{-}</' - " end pre tag, e.g. </address> - " let b:xml_indent_close = '.\{-}</\(address\)\@!' -endif - -let &cpo = s:keepcpo -unlet s:keepcpo - -" [-- finish, if the function already exists --] -if exists('*XmlIndentGet') - finish -endif - -let s:keepcpo= &cpo -set cpo&vim - -fun! <SID>XmlIndentWithPattern(line, pat) - let s = substitute('x'.a:line, a:pat, "\1", 'g') - return strlen(substitute(s, "[^\1].*$", '', '')) -endfun - -" [-- check if it's xml --] -fun! <SID>XmlIndentSynCheck(lnum) - if '' != &syntax - let syn1 = synIDattr(synID(a:lnum, 1, 1), 'name') - let syn2 = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name') - if '' != syn1 && syn1 !~ 'xml' && '' != syn2 && syn2 !~ 'xml' - " don't indent pure non-xml code - return 0 - elseif syn1 =~ '^xmlComment' && syn2 =~ '^xmlComment' - " indent comments specially - return -1 - endif - endif - return 1 -endfun - -" [-- return the sum of indents of a:lnum --] -fun! <SID>XmlIndentSum(lnum, style, add) - let line = getline(a:lnum) - if a:style == match(line, '^\s*</') - return (shiftwidth() * - \ (<SID>XmlIndentWithPattern(line, b:xml_indent_open) - \ - <SID>XmlIndentWithPattern(line, b:xml_indent_close) - \ - <SID>XmlIndentWithPattern(line, '.\{-}/>'))) + a:add - else - return a:add - endif -endfun - -fun! XmlIndentGet(lnum, use_syntax_check) - " Find a non-empty line above the current line. - let lnum = prevnonblank(a:lnum - 1) - - " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 - endif - - if a:use_syntax_check - let check_lnum = <SID>XmlIndentSynCheck(lnum) - let check_alnum = <SID>XmlIndentSynCheck(a:lnum) - if 0 == check_lnum || 0 == check_alnum - return indent(a:lnum) - elseif -1 == check_lnum || -1 == check_alnum - return -1 - endif - endif - - let ind = <SID>XmlIndentSum(lnum, -1, indent(lnum)) - let ind = <SID>XmlIndentSum(a:lnum, 0, ind) - - return ind -endfun - -let &cpo = s:keepcpo -unlet s:keepcpo - -" vim:ts=8 - -endif diff --git a/indent/xsd.vim b/indent/xsd.vim deleted file mode 100644 index e4a41996..00000000 --- a/indent/xsd.vim +++ /dev/null @@ -1,17 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: .xsd files (XML Schema) -" Maintainer: Nobody -" Last Change: 2005 Jun 09 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Use XML formatting rules -runtime! indent/xml.vim - - -endif diff --git a/indent/xslt.vim b/indent/xslt.vim deleted file mode 100644 index 03f32790..00000000 --- a/indent/xslt.vim +++ /dev/null @@ -1,17 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: XSLT .xslt files -" Maintainer: David Fishburn <fishburn@ianywhere.com> -" Last Change: Wed May 14 2003 8:48:41 PM - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -" Use XML formatting rules -runtime! indent/xml.vim - - -endif diff --git a/indent/yacc.vim b/indent/yacc.vim deleted file mode 100644 index 3055f31f..00000000 --- a/indent/yacc.vim +++ /dev/null @@ -1,45 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: YACC input file -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2006-12-20 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif - -let b:did_indent = 1 - -setlocal indentexpr=GetYaccIndent() -setlocal indentkeys=!^F,o,O -setlocal nosmartindent - -" Only define the function once. -if exists("*GetYaccIndent") - finish -endif - -function GetYaccIndent() - if v:lnum == 1 - return 0 - endif - - let ind = indent(v:lnum - 1) - let line = getline(v:lnum - 1) - - if line == '' - let ind = 0 - elseif line =~ '^\w\+\s*:' - let ind = ind + matchend(line, '^\w\+\s*') - elseif line =~ '^\s*;' - let ind = 0 - else - let ind = indent(v:lnum) - endif - - return ind -endfunction - -endif diff --git a/indent/yaml.vim b/indent/yaml.vim deleted file mode 100644 index d7b8db59..00000000 --- a/indent/yaml.vim +++ /dev/null @@ -1,159 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: YAML -" Maintainer: Nikolai Pavlov <zyx.vim@gmail.com> -" Last Change: 2017 Jun 13 - -" Only load this indent file when no other was loaded. -if exists('b:did_indent') - finish -endif - -let s:save_cpo = &cpo -set cpo&vim - -let b:did_indent = 1 - -setlocal indentexpr=GetYAMLIndent(v:lnum) -setlocal indentkeys=!^F,o,O,0#,0},0],<:>,0- -setlocal nosmartindent - -let b:undo_indent = 'setlocal indentexpr< indentkeys< smartindent<' - -" Only define the function once. -if exists('*GetYAMLIndent') - finish -endif - -function s:FindPrevLessIndentedLine(lnum, ...) - let prevlnum = prevnonblank(a:lnum-1) - let curindent = a:0 ? a:1 : indent(a:lnum) - while prevlnum - \&& indent(prevlnum) >= curindent - \&& getline(prevlnum) =~# '^\s*#' - let prevlnum = prevnonblank(prevlnum-1) - endwhile - return prevlnum -endfunction - -function s:FindPrevLEIndentedLineMatchingRegex(lnum, regex) - let plilnum = s:FindPrevLessIndentedLine(a:lnum, indent(a:lnum)+1) - while plilnum && getline(plilnum) !~# a:regex - let plilnum = s:FindPrevLessIndentedLine(plilnum) - endwhile - return plilnum -endfunction - -let s:mapkeyregex='\v^\s*\#@!\S@=%(\''%([^'']|\''\'')*\'''. - \ '|\"%([^"\\]|\\.)*\"'. - \ '|%(%(\:\ )@!.)*)\:%(\ |$)' -let s:liststartregex='\v^\s*%(\-%(\ |$))' - -let s:c_ns_anchor_char = '\v%([\n\r\uFEFF \t,[\]{}]@!\p)' -let s:c_ns_anchor_name = s:c_ns_anchor_char.'+' -let s:c_ns_anchor_property = '\v\&'.s:c_ns_anchor_name - -let s:ns_word_char = '\v[[:alnum:]_\-]' -let s:ns_tag_char = '\v%(%\x\x|'.s:ns_word_char.'|[#/;?:@&=+$.~*''()])' -let s:c_named_tag_handle = '\v\!'.s:ns_word_char.'+\!' -let s:c_secondary_tag_handle = '\v\!\!' -let s:c_primary_tag_handle = '\v\!' -let s:c_tag_handle = '\v%('.s:c_named_tag_handle. - \ '|'.s:c_secondary_tag_handle. - \ '|'.s:c_primary_tag_handle.')' -let s:c_ns_shorthand_tag = '\v'.s:c_tag_handle . s:ns_tag_char.'+' -let s:c_non_specific_tag = '\v\!' -let s:ns_uri_char = '\v%(%\x\x|'.s:ns_word_char.'\v|[#/;?:@&=+$,.!~*''()[\]])' -let s:c_verbatim_tag = '\v\!\<'.s:ns_uri_char.'+\>' -let s:c_ns_tag_property = '\v'.s:c_verbatim_tag. - \ '\v|'.s:c_ns_shorthand_tag. - \ '\v|'.s:c_non_specific_tag - -let s:block_scalar_header = '\v[|>]%([+-]?[1-9]|[1-9]?[+-])?' - -function GetYAMLIndent(lnum) - if a:lnum == 1 || !prevnonblank(a:lnum-1) - return 0 - endif - - let prevlnum = prevnonblank(a:lnum-1) - let previndent = indent(prevlnum) - - let line = getline(a:lnum) - if line =~# '^\s*#' && getline(a:lnum-1) =~# '^\s*#' - " Comment blocks should have identical indent - return previndent - elseif line =~# '^\s*[\]}]' - " Lines containing only closing braces should have previous indent - return indent(s:FindPrevLessIndentedLine(a:lnum)) - endif - - " Ignore comment lines when calculating indent - while getline(prevlnum) =~# '^\s*#' - let prevlnum = prevnonblank(prevlnum-1) - if !prevlnum - return previndent - endif - endwhile - - let prevline = getline(prevlnum) - let previndent = indent(prevlnum) - - " Any examples below assume that shiftwidth=2 - if prevline =~# '\v[{[:]$|[:-]\ [|>][+\-]?%(\s+\#.*|\s*)$' - " Mapping key: - " nested mapping: ... - " - " - { - " key: [ - " list value - " ] - " } - " - " - |- - " Block scalar without indentation indicator - return previndent+shiftwidth() - elseif prevline =~# '\v[:-]\ [|>]%(\d+[+\-]?|[+\-]?\d+)%(\#.*|\s*)$' - " - |+2 - " block scalar with indentation indicator - "#^^ indent+2, not indent+shiftwidth - return previndent + str2nr(matchstr(prevline, - \'\v([:-]\ [|>])@<=[+\-]?\d+%([+\-]?%(\s+\#.*|\s*)$)@=')) - elseif prevline =~# '\v\"%([^"\\]|\\.)*\\$' - " "Multiline string \ - " with escaped end" - let qidx = match(prevline, '\v\"%([^"\\]|\\.)*\\') - return virtcol([prevlnum, qidx+1]) - elseif line =~# s:liststartregex - " List line should have indent equal to previous list line unless it was - " caught by one of the previous rules - return indent(s:FindPrevLEIndentedLineMatchingRegex(a:lnum, - \ s:liststartregex)) - elseif line =~# s:mapkeyregex - " Same for line containing mapping key - let prevmapline = s:FindPrevLEIndentedLineMatchingRegex(a:lnum, - \ s:mapkeyregex) - if getline(prevmapline) =~# '^\s*- ' - return indent(prevmapline) + 2 - else - return indent(prevmapline) - endif - elseif prevline =~# '^\s*- ' - " - List with - " multiline scalar - return previndent+2 - elseif prevline =~# s:mapkeyregex . '\v\s*%(%('.s:c_ns_tag_property. - \ '\v|'.s:c_ns_anchor_property. - \ '\v|'.s:block_scalar_header. - \ '\v)%(\s+|\s*%(\#.*)?$))*' - " Mapping with: value - " that is multiline scalar - return previndent+shiftwidth() - endif - return previndent -endfunction - -let &cpo = s:save_cpo - -endif diff --git a/indent/zimbu.vim b/indent/zimbu.vim deleted file mode 100644 index 85883ca7..00000000 --- a/indent/zimbu.vim +++ /dev/null @@ -1,132 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Zimbu -" Maintainer: Bram Moolenaar <Bram@vim.org> -" Last Change: 2016 Jan 25 - -" Only load this indent file when no other was loaded. -if exists("b:did_indent") - finish -endif -let b:did_indent = 1 - -setlocal ai nolisp nocin -setlocal indentexpr=GetZimbuIndent(v:lnum) -setlocal indentkeys=0{,0},!^F,o,O,0=ELSE,0=ELSEIF,0=CASE,0=DEFAULT,0=FINALLY - -" We impose recommended defaults: no Tabs, 'shiftwidth' = 2 -setlocal sw=2 et - -let b:undo_indent = "setl et< sw< ai< indentkeys< indentexpr=" - -" Only define the function once. -if exists("*GetZimbuIndent") - finish -endif - -let s:cpo_save = &cpo -set cpo&vim - -" Come here when loading the script the first time. - -let s:maxoff = 50 " maximum number of lines to look backwards for () - -func GetZimbuIndent(lnum) - let prevLnum = prevnonblank(a:lnum - 1) - if prevLnum == 0 - " This is the first non-empty line, use zero indent. - return 0 - endif - - " Taken from Python indenting: - " If the previous line is inside parenthesis, use the indent of the starting - " line. - " Trick: use the non-existing "dummy" variable to break out of the loop when - " going too far back. - call cursor(prevLnum, 1) - let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW', - \ "line('.') < " . (prevLnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|String\\|Char\\)$'") - if parlnum > 0 - let plindent = indent(parlnum) - let plnumstart = parlnum - else - let plindent = indent(prevLnum) - let plnumstart = prevLnum - endif - - - " When inside parenthesis: If at the first line below the parenthesis add - " two 'shiftwidth', otherwise same as previous line. - " i = (a - " + b - " + c) - call cursor(a:lnum, 1) - let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', - \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|String\\|Char\\)$'") - if p > 0 - if p == prevLnum - " When the start is inside parenthesis, only indent one 'shiftwidth'. - let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW', - \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :" - \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')" - \ . " =~ '\\(Comment\\|String\\|Char\\)$'") - if pp > 0 - return indent(prevLnum) + shiftwidth() - endif - return indent(prevLnum) + shiftwidth() * 2 - endif - if plnumstart == p - return indent(prevLnum) - endif - return plindent - endif - - let prevline = getline(prevLnum) - let thisline = getline(a:lnum) - - " If this line is not a comment and the previous one is then move the - " previous line further back. - if thisline !~ '^\s*#' - while prevline =~ '^\s*#' - let prevLnum = prevnonblank(prevLnum - 1) - if prevLnum == 0 - " Only comment lines before this, no indent - return 0 - endif - let prevline = getline(prevLnum) - let plindent = indent(prevLnum) - endwhile - endif - - if prevline =~ '^\s*\(IF\|\|ELSEIF\|ELSE\|GENERATE_IF\|\|GENERATE_ELSEIF\|GENERATE_ELSE\|WHILE\|REPEAT\|TRY\|CATCH\|FINALLY\|FOR\|DO\|SWITCH\|CASE\|DEFAULT\|FUNC\|VIRTUAL\|ABSTRACT\|DEFINE\|REPLACE\|FINAL\|PROC\|MAIN\|NEW\|ENUM\|CLASS\|INTERFACE\|BITS\|MODULE\|SHARED\)\>' - let plindent += shiftwidth() - endif - if thisline =~ '^\s*\(}\|ELSEIF\>\|ELSE\>\|CATCH\|FINALLY\|GENERATE_ELSEIF\>\|GENERATE_ELSE\>\|UNTIL\>\)' - let plindent -= shiftwidth() - endif - if thisline =~ '^\s*\(CASE\>\|DEFAULT\>\)' && prevline !~ '^\s*SWITCH\>' - let plindent -= shiftwidth() - endif - - " line up continued comment that started after some code - " String something # comment comment - " # comment - if a:lnum == prevLnum + 1 && thisline =~ '^\s*#' && prevline !~ '^\s*#' - let n = match(prevline, '#') - if n > 1 - let plindent = n - endif - endif - - return plindent -endfunc - -let &cpo = s:cpo_save -unlet s:cpo_save - -endif diff --git a/indent/zsh.vim b/indent/zsh.vim deleted file mode 100644 index d8e3347d..00000000 --- a/indent/zsh.vim +++ /dev/null @@ -1,18 +0,0 @@ -if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'vim') == -1 - -" Vim indent file -" Language: Zsh shell script -" Maintainer: Christian Brabandt <cb@256bit.org> -" Previous Maintainer: Nikolai Weibull <now@bitwi.se> -" Latest Revision: 2015-05-29 -" License: Vim (see :h license) -" Repository: https://github.com/chrisbra/vim-zsh - -if exists("b:did_indent") - finish -endif - -" Same as sh indenting for now. -runtime! indent/sh.vim - -endif |