better remove empty line function
[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! Snippet(abbr, str)
18     if type(a:str) == type([])
19         return Snippet(a:abbr, join(a:str, "\n"))
20     endif
21     let st = g:snip_start_tag
22     let et = g:snip_end_tag
23     let cd = g:snip_elem_delim
24     let str = substitute(a:str, '<{.\{-}\zs:\ze.\{-}}>', cd, "")
25     let str = substitute(str, '<{', st, "")
26     let str = substitute(str, '}>', et, "")
27     exec 'Snippet '.a:abbr.' '.str
28 endfunction
29
30 function! SnippetFile(filename)
31     let abbr = fnamemodify(a:filename, ':t:r')
32     let str = readfile(a:filename)
33     return Snippet(abbr, str)
34 endfunction
35
36 function! ParameterizedModule()
37     let current_file = expand("%")
38     let t = substitute(current_file, '\.pm', '', '')
39     let t = substitute(t, 'lib/', '', '')
40
41     " Sadly, this does not work because : is a special character in snippet
42     " tag names. Any ideas?
43     "let module = substitute(t, '/', '::', 'g')
44     let module = substitute(t, '/.*', '', '')
45
46     return '<{' . module . '}>'
47 endfun
48
49 call Snippet('class', [
50             \"package ".ParameterizedModule().";",
51             \"use Moose;",
52             \"",
53             \"extends '<{SuperClass:RemoveUnchangedLine()}>;",
54             \"",
55             \"<{}>",
56             \"",
57             \"__PACKAGE__->meta->make_immutable;",
58             \"no Moose;",
59             \"",
60             \"1;"])
61 call Snippet('role', [
62             \"package ".ParameterizedModule().";",
63             \"use Moose::Role;",
64             \"",
65             \"<{}>",
66             \"",
67             \"no Moose::Role;",
68             \"",
69             \"1;"])
70 call Snippet('has', [
71             \"has <{attr}> => (",
72             \    "is  => '<{rw}>',",
73             \    "isa => '<{Str}>',",
74             \    "<{options:RemoveUnchangedLine()}>",
75             \");"])
76 call Snippet('hasl', [
77             \"has <{attr}> => (",
78             \    "is         => '<{rw}>',",
79             \    "isa        => '<{Str}>',",
80             \    "lazy_build => 1,",
81             \    "<{options:RemoveUnchangedLine()}>",
82             \");",
83             \"",
84             \"sub _build_<{attr}> {",
85             \    "my $self = shift;",
86             \    "<{}>",
87             \"}"])
88 call Snippet('sub', [
89             \"sub <{name}> {",
90             \    "my $self = shift;",
91             \    "my (<{arg:RemoveUnchangedLine()}>) = @_;",
92             \    "<{}>",
93             \"}"])
94 call Snippet('around', [
95             \"around <{name}> => sub {",
96             \    "my $<{next}> = shift;",
97             \    "my $self = shift;",
98             \    "<{}>",
99             \"};"])
100 call Snippet('before', [
101             \"before <{name}> => sub {",
102             \    "my $self = shift;",
103             \    "<{}>",
104             \"};"])
105 call Snippet('after', [
106             \"after <{name}> => sub {",
107             \    "my $self = shift;",
108             \    "<{}>",
109             \"};"])
110
111 " MooseX support
112 call Snippet('prole', [
113             \"package ".ParameterizedModule().";",
114             \"use MooseX::Role::Parameterized;",
115             \"",
116             \"<{}>",
117             \"",
118             \"role {",
119             \"my $p = shift;",
120             \"",
121             \"<{}>",
122             \"};",
123             \"",
124             \"no MooseX::Role::Parameterized;",
125             \"",
126             \"1;"])
127
128 "for file in globpath(&rtp, 'snippets/*')
129     "call SnippetFile(file)
130 "endfor