summaryrefslogtreecommitdiffstats
path: root/ext/vim/ftplugin/puppet.vim
diff options
context:
space:
mode:
authorMatt Robinson <matt@puppetlabs.com>2011-05-19 21:18:55 -0700
committerMatt Robinson <matt@puppetlabs.com>2011-05-19 21:18:55 -0700
commiteeeab02fd97a625ec0e21ecd5d0ed7f0067027ef (patch)
tree704477b4d8c2b255707e65135b3bb0d10253e06c /ext/vim/ftplugin/puppet.vim
parentbe2f20899d76621db4cf574d074f0ae89777272e (diff)
parent99bf07e76bab47760b9eb3dc42f08582c568388f (diff)
Merge branch '2.7.next' into 2.7.x
* 2.7.next: (42 commits) (#6395) Add extpuppet help, eval, and interfaces Adding a sleep state post starting master maint: fix spec_helper inclusions again. (#7523) Refactor the grammar to reduce duplication (#7114) Fix specs for ssh authorized key parsed provider (#7114) Target returns correct value (#7114) Add integration tests for authorized_key (#7114) Improve unit tests for ssh_authorized_key (#7114) Improve value validation for authorized_key (#7300) Fix instances method of mount provider (#7259) Remove ActiveRecord requirement from indirector face spec (#7259) Do not try to load all Terminus classes when configuring the Indirector (#3836) External nodes should only capture stdout Revert "(#7220) Add the ability to "inherit" options." maint: sync 'authconfig' to 'rest_authconfig' setting adding test for ticket 7139 (#7139) Accept '/' as a valid path in filesets (#7300) Add specs for the mount provider case seems needless here as there is only two opts, also the rest of the file seems to use if so this should make things more consistant (#6845) Mount writes incorrect vfstab entries ...
Diffstat (limited to 'ext/vim/ftplugin/puppet.vim')
-rw-r--r--ext/vim/ftplugin/puppet.vim94
1 files changed, 94 insertions, 0 deletions
diff --git a/ext/vim/ftplugin/puppet.vim b/ext/vim/ftplugin/puppet.vim
new file mode 100644
index 000000000..b6491554b
--- /dev/null
+++ b/ext/vim/ftplugin/puppet.vim
@@ -0,0 +1,94 @@
+" Vim filetype plugin
+" Language: Puppet
+" Maintainer: Todd Zullinger <tmz@pobox.com>
+" Last Change: 2009 Aug 19
+" vim: set sw=4 sts=4:
+
+if exists("b:did_ftplugin")
+ finish
+endif
+let b:did_ftplugin = 1
+
+if !exists("no_plugin_maps") && !exists("no_puppet_maps")
+ if !hasmapto("<Plug>AlignRange")
+ map <buffer> <LocalLeader>= <Plug>AlignRange
+ endif
+endif
+
+noremap <buffer> <unique> <script> <Plug>AlignArrows :call <SID>AlignArrows()<CR>
+noremap <buffer> <unique> <script> <Plug>AlignRange :call <SID>AlignRange()<CR>
+
+iabbrev => =><C-R>=<SID>AlignArrows('=>')<CR>
+iabbrev +> +><C-R>=<SID>AlignArrows('+>')<CR>
+
+if exists('*s:AlignArrows')
+ finish
+endif
+
+let s:arrow_re = '[=+]>'
+let s:selector_re = '[=+]>\s*\$.*\s*?\s*{\s*$'
+
+function! s:AlignArrows(op)
+ let cursor_pos = getpos('.')
+ let lnum = line('.')
+ let line = getline(lnum)
+ if line !~ s:arrow_re
+ return
+ endif
+ let pos = stridx(line, a:op)
+ let start = lnum
+ let end = lnum
+ let pnum = lnum - 1
+ while 1
+ let pline = getline(pnum)
+ if pline !~ s:arrow_re || pline =~ s:selector_re
+ break
+ endif
+ let start = pnum
+ let pnum -= 1
+ endwhile
+ let cnum = end
+ while 1
+ let cline = getline(cnum)
+ if cline !~ s:arrow_re ||
+ \ (indent(cnum) != indent(cnum+1) && getline(cnum+1) !~ '\s*}')
+ break
+ endif
+ let end = cnum
+ let cnum += 1
+ endwhile
+ call s:AlignSection(start, end)
+ let cursor_pos[2] = stridx(getline('.'), a:op) + strlen(a:op) + 1
+ call setpos('.', cursor_pos)
+ return ''
+endfunction
+
+function! s:AlignRange() range
+ call s:AlignSection(a:firstline, a:lastline)
+endfunction
+
+" AlignSection and AlignLine are from the vim wiki:
+" http://vim.wikia.com/wiki/Regex-based_text_alignment
+function! s:AlignSection(start, end)
+ let extra = 1
+ let sep = s:arrow_re
+ let maxpos = 0
+ let section = getline(a:start, a:end)
+ for line in section
+ let pos = match(line, ' *'.sep)
+ if maxpos < pos
+ let maxpos = pos
+ endif
+ endfor
+ call map(section, 's:AlignLine(v:val, sep, maxpos, extra)')
+ call setline(a:start, section)
+endfunction
+
+function! s:AlignLine(line, sep, maxpos, extra)
+ let m = matchlist(a:line, '\(.\{-}\) \{-}\('.a:sep.'.*\)')
+ if empty(m)
+ return a:line
+ endif
+ let spaces = repeat(' ', a:maxpos - strlen(m[1]) + a:extra)
+ return m[1] . spaces . m[2]
+endfunction