vimmy 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/.gitignore +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +22 -0
- data/README.md +20 -0
- data/Rakefile +2 -0
- data/bin/vimmy +7 -0
- data/data/template/.vim/autoload/pathogen.vim +139 -0
- data/data/template/.vimrc +3 -0
- data/lib/vimmy.rb +3 -0
- data/lib/vimmy/cli.rb +101 -0
- data/lib/vimmy/version.rb +3 -0
- data/vimmy.gemspec +24 -0
- metadata +109 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
vimmy (0.0.1)
|
5
|
+
mechanize (~> 1.0.0)
|
6
|
+
thor (~> 0.14.6)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
mechanize (1.0.0)
|
12
|
+
nokogiri (>= 1.2.1)
|
13
|
+
nokogiri (1.4.4)
|
14
|
+
thor (0.14.6)
|
15
|
+
|
16
|
+
PLATFORMS
|
17
|
+
ruby
|
18
|
+
|
19
|
+
DEPENDENCIES
|
20
|
+
mechanize (~> 1.0.0)
|
21
|
+
thor (~> 0.14.6)
|
22
|
+
vimmy!
|
data/README.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# vimmy
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
gem install vimmy
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
# prepare your ~/.vim and ~/.vimrc
|
10
|
+
$ vimmy init
|
11
|
+
|
12
|
+
# search for a vim plugin
|
13
|
+
$ vimmy search jquery
|
14
|
+
|
15
|
+
# install a vim plugin
|
16
|
+
$ vimmy install jquery
|
17
|
+
|
18
|
+
## License
|
19
|
+
|
20
|
+
MIT
|
data/Rakefile
ADDED
data/bin/vimmy
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
" pathogen.vim - path option manipulation
|
2
|
+
" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
|
3
|
+
" Version: 1.2
|
4
|
+
|
5
|
+
" Install in ~/.vim/autoload (or ~\vimfiles\autoload).
|
6
|
+
"
|
7
|
+
" API is documented below.
|
8
|
+
|
9
|
+
if exists("g:loaded_pathogen") || &cp
|
10
|
+
finish
|
11
|
+
endif
|
12
|
+
let g:loaded_pathogen = 1
|
13
|
+
|
14
|
+
" Split a path into a list.
|
15
|
+
function! pathogen#split(path) abort " {{{1
|
16
|
+
if type(a:path) == type([]) | return a:path | endif
|
17
|
+
let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,')
|
18
|
+
return map(split,'substitute(v:val,''\\\([\\,]\)'',''\1'',"g")')
|
19
|
+
endfunction " }}}1
|
20
|
+
|
21
|
+
" Convert a list to a path.
|
22
|
+
function! pathogen#join(...) abort " {{{1
|
23
|
+
if type(a:1) == type(1) && a:1
|
24
|
+
let i = 1
|
25
|
+
let space = ' '
|
26
|
+
else
|
27
|
+
let i = 0
|
28
|
+
let space = ''
|
29
|
+
endif
|
30
|
+
let path = ""
|
31
|
+
while i < a:0
|
32
|
+
if type(a:000[i]) == type([])
|
33
|
+
let list = a:000[i]
|
34
|
+
let j = 0
|
35
|
+
while j < len(list)
|
36
|
+
let escaped = substitute(list[j],'[,'.space.']\|\\[\,'.space.']\@=','\\&','g')
|
37
|
+
let path .= ',' . escaped
|
38
|
+
let j += 1
|
39
|
+
endwhile
|
40
|
+
else
|
41
|
+
let path .= "," . a:000[i]
|
42
|
+
endif
|
43
|
+
let i += 1
|
44
|
+
endwhile
|
45
|
+
return substitute(path,'^,','','')
|
46
|
+
endfunction " }}}1
|
47
|
+
|
48
|
+
" Convert a list to a path with escaped spaces for 'path', 'tag', etc.
|
49
|
+
function! pathogen#legacyjoin(...) abort " {{{1
|
50
|
+
return call('pathogen#join',[1] + a:000)
|
51
|
+
endfunction " }}}1
|
52
|
+
|
53
|
+
" Remove duplicates from a list.
|
54
|
+
function! pathogen#uniq(list) abort " {{{1
|
55
|
+
let i = 0
|
56
|
+
let seen = {}
|
57
|
+
while i < len(a:list)
|
58
|
+
if has_key(seen,a:list[i])
|
59
|
+
call remove(a:list,i)
|
60
|
+
else
|
61
|
+
let seen[a:list[i]] = 1
|
62
|
+
let i += 1
|
63
|
+
endif
|
64
|
+
endwhile
|
65
|
+
return a:list
|
66
|
+
endfunction " }}}1
|
67
|
+
|
68
|
+
" Returns a hash indicating which filetype features are enabled.
|
69
|
+
function! pathogen#filetype() abort " {{{1
|
70
|
+
redir => output
|
71
|
+
silent filetype
|
72
|
+
redir END
|
73
|
+
let result = {}
|
74
|
+
let result.detection = match(output,'detection:ON') >= 0
|
75
|
+
let result.indent = match(output,'indent:ON') >= 0
|
76
|
+
let result.plugin = match(output,'plugin:ON') >= 0
|
77
|
+
return result
|
78
|
+
endfunction " }}}1
|
79
|
+
|
80
|
+
" \ on Windows unless shellslash is set, / everywhere else.
|
81
|
+
function! pathogen#separator() abort " {{{1
|
82
|
+
return !exists("+shellslash") || &shellslash ? '/' : '\'
|
83
|
+
endfunction " }}}1
|
84
|
+
|
85
|
+
" Convenience wrapper around glob() which returns a list.
|
86
|
+
function! pathogen#glob(pattern) abort " {{{1
|
87
|
+
let files = split(glob(a:pattern),"\n")
|
88
|
+
return map(files,'substitute(v:val,"[".pathogen#separator()."/]$","","")')
|
89
|
+
endfunction "}}}1
|
90
|
+
|
91
|
+
" Like pathogen#glob(), only limit the results to directories.
|
92
|
+
function! pathogen#glob_directories(pattern) abort " {{{1
|
93
|
+
return filter(pathogen#glob(a:pattern),'isdirectory(v:val)')
|
94
|
+
endfunction "}}}1
|
95
|
+
|
96
|
+
" Prepend all subdirectories of path to the rtp, and append all after
|
97
|
+
" directories in those subdirectories.
|
98
|
+
function! pathogen#runtime_prepend_subdirectories(path) " {{{1
|
99
|
+
let sep = pathogen#separator()
|
100
|
+
let before = pathogen#glob_directories(a:path.sep."*[^~]")
|
101
|
+
let after = pathogen#glob_directories(a:path.sep."*[^~]".sep."after")
|
102
|
+
let rtp = pathogen#split(&rtp)
|
103
|
+
let path = expand(a:path)
|
104
|
+
call filter(rtp,'v:val[0:strlen(path)-1] !=# path')
|
105
|
+
let &rtp = pathogen#join(pathogen#uniq(before + rtp + after))
|
106
|
+
return &rtp
|
107
|
+
endfunction " }}}1
|
108
|
+
|
109
|
+
" For each directory in rtp, check for a subdirectory named dir. If it
|
110
|
+
" exists, add all subdirectories of that subdirectory to the rtp, immediately
|
111
|
+
" after the original directory. If no argument is given, 'bundle' is used.
|
112
|
+
" Repeated calls with the same arguments are ignored.
|
113
|
+
function! pathogen#runtime_append_all_bundles(...) " {{{1
|
114
|
+
let sep = pathogen#separator()
|
115
|
+
let name = a:0 ? a:1 : 'bundle'
|
116
|
+
let list = []
|
117
|
+
for dir in pathogen#split(&rtp)
|
118
|
+
if dir =~# '\<after$'
|
119
|
+
let list += pathogen#glob_directories(substitute(dir,'after$',name.sep.'*[^~]'.sep.'after','')) + [dir]
|
120
|
+
else
|
121
|
+
let list += [dir] + pathogen#glob_directories(dir.sep.name.sep.'*[^~]')
|
122
|
+
endif
|
123
|
+
endfor
|
124
|
+
let &rtp = pathogen#join(pathogen#uniq(list))
|
125
|
+
return 1
|
126
|
+
endfunction
|
127
|
+
|
128
|
+
" }}}1
|
129
|
+
|
130
|
+
" Invoke :helptags on all non-$VIM doc directories in runtimepath.
|
131
|
+
function! pathogen#helptags() " {{{1
|
132
|
+
for dir in pathogen#split(&rtp)
|
133
|
+
if dir[0 : strlen($VIM)-1] !=# $VIM && isdirectory(dir.'/doc') && (!filereadable(dir.'/doc/tags') || filewritable(dir.'/doc/tags'))
|
134
|
+
helptags `=dir.'/doc'`
|
135
|
+
endif
|
136
|
+
endfor
|
137
|
+
endfunction " }}}1
|
138
|
+
|
139
|
+
" vim:set ft=vim ts=8 sw=2 sts=2:
|
data/lib/vimmy.rb
ADDED
data/lib/vimmy/cli.rb
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
require "fileutils"
|
2
|
+
require "mechanize"
|
3
|
+
require "thor"
|
4
|
+
require "vimmy"
|
5
|
+
|
6
|
+
class Vimmy::CLI < Thor
|
7
|
+
|
8
|
+
desc "init", "Initialize a local vim configuration"
|
9
|
+
|
10
|
+
def init
|
11
|
+
backup "~/.vimrc"
|
12
|
+
backup "~/.vim"
|
13
|
+
mkdir ".vim/autoload"
|
14
|
+
mkdir ".vim/bundle"
|
15
|
+
template ".vimrc"
|
16
|
+
template ".vim/autoload/pathogen.vim"
|
17
|
+
end
|
18
|
+
|
19
|
+
desc "search TERM", "Search for a vim plugin"
|
20
|
+
|
21
|
+
def search(term)
|
22
|
+
display matching(term)
|
23
|
+
end
|
24
|
+
|
25
|
+
desc "install TERM", "Install a vim plugin"
|
26
|
+
|
27
|
+
def install(term)
|
28
|
+
url = choose(matching(term), "Choose a plugin to install")
|
29
|
+
end
|
30
|
+
|
31
|
+
private ######################################################################
|
32
|
+
|
33
|
+
def backup(file)
|
34
|
+
expanded = File.expand_path(file)
|
35
|
+
if File.exists?(expanded)
|
36
|
+
print "#{file} already exists, move to #{file}.old? [y/N]: "
|
37
|
+
if STDIN.gets.strip.downcase == "y"
|
38
|
+
FileUtils.mv(expanded, "#{expanded}.old")
|
39
|
+
else
|
40
|
+
exit 1
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def choose(plugins, prompt)
|
46
|
+
display plugins
|
47
|
+
print "#{prompt}: "
|
48
|
+
|
49
|
+
if (index = STDIN.gets.to_i) > 0
|
50
|
+
return unless plugin = sort(plugins)[index-1]
|
51
|
+
install_plugin plugin.first
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def display(plugins)
|
56
|
+
sort(plugins).each_with_index do |(url, plugin), index|
|
57
|
+
puts "%d) %-28s %s" % [index+1, plugin[:name][0,28], plugin[:description][0,50]]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def header
|
62
|
+
puts "%-28s %s" % %w(Name Description)
|
63
|
+
puts "%-28s %s" % ["="*28, "="*50]
|
64
|
+
end
|
65
|
+
|
66
|
+
def install_plugin(url)
|
67
|
+
system %{ cd ~/.vim/bundle && git clone #{url}.git }
|
68
|
+
end
|
69
|
+
|
70
|
+
def matching(term)
|
71
|
+
plugins.select do |url, plugin|
|
72
|
+
[plugin[:name], plugin[:description]].join(" ") =~ /#{term}/i
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def mkdir(dir)
|
77
|
+
FileUtils.mkdir_p(File.expand_path("~/#{dir}"))
|
78
|
+
end
|
79
|
+
|
80
|
+
def plugins
|
81
|
+
page = Mechanize.new.get('http://vim-scripts.org/vim/scripts.html')
|
82
|
+
page.search('//tr').inject({}) do |hash, row|
|
83
|
+
link = row.search('td/a').first
|
84
|
+
hash.update(link.attributes['href'] => {
|
85
|
+
:name => link.text,
|
86
|
+
:description => row.search('td')[3].text
|
87
|
+
})
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def sort(plugins)
|
92
|
+
plugins.sort_by { |p| p.last[:name] }
|
93
|
+
end
|
94
|
+
|
95
|
+
def template(file)
|
96
|
+
source = File.expand_path("../../../data/template/#{file}", __FILE__)
|
97
|
+
target = File.expand_path("~/#{file}", __FILE__)
|
98
|
+
FileUtils.cp(source, target)
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
data/vimmy.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "vimmy/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "vimmy"
|
7
|
+
s.version = Vimmy::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = "David Dollar"
|
10
|
+
s.email = "ddollar@gmail.com"
|
11
|
+
s.homepage = "http://github.com/ddollar/vimmy"
|
12
|
+
s.summary = "Manage vim plugins"
|
13
|
+
s.description = s.summary
|
14
|
+
|
15
|
+
s.rubyforge_project = "vimmy"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_dependency "mechanize", "~> 1.0.0"
|
23
|
+
s.add_dependency "thor", "~> 0.14.6"
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,109 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vimmy
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- David Dollar
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-11-24 00:00:00 -05:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: mechanize
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 23
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 0
|
33
|
+
- 0
|
34
|
+
version: 1.0.0
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: thor
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 43
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
- 14
|
49
|
+
- 6
|
50
|
+
version: 0.14.6
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description: Manage vim plugins
|
54
|
+
email: ddollar@gmail.com
|
55
|
+
executables:
|
56
|
+
- vimmy
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files: []
|
60
|
+
|
61
|
+
files:
|
62
|
+
- .gitignore
|
63
|
+
- Gemfile
|
64
|
+
- Gemfile.lock
|
65
|
+
- README.md
|
66
|
+
- Rakefile
|
67
|
+
- bin/vimmy
|
68
|
+
- data/template/.vim/autoload/pathogen.vim
|
69
|
+
- data/template/.vimrc
|
70
|
+
- lib/vimmy.rb
|
71
|
+
- lib/vimmy/cli.rb
|
72
|
+
- lib/vimmy/version.rb
|
73
|
+
- vimmy.gemspec
|
74
|
+
has_rdoc: true
|
75
|
+
homepage: http://github.com/ddollar/vimmy
|
76
|
+
licenses: []
|
77
|
+
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
|
81
|
+
require_paths:
|
82
|
+
- lib
|
83
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
84
|
+
none: false
|
85
|
+
requirements:
|
86
|
+
- - ">="
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
hash: 3
|
89
|
+
segments:
|
90
|
+
- 0
|
91
|
+
version: "0"
|
92
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
94
|
+
requirements:
|
95
|
+
- - ">="
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
hash: 3
|
98
|
+
segments:
|
99
|
+
- 0
|
100
|
+
version: "0"
|
101
|
+
requirements: []
|
102
|
+
|
103
|
+
rubyforge_project: vimmy
|
104
|
+
rubygems_version: 1.3.7
|
105
|
+
signing_key:
|
106
|
+
specification_version: 3
|
107
|
+
summary: Manage vim plugins
|
108
|
+
test_files: []
|
109
|
+
|