summaryrefslogtreecommitdiffstats
path: root/indent
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2017-12-06 13:17:06 +0100
committerAdam Stankiewicz <sheerun@sher.pl>2017-12-06 13:17:06 +0100
commit11f53253ad9fd0cd3e7a44ed9f8c80a4f265b46e (patch)
tree08649366f6babad66db065b341691cfac02c2c4a /indent
parent9fe009095afdb86f6f771109ac454ccfc5340f31 (diff)
downloadvim-polyglot-3.2.0.tar.gz
vim-polyglot-3.2.0.zip
Add slime syntax, closes #252v3.2.0
Diffstat (limited to 'indent')
-rw-r--r--indent/fish.vim6
-rw-r--r--indent/fsharp.vim253
-rw-r--r--indent/gitconfig.vim42
-rw-r--r--indent/glsl.vim15
-rw-r--r--indent/slime.vim79
-rw-r--r--indent/tex.vim140
6 files changed, 395 insertions, 140 deletions
diff --git a/indent/fish.vim b/indent/fish.vim
new file mode 100644
index 00000000..c5f8e50e
--- /dev/null
+++ b/indent/fish.vim
@@ -0,0 +1,6 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fish') == -1
+
+setlocal indentexpr=fish#Indent()
+setlocal indentkeys+==end,=else,=case
+
+endif
diff --git a/indent/fsharp.vim b/indent/fsharp.vim
new file mode 100644
index 00000000..bdc3e3f9
--- /dev/null
+++ b/indent/fsharp.vim
@@ -0,0 +1,253 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'fsharp') == -1
+
+" Vim indent file
+" Language: FSharp
+" Maintainers: Jean-Francois Yuen <jfyuen@happycoders.org>
+" Mike Leary <leary@nwlink.com>
+" Markus Mottl <markus.mottl@gmail.com>
+" Rudi Grinberg <rudi.grinberg@gmail.com>
+" Gregor Uhlenheuer <kongo2002@gmail.com>
+" Last Change: 2013 Jun 29
+" 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)
+" 2014 August - Ported to F#
+" 2014 August - F# specific cleanup
+"
+" 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 indentexpr=GetFsharpIndent()
+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=let,0=method,0=open,0=then,0=type,0=val,0=with,0;;,0>\],0\|\],0>},0\|,0},0\],0)
+
+" Only define the function once.
+if exists("*GetFsharpIndent")
+ finish
+endif
+
+" 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! GetFsharpIndent()
+ " 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 single 'shiftwidth' after lines matching:
+ " if lline =~ '^\s*|.*->\s*$'
+ " return ind + &sw
+ " 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\|private\|with\)\s*$'
+ call search('|', 'bW')
+ return indent(searchpair('^\s*\(match\|type\)\>\|\<\(function\|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 - &sw
+ 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')) + &sw
+ endif
+
+ endif
+
+ " Add a 'shiftwidth' after lines ending with:
+ if lline =~ '\(:\|=\|->\|<-\|(\|\[\|{\|{<\|\[|\|\[<\|\<\(begin\|do\|else\|fun\|function\|functor\|if\|initializer\|object\|private\|sig\|struct\|then\|try\)\|\<object\s*(.*)\)\s*$'
+ let ind = ind + &sw
+
+ " 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
+
+ return ind
+
+endfunction
+
+" vim: sw=4 et sts=4
+
+endif
diff --git a/indent/gitconfig.vim b/indent/gitconfig.vim
new file mode 100644
index 00000000..e0e4a456
--- /dev/null
+++ b/indent/gitconfig.vim
@@ -0,0 +1,42 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'git') == -1
+
+" Vim indent file
+" Language: git config file
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2013 May 30
+
+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 = exists('*shiftwidth') ? shiftwidth() : &sw
+ 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
diff --git a/indent/glsl.vim b/indent/glsl.vim
new file mode 100644
index 00000000..64f3a6fa
--- /dev/null
+++ b/indent/glsl.vim
@@ -0,0 +1,15 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'glsl') == -1
+
+" Language: OpenGL Shading Language
+" Maintainer: Sergey Tikhomirov <sergey@tikhomirov.io>
+
+if exists("b:did_indent")
+ finish
+endif
+
+setlocal autoindent cindent
+setlocal formatoptions+=roq
+
+" vim:set sts=2 sw=2 :
+
+endif
diff --git a/indent/slime.vim b/indent/slime.vim
new file mode 100644
index 00000000..59eea509
--- /dev/null
+++ b/indent/slime.vim
@@ -0,0 +1,79 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'slime') == -1
+
+" Vim indent file
+" Language: Slime
+
+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=GetSlimeIndent()
+setlocal indentkeys=o,O,*<Return>,},],0),!^F,=end,=else,=elsif,=rescue,=ensure,=when
+
+" Only define the function once.
+if exists("*GetSlimeIndent")
+ finish
+endif
+
+let s:attributes = '\%({.\{-\}}\|\[.\{-\}\]\)'
+let s:tag = '\%([%.#][[:alnum:]_-]\+\|'.s:attributes.'\)*[<>]*'
+
+if !exists('g:haml_self_closing_tags')
+ let g:haml_self_closing_tags = 'meta|link|img|hr|br'
+endif
+
+function! GetSlimeIndent()
+ 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)
+ 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 =~ '^doctype'
+ return indent
+ elseif line =~ '^/\%(\[[^]]*\]\)\=$'
+ return increase
+ elseif line =~ '^[\.#]'
+ return increase
+ elseif line =~? '^div'
+ 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
diff --git a/indent/tex.vim b/indent/tex.vim
deleted file mode 100644
index 14af7b28..00000000
--- a/indent/tex.vim
+++ /dev/null
@@ -1,140 +0,0 @@
-if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'latex') == -1
-
-" LaTeX indent file (part of LaTeX Box)
-" Maintainer: David Munger (mungerd@gmail.com)
-
-if exists("g:LatexBox_custom_indent") && ! g:LatexBox_custom_indent
- finish
-endif
-if exists("b:did_indent")
- finish
-endif
-
-let b:did_indent = 1
-
-setlocal indentexpr=LatexBox_TexIndent()
-setlocal indentkeys=0=\\end,0=\\end{enumerate},0=\\end{itemize},0=\\end{description},0=\\right,0=\\item,0=\\),0=\\],0},o,O,0\\
-
-let s:list_envs = ['itemize', 'enumerate', 'description']
-" indent on \left( and on \(, but not on (
-" indent on \left[ and on \[, but not on [
-" indent on \left\{ and on {, but not on \{
-let s:open_pat = '\\\@<!\%(\\begin\|\\left\a\@!\|\\(\|\\\[\|{\)'
-let s:close_pat = '\\\@<!\%(\\end\|\\right\a\@!\|\\)\|\\\]\|}\)'
-let s:list_open_pat = '\\\@<!\\begin{\%(' . join(s:list_envs, '\|') . '\)}'
-let s:list_close_pat = '\\\@<!\\end{\%(' . join(s:list_envs, '\|') . '\)}'
-
-function! s:CountMatches(str, pat)
- return len(substitute(substitute(a:str, a:pat, "\n", 'g'), "[^\n]", '', 'g'))
-endfunction
-
-
-" TexIndent {{{
-function! LatexBox_TexIndent()
-
- let lnum_curr = v:lnum
- let lnum_prev = prevnonblank(lnum_curr - 1)
-
- if lnum_prev == 0
- return 0
- endif
-
- let line_curr = getline(lnum_curr)
- let line_prev = getline(lnum_prev)
-
- " remove \\
- let line_curr = substitute(line_curr, '\\\\', '', 'g')
- let line_prev = substitute(line_prev, '\\\\', '', 'g')
-
- " strip comments
- let line_curr = substitute(line_curr, '\\\@<!%.*$', '', 'g')
- let line_prev = substitute(line_prev, '\\\@<!%.*$', '', 'g')
-
- " find unmatched opening patterns on previous line
- let n = s:CountMatches(line_prev, s:open_pat)-s:CountMatches(line_prev, s:close_pat)
- let n += s:CountMatches(line_prev, s:list_open_pat)-s:CountMatches(line_prev, s:list_close_pat)
-
- " reduce indentation if current line starts with a closing pattern
- if line_curr =~ '^\s*\%(' . s:close_pat . '\)'
- let n -= 1
- endif
-
- " compensate indentation if previous line starts with a closing pattern
- if line_prev =~ '^\s*\%(' . s:close_pat . '\)'
- let n += 1
- endif
-
- " reduce indentation if current line starts with a closing list
- if line_curr =~ '^\s*\%(' . s:list_close_pat . '\)'
- let n -= 1
- endif
-
- " compensate indentation if previous line starts with a closing list
- if line_prev =~ '^\s*\%(' . s:list_close_pat . '\)'
- let n += 1
- endif
-
- " reduce indentation if previous line is \begin{document}
- if line_prev =~ '\\begin\s*{document}'
- let n -= 1
- endif
-
- " less shift for lines starting with \item
- let item_here = line_curr =~ '^\s*\\item'
- let item_above = line_prev =~ '^\s*\\item'
- if !item_here && item_above
- let n += 1
- elseif item_here && !item_above
- let n -= 1
- endif
-
- return indent(lnum_prev) + n * &sw
-endfunction
-" }}}
-
-" Restore cursor position, window position, and last search after running a
-" command.
-function! Latexbox_CallIndent()
- " Save the current cursor position.
- let cursor = getpos('.')
-
- " Save the current window position.
- normal! H
- let window = getpos('.')
- call setpos('.', cursor)
-
- " Get first non-whitespace character of current line.
- let line_start_char = matchstr(getline('.'), '\S')
-
- " Get initial tab position.
- let initial_tab = stridx(getline('.'), line_start_char)
-
- " Execute the command.
- execute 'normal! =='
-
- " Get tab position difference.
- let difference = stridx(getline('.'), line_start_char) - initial_tab
-
- " Set new cursor Y position based on calculated difference.
- let cursor[2] = cursor[2] + difference
-
- " Restore the previous window position.
- call setpos('.', window)
- normal! zt
-
- " Restore the previous cursor position.
- call setpos('.', cursor)
-endfunction
-
-" autocmd to call indent after completion
-" 7.3.598
-if v:version > 703 || (v:version == 703 && has('patch598'))
- augroup LatexBox_Completion
- autocmd!
- autocmd CompleteDone <buffer> call Latexbox_CallIndent()
- augroup END
-endif
-
-" vim:fdm=marker:ff=unix:noet:ts=4:sw=4
-
-endif