summaryrefslogtreecommitdiffstats
path: root/indent
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2019-09-04 16:04:21 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2019-09-04 16:04:21 +0200
commit933e42ea1f2d615c8ce5aa6daa2994e6369de3cf (patch)
treedd8398c36a6645585288247283f7cc52934268e4 /indent
parentcdd6d73e39c85feccdcace5c32b375de7ba25bae (diff)
downloadvim-polyglot-933e42ea1f2d615c8ce5aa6daa2994e6369de3cf.tar.gz
vim-polyglot-933e42ea1f2d615c8ce5aa6daa2994e6369de3cf.zip
Change provider for puppet, closes #424
Diffstat (limited to 'indent')
-rw-r--r--indent/puppet.vim60
1 files changed, 53 insertions, 7 deletions
diff --git a/indent/puppet.vim b/indent/puppet.vim
index 31a4a505..977e8606 100644
--- a/indent/puppet.vim
+++ b/indent/puppet.vim
@@ -16,6 +16,7 @@ let b:did_indent = 1
setlocal autoindent smartindent
setlocal indentexpr=GetPuppetIndent()
setlocal indentkeys+=0],0)
+setlocal formatexpr=puppet#format#Format()
if exists("*GetPuppetIndent")
finish
@@ -33,7 +34,7 @@ function! s:PartOfInclude(lnum)
if line !~ ',$'
break
endif
- if line =~ '^\s*include\s\+[^,]\+,$'
+ if line =~ '^\s*include\s\+[^,]\+,$' && line !~ '[=>]>'
return 1
endif
endwhile
@@ -42,24 +43,70 @@ endfunction
function! s:OpenBrace(lnum)
call cursor(a:lnum, 1)
- return searchpair('{\|\[\|(', '', '}\|\]\|)', 'nbW')
+ return searchpair('{\|\[\|(', '', '}\|\]\|)', 'nbW',
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "comment\\|string"')
endfunction
-function! GetPuppetIndent()
- let pnum = prevnonblank(v:lnum - 1)
+function! s:InsideMultilineString(lnum)
+ return synIDattr(synID(a:lnum, 1, 0), 'name') =~? 'string'
+endfunction
+
+function! s:PrevNonMultilineString(lnum)
+ let l:lnum = a:lnum
+ while l:lnum > 0 && s:InsideMultilineString(lnum)
+ let l:lnum = l:lnum - 1
+ endwhile
+
+ return l:lnum
+endfunction
+
+""
+" Get indent number for line, line can be given as params, otherwise function
+" use line where cursor is
+" @param a:1 (optional) line number in current buffer
+" @return integer
+function! GetPuppetIndent(...)
+ let l:lnum = get(a:, 1, v:lnum)
+
+ let pnum = prevnonblank(l:lnum - 1)
if pnum == 0
return 0
endif
- let line = getline(v:lnum)
+ let line = getline(l:lnum)
let pline = getline(pnum)
let ind = indent(pnum)
+ " Avoid cases of closing braces or parens on the current line: returning
+ " the same indent here would be premature since for that particular case
+ " we want to instead get the indent level of the matching opening brace or
+ " parenthenses.
+ if pline =~ '^\s*#' && line !~ '^\s*\(}\(,\|;\)\?$\|]:\|],\|}]\|];\?$\|)\)'
+ return ind
+ endif
+
+ " We are inside a multi-line string: if we interfere with indentation here
+ " we're actually changing the contents of of the string!
+ if s:InsideMultilineString(l:lnum)
+ return indent(l:lnum)
+ endif
+
+ " Previous line was inside a multi-line string: we've lost the indent
+ " level. We need to find this value from the last line that was not inside
+ " of a multi-line string to restore proper alignment.
+ if s:InsideMultilineString(pnum)
+ if pnum - 1 == 0
+ return ind
+ endif
+
+ let ind = indent(s:PrevNonMultilineString(pnum - 1))
+ endif
+
if pline =~ '\({\|\[\|(\|:\)\s*\(#.*\)\?$'
let ind += &sw
elseif pline =~ ';$' && pline !~ '[^:]\+:.*[=+]>.*'
let ind -= &sw
- elseif pline =~ '^\s*include\s\+.*,$'
+ elseif pline =~ '^\s*include\s\+.*,$' && pline !~ '[=+]>'
let ind += &sw
endif
@@ -76,7 +123,6 @@ function! GetPuppetIndent()
if line =~ '^\s*}\s*els\(e\|if\).*{\s*$'
let ind -= &sw
endif
-
" Don't indent resources that are one after another with a ->(ordering arrow)
" file {'somefile':
" ...