vimmy 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|