summaryrefslogtreecommitdiffstats
path: root/ftplugin
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2013-09-12 17:36:44 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2013-09-12 17:36:44 +0200
commit8e46fc0007c674e4a89c0b7490e0ed80528e4093 (patch)
tree975d7360cae10a5fb90532408f569b4c0f72726d /ftplugin
parent2ed8751feb4e78fd37a822581a3ec4f7bfd627db (diff)
downloadvim-polyglot-8e46fc0007c674e4a89c0b7490e0ed80528e4093.tar.gz
vim-polyglot-8e46fc0007c674e4a89c0b7490e0ed80528e4093.zip
vim-scripts/Puppet-Syntax-Highlighting -> ajs/puppet-vim
Diffstat (limited to 'ftplugin')
-rw-r--r--ftplugin/puppet.vim137
1 files changed, 137 insertions, 0 deletions
diff --git a/ftplugin/puppet.vim b/ftplugin/puppet.vim
new file mode 100644
index 00000000..1b008682
--- /dev/null
+++ b/ftplugin/puppet.vim
@@ -0,0 +1,137 @@
+" 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*$'
+
+" set keywordprg to 'pi' (alias for puppet describe)
+" this lets K invoke pi for word under cursor
+setlocal keywordprg=puppet\ describe
+
+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
+
+" detect if we are in a module and set variables for classpath (autoloader),
+" modulename, modulepath, and classname
+" useful to use in templates
+function! s:SetModuleVars()
+
+ " set these to any dirs you want to stop searching on
+ " useful to stop vim from spinning disk looking all over for init.pp
+ " probably only a macosx problem with /tmp since it's really /private/tmp
+ " but it's here if you find vim spinning on new files in certain places
+ if !exists("g:puppet_stop_dirs")
+ let g:puppet_stop_dirs = '/tmp;/private/tmp'
+ endif
+
+ " search path for init.pp
+ let b:search_path = './**'
+ let b:search_path = b:search_path . ';' . getcwd() . ';' . g:puppet_stop_dirs
+
+ " find what we assume to be our module dir
+ let b:initpp = findfile("init.pp", b:search_path) " find an init.pp up or down
+ let b:module_path = fnamemodify(b:initpp, ":p:h:h") " full path to module name
+ let b:module_name = fnamemodify(b:module_path, ":t") " just the module name
+
+ " sub out the full path to the module with the name and replace slashes with ::
+ let b:classpath = fnamemodify(expand("%:p:r"), ':s#' . b:module_path . '/manifests#' . b:module_name . '#'. ":gs?/?::?")
+ let b:classname = expand("%:t:r")
+
+ " if we don't start with a word we didn't replace the module_path
+ " probably b/c we couldn't find an init.pp / not a module
+ " so we assume that root of the filename is the class (sane for throwaway
+ " manifests
+ if b:classpath =~ '^::'
+ let b:classpath = b:classname
+ endif
+endfunction
+
+if exists("g:puppet_module_detect")
+ call s:SetModuleVars()
+endif