snippetem 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +38 -0
- data/Rakefile +12 -0
- data/VERSION +1 -0
- data/lib/snippet_builder.rb +77 -0
- data/lib/snippetem.rb +11 -0
- data/spec/snippetem_spec.rb +69 -0
- metadata +60 -0
data/README
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
= Snippitem
|
2
|
+
A DSL for constructing snipmate.vim snippets
|
3
|
+
|
4
|
+
= Install
|
5
|
+
|
6
|
+
gem install snippetem
|
7
|
+
|
8
|
+
= Usage
|
9
|
+
|
10
|
+
Create a ruby file in your ~/.vim/snippets directory. Fill it with something like the following:
|
11
|
+
|
12
|
+
# snippet_definitions.rb
|
13
|
+
require 'rubygems'
|
14
|
+
require 'snippitem'
|
15
|
+
|
16
|
+
snippets do
|
17
|
+
filetype 'ruby' do
|
18
|
+
block('each', :yields => %w(x))
|
19
|
+
block('ewi', :yields => %w(x index), :function => 'each_with_index')
|
20
|
+
block('sel', :yields => %w(x), :function => 'select', :style => :curly)
|
21
|
+
end
|
22
|
+
|
23
|
+
filetype 'rspec' do
|
24
|
+
block('desc', :params => [String], :function => 'describe')
|
25
|
+
block('it', :params => [String])
|
26
|
+
block('context', :params => [String])
|
27
|
+
block('should', :params => [String])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
Run the script. It outputs each snippet it creates. Since these are generated files, you
|
32
|
+
don't want them in source control.
|
33
|
+
|
34
|
+
$ ruby snippet_definitions.rb > .gitignore
|
35
|
+
|
36
|
+
This will generate snippets! They'll be placed in a directory corresponding to the filetype.
|
37
|
+
It will clobber any existing snippets with the same name, but that shouldn't matter because
|
38
|
+
you've got them in source control, right?
|
data/Rakefile
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
begin
|
2
|
+
require 'jeweler'
|
3
|
+
Jeweler::Tasks.new do |gemspec|
|
4
|
+
gemspec.name = "snippetem"
|
5
|
+
gemspec.summary = "A DSL for creating snipmate.vim snippets"
|
6
|
+
gemspec.email = "contact@rhnh.net"
|
7
|
+
gemspec.homepage = "http://github.com/xaviershay/snippitem"
|
8
|
+
gemspec.authors = ["Xavier Shay"]
|
9
|
+
end
|
10
|
+
rescue LoadError
|
11
|
+
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
12
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
class SnippetBuilder
|
4
|
+
class FileTypeBuilder < Struct.new(:type)
|
5
|
+
def block(*args)
|
6
|
+
(@blocks ||= []) << ::SnippetBuilder::BlockSnippetBuilder.new(*args)
|
7
|
+
end
|
8
|
+
|
9
|
+
def process!
|
10
|
+
FileUtils.mkdir_p(type)
|
11
|
+
|
12
|
+
@blocks.each do |block|
|
13
|
+
file = File.join(type, block.name + '.snippet')
|
14
|
+
File.open(file, 'w') do |f|
|
15
|
+
f.write(block.to_s)
|
16
|
+
end
|
17
|
+
puts file
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
class BlockSnippetBuilder
|
23
|
+
attr_reader :name
|
24
|
+
|
25
|
+
def initialize(name, opts = {})
|
26
|
+
@name = name
|
27
|
+
@function = opts[:function] || name
|
28
|
+
@opts = opts
|
29
|
+
@var_index = 0
|
30
|
+
end
|
31
|
+
|
32
|
+
def to_s
|
33
|
+
if @opts[:style] == :curly
|
34
|
+
"#{@function} #{params}{#{yields.strip} ${#{next_var}} }"
|
35
|
+
else
|
36
|
+
<<-EOS
|
37
|
+
#{@function} #{params}do#{yields}
|
38
|
+
\t${#{next_var}}
|
39
|
+
end
|
40
|
+
EOS
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def params
|
45
|
+
if @opts[:params]
|
46
|
+
@opts[:params].map do |x|
|
47
|
+
if x == String
|
48
|
+
"'${#{next_var}}'"
|
49
|
+
else
|
50
|
+
"${#{next_var}}"
|
51
|
+
end
|
52
|
+
end.join(', ') + ' '
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def yields
|
57
|
+
if @opts[:yields]
|
58
|
+
params = @opts[:yields].map do |x|
|
59
|
+
"${#{next_var}:#{x}}"
|
60
|
+
end
|
61
|
+
" |%s|" % params.join(', ')
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def next_var
|
66
|
+
@var_index += 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def filetype(type, &block)
|
71
|
+
(@filetypes ||= []) << FileTypeBuilder.new(type).tap {|x| x.instance_eval(&block) }
|
72
|
+
end
|
73
|
+
|
74
|
+
def process!
|
75
|
+
@filetypes.each(&:process!)
|
76
|
+
end
|
77
|
+
end
|
data/lib/snippetem.rb
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec'
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
require 'snippet_builder'
|
4
|
+
|
5
|
+
BSB = SnippetBuilder::BlockSnippetBuilder
|
6
|
+
describe BSB do
|
7
|
+
describe 'block functions' do
|
8
|
+
it 'supports function different from the snippet name' do
|
9
|
+
BSB.new('e', :function => 'e').to_s.should == <<-EOS
|
10
|
+
e do
|
11
|
+
\t${1}
|
12
|
+
end
|
13
|
+
EOS
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'supports no params, no yield' do
|
17
|
+
BSB.new('each').to_s.should == <<-EOS
|
18
|
+
each do
|
19
|
+
\t${1}
|
20
|
+
end
|
21
|
+
EOS
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'supports string params' do
|
25
|
+
BSB.new('describe', :params => [String]).to_s.should == <<-EOS
|
26
|
+
describe '${1}' do
|
27
|
+
\t${2}
|
28
|
+
end
|
29
|
+
EOS
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'supports unknown params' do
|
33
|
+
BSB.new('describe', :params => [Integer]).to_s.should == <<-EOS
|
34
|
+
describe ${1} do
|
35
|
+
\t${2}
|
36
|
+
end
|
37
|
+
EOS
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'supports mixed params' do
|
41
|
+
BSB.new('describe', :params => [String, Integer]).to_s.should == <<-EOS
|
42
|
+
describe '${1}', ${2} do
|
43
|
+
\t${3}
|
44
|
+
end
|
45
|
+
EOS
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'supports yielding with default parameter name, one' do
|
49
|
+
BSB.new('each', :yields => %w(x)).to_s.should == <<-EOS
|
50
|
+
each do |${1:x}|
|
51
|
+
\t${2}
|
52
|
+
end
|
53
|
+
EOS
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'supports yielding with default parameter name, multiple' do
|
57
|
+
BSB.new('each_with_index', :yields => %w(x index)).to_s.should == <<-EOS
|
58
|
+
each_with_index do |${1:x}, ${2:index}|
|
59
|
+
\t${3}
|
60
|
+
end
|
61
|
+
EOS
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'supports curly brackets' do
|
65
|
+
BSB.new('each', :yields => %w(x), :style => :curly).to_s.should ==
|
66
|
+
"each {|${1:x}| ${2} }"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
metadata
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: snippetem
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Xavier Shay
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-09-25 00:00:00 +03:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: contact@rhnh.net
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
24
|
+
files:
|
25
|
+
- README
|
26
|
+
- Rakefile
|
27
|
+
- VERSION
|
28
|
+
- lib/snippet_builder.rb
|
29
|
+
- lib/snippetem.rb
|
30
|
+
- spec/snippetem_spec.rb
|
31
|
+
has_rdoc: true
|
32
|
+
homepage: http://github.com/xaviershay/snippitem
|
33
|
+
licenses: []
|
34
|
+
|
35
|
+
post_install_message:
|
36
|
+
rdoc_options:
|
37
|
+
- --charset=UTF-8
|
38
|
+
require_paths:
|
39
|
+
- lib
|
40
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: "0"
|
45
|
+
version:
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - ">="
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: "0"
|
51
|
+
version:
|
52
|
+
requirements: []
|
53
|
+
|
54
|
+
rubyforge_project:
|
55
|
+
rubygems_version: 1.3.4
|
56
|
+
signing_key:
|
57
|
+
specification_version: 3
|
58
|
+
summary: A DSL for creating snipmate.vim snippets
|
59
|
+
test_files:
|
60
|
+
- spec/snippetem_spec.rb
|