a7484cedca4d11fbffb0e471e4c504a13c048d55
[gitmo/moose-dev-utils.git] / vim / moose_snippets.vim
1 " See http://www.vim.org/scripts/script.php?script_id=1318
2 " Written by Sartak and doy, feel free to add your own!
3
4 if !exists('loaded_snippet') || &cp
5     finish
6 endif
7
8 function! RemoveUnchangedLine()
9     if match(getline('.'), "<{}>") >= 0
10         normal! dd
11         return ''
12     else
13         return @z
14     endif
15 endfun
16
17 function! RemoveUnchangedLineSemicolon()
18     if match(getline('.'), "<{}>") >= 0
19         normal! ddkA;
20         normal! o
21         return ''
22     else
23         normal! A;
24         "normal! o " we can't actually change what line we're on :/
25         return @z
26     endif
27 endfun
28
29 function! Snippet(abbr, str)
30     if type(a:str) == type([])
31         return Snippet(a:abbr, join(a:str, "\n"))
32     endif
33     let st = g:snip_start_tag
34     let et = g:snip_end_tag
35     let cd = g:snip_elem_delim
36     let str = substitute(a:str, '<{.\{-}\zs:\ze.\{-}}>', cd, "")
37     let str = substitute(str, '<{', st, "")
38     let str = substitute(str, '}>', et, "")
39     exec 'Snippet '.a:abbr.' '.str
40 endfunction
41
42 function! SnippetFile(filename)
43     let abbr = fnamemodify(a:filename, ':t:r')
44     let str = readfile(a:filename)
45     return Snippet(abbr, str)
46 endfunction
47
48 function! ParameterizedModule()
49     let current_file = expand("%")
50     let t = substitute(current_file, '\.pm', '', '')
51     let t = substitute(t, 'lib/', '', '')
52
53     " Sadly, this does not work because : is a special character in snippet
54     " tag names. Any ideas?
55     "let module = substitute(t, '/', '::', 'g')
56     let module = substitute(t, '/.*', '', '')
57
58     return '<{' . module . '}>'
59 endfun
60
61 call Snippet('class', [
62             \"package ".ParameterizedModule().";",
63             \"use Moose;",
64             \"",
65             \"extends '<{SuperClass:RemoveUnchangedLine()}>';",
66             \"",
67             \"<{}>",
68             \"",
69             \"__PACKAGE__->meta->make_immutable;",
70             \"no Moose;",
71             \"",
72             \"1;"])
73 call Snippet('role', [
74             \"package ".ParameterizedModule().";",
75             \"use Moose::Role;",
76             \"",
77             \"<{}>",
78             \"",
79             \"no Moose::Role;",
80             \"",
81             \"1;"])
82 call Snippet('has', [
83             \"has <{attr}> => (",
84             \    "is  => '<{rw}>',",
85             \    "isa => '<{Str}>',",
86             \    "<{options:RemoveUnchangedLine()}>",
87             \");"])
88 call Snippet('hasl', [
89             \"has <{attr}> => (",
90             \    "is         => '<{rw}>',",
91             \    "isa        => '<{Str}>',",
92             \    "lazy_build => 1,",
93             \    "<{options:RemoveUnchangedLine()}>",
94             \");",
95             \"",
96             \"sub _build_<{attr}> {",
97             \    "my $self = shift;",
98             \    "<{}>",
99             \"}"])
100 call Snippet('sub', [
101             \"sub <{name}> {",
102             \    "my $self = shift;",
103             \    "my (<{arg:RemoveUnchangedLine()}>) = @_;",
104             \    "<{}>",
105             \"}"])
106 call Snippet('around', [
107             \"around <{name}> => sub {",
108             \    "my $<{next}> = shift;",
109             \    "my $self = shift;",
110             \    "<{}>",
111             \"};"])
112 call Snippet('before', [
113             \"before <{name}> => sub {",
114             \    "my $self = shift;",
115             \    "<{}>",
116             \"};"])
117 call Snippet('after', [
118             \"after <{name}> => sub {",
119             \    "my $self = shift;",
120             \    "<{}>",
121             \"};"])
122 call Snippet('subtype', [
123             \"subtype '<{name}>'",
124             \    "=> as '<{supertype}>'",
125             \    "=> where { <{predicate:RemoveUnchangedLine()}> }",
126             \    "=> message { \"<{message:RemoveUnchangedLineSemicolon()}>\" }",
127             \""])
128
129 " MooseX support
130 call Snippet('prole', [
131             \"package ".ParameterizedModule().";",
132             \"use MooseX::Role::Parameterized;",
133             \"",
134             \"<{}>",
135             \"",
136             \"role {",
137             \"my $p = shift;",
138             \"",
139             \"<{}>",
140             \"};",
141             \"",
142             \"no MooseX::Role::Parameterized;",
143             \"",
144             \"1;"])
145
146 "for file in globpath(&rtp, 'snippets/*')
147     "call SnippetFile(file)
148 "endfor