utils 0.0.10 → 0.0.12
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/.rvmrc +3 -0
- data/Rakefile +2 -2
- data/VERSION +1 -1
- data/bin/chroot-libs +1 -1
- data/bin/discover +10 -95
- data/bin/edit +53 -38
- data/bin/search +10 -156
- data/bin/strip_spaces +17 -5
- data/bin/xmp +1 -1
- data/lib/utils.rb +3 -0
- data/lib/utils/config/gdb/ruby +1 -15
- data/lib/utils/config/irbrc +5 -3
- data/lib/utils/config/vim/autoload/Align.vim +6 -6
- data/lib/utils/config/vim/autoload/rails.vim +16 -16
- data/lib/utils/config/vim/autoload/sqlcomplete.vim +48 -48
- data/lib/utils/config/vim/autoload/vimball.vim +7 -7
- data/lib/utils/config/vim/ftplugin/xml.vim +26 -26
- data/lib/utils/config/vim/indent/IndentAnything_html.vim +1 -1
- data/lib/utils/config/vim/indent/javascript.vim +4 -4
- data/lib/utils/config/vim/plugin/Decho.vim +14 -14
- data/lib/utils/config/vim/plugin/IndentAnything.vim +26 -26
- data/lib/utils/config/vim/plugin/bufexplorer.vim +16 -16
- data/lib/utils/config/vim/plugin/cecutil.vim +16 -16
- data/lib/utils/config/vim/plugin/rubyextra.vim +11 -11
- data/lib/utils/config/vim/plugin/taglist.vim +4 -4
- data/lib/utils/config/vim/plugin/test/IndentAnything/test.js +2 -2
- data/lib/utils/config/vim/syntax/javascript.vim +2 -2
- data/lib/utils/config/vim/syntax/ragel.vim +3 -3
- data/lib/utils/config/vimrc +1 -1
- data/lib/utils/editor.rb +138 -0
- data/lib/utils/finder.rb +92 -0
- data/lib/utils/grepper.rb +156 -0
- data/lib/utils/version.rb +1 -1
- data/utils.gemspec +15 -15
- metadata +67 -93
- data/lib/utils/edit.rb +0 -33
data/.rvmrc
ADDED
data/Rakefile
CHANGED
@@ -15,8 +15,8 @@ GemHadar do
|
|
15
15
|
ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock'
|
16
16
|
readme 'README.rdoc'
|
17
17
|
|
18
|
-
dependency 'spruz', '~>0.2.
|
19
|
-
dependency 'term-ansicolor', '1.0
|
18
|
+
dependency 'spruz', '~>0.2.12'
|
19
|
+
dependency 'term-ansicolor', '~>1.0'
|
20
20
|
|
21
21
|
install_library do
|
22
22
|
libdir = CONFIG["sitelibdir"]
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.12
|
data/bin/chroot-libs
CHANGED
data/bin/discover
CHANGED
@@ -1,102 +1,15 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'utils'
|
4
|
-
include Utils
|
5
|
-
require '
|
6
|
-
require 'spruz/xt'
|
7
|
-
|
8
|
-
class ::String
|
9
|
-
include Term::ANSIColor
|
10
|
-
end
|
11
|
-
|
12
|
-
class ::File
|
13
|
-
include Utils::FileXt
|
14
|
-
end
|
15
|
-
|
16
|
-
class Finder
|
17
|
-
include Utils::Find
|
18
|
-
|
19
|
-
def initialize(opts = {})
|
20
|
-
@args = opts[:args] || {}
|
21
|
-
@roots = opts[:roots] || []
|
22
|
-
pattern_opts = opts.subhash(:pattern) | {
|
23
|
-
:cset => @args['a'],
|
24
|
-
:icase => @args['i'],
|
25
|
-
}
|
26
|
-
@pattern = @args['r'] ?
|
27
|
-
RegexpPattern.new(pattern_opts) :
|
28
|
-
FuzzyPattern.new(pattern_opts)
|
29
|
-
@directory = @args['d']
|
30
|
-
@only_directory = @args['D']
|
31
|
-
@pathes = []
|
32
|
-
end
|
33
|
-
|
34
|
-
attr_reader :pathes
|
35
|
-
|
36
|
-
def attempt_match?(path)
|
37
|
-
stat = File.stat(path)
|
38
|
-
stat.symlink? and stat = File.lstat(path)
|
39
|
-
if @only_directory
|
40
|
-
stat.directory?
|
41
|
-
elsif @directory
|
42
|
-
stat.directory? || stat.file? && (stat.size == 0 || File.ascii?(path))
|
43
|
-
else
|
44
|
-
stat.file? && (stat.size == 0 || File.ascii?(path))
|
45
|
-
end
|
46
|
-
rescue SystemCallError => e
|
47
|
-
warn "Caught #{e.class}: #{e}"
|
48
|
-
nil
|
49
|
-
end
|
50
|
-
|
51
|
-
def search
|
52
|
-
pathes = []
|
53
|
-
find(*@roots) { |file| pathes << file }
|
54
|
-
pathes.flatten!
|
55
|
-
pathes.uniq!
|
56
|
-
pathes.map! { |p| a = File.split(p) ; a.unshift(p) ; a }
|
57
|
-
@suffix = @args['I']
|
58
|
-
pathes = pathes.map! do |path, dir, file|
|
59
|
-
@suffix && @suffix != File.extname(file)[1..-1] and next
|
60
|
-
if do_match = attempt_match?(path) and $DEBUG
|
61
|
-
warn "Attempt match of #{path.inspect}"
|
62
|
-
end
|
63
|
-
if do_match and match = @pattern.match(file)
|
64
|
-
if FuzzyPattern === @pattern
|
65
|
-
current = 0
|
66
|
-
bold_file = ''
|
67
|
-
score, e = 0, 0
|
68
|
-
for i in 1...(match.size)
|
69
|
-
match[i] or next
|
70
|
-
b = match.begin(i)
|
71
|
-
bold_file << file[current...b]
|
72
|
-
bold_file << file[b, 1].bold
|
73
|
-
score += (b - e)
|
74
|
-
e = match.end(i)
|
75
|
-
current = b + 1
|
76
|
-
end
|
77
|
-
bold_file << match.post_match
|
78
|
-
[ score, file.size, path, File.join(dir, bold_file) ]
|
79
|
-
else
|
80
|
-
bold_file = file[0...match.begin(0)] <<
|
81
|
-
file[match.begin(0)...match.end(0)].bold <<
|
82
|
-
file[match.end(0)..-1]
|
83
|
-
[ 0, file.size, path, File.join(dir, bold_file) ]
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
pathes.compact!
|
88
|
-
@pathes, output = pathes.sort.transpose.values_at(-2, -1)
|
89
|
-
if !@args['e'] && output && !output.empty?
|
90
|
-
puts output
|
91
|
-
end
|
92
|
-
self
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
4
|
+
include Utils
|
5
|
+
require 'spruz/go'
|
96
6
|
include Spruz::GO
|
97
7
|
|
98
8
|
def edit_files(pathes)
|
99
|
-
|
9
|
+
editor = Utils::Edit::Editor.new do |config|
|
10
|
+
config.wait = true
|
11
|
+
end
|
12
|
+
editor.edit(*pathes)
|
100
13
|
end
|
101
14
|
|
102
15
|
def usage
|
@@ -123,7 +36,7 @@ Options are
|
|
123
36
|
end
|
124
37
|
|
125
38
|
args = go 'I:a:rdDcieh'
|
126
|
-
args['h'] and usage
|
39
|
+
args['h'] and usage
|
127
40
|
pattern = ARGV.shift or usage
|
128
41
|
roots = (ARGV.empty? ? [ Dir.pwd ] : ARGV).map { |f| File.expand_path(f) }
|
129
42
|
|
@@ -134,7 +47,9 @@ finder = Finder.new(
|
|
134
47
|
:pattern => pattern,
|
135
48
|
:args => args,
|
136
49
|
:roots => roots
|
137
|
-
).search
|
50
|
+
).search do |output|
|
51
|
+
puts output
|
52
|
+
end
|
138
53
|
if args['e']
|
139
54
|
edit_files finder.pathes
|
140
55
|
end
|
data/bin/edit
CHANGED
@@ -2,54 +2,69 @@
|
|
2
2
|
|
3
3
|
require 'spruz/go'
|
4
4
|
include Spruz::GO
|
5
|
-
require 'utils
|
6
|
-
include Utils
|
5
|
+
require 'utils'
|
6
|
+
include Utils
|
7
7
|
require 'tempfile'
|
8
8
|
|
9
|
-
|
9
|
+
def usage
|
10
|
+
puts <<-EOT
|
11
|
+
Usage: #{File.basename($0)} [OPTS] [PATHES]
|
10
12
|
|
11
|
-
|
12
|
-
servername = [ '--servername', "G#{ENV['USER'].upcase}" ]
|
13
|
-
serverlist = `#{vim} -g --serverlist`.split
|
14
|
-
remote = $opt['w'] ? '--remote-wait' : '--remote'
|
13
|
+
PATHES are the directory and file pathes that are opened in the vim.
|
15
14
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
15
|
+
Options are
|
16
|
+
|
17
|
+
-w open a buffer in vim and wait until it is deleted
|
18
|
+
-s read files and files:linenumbers from stdin and open them
|
19
|
+
-p DURATION pause for this many seconds to wait for vim's reaction
|
20
|
+
-h display this help
|
21
|
+
|
22
|
+
EOT
|
23
|
+
exit 1
|
24
|
+
end
|
25
|
+
|
26
|
+
$opt = go 'wp:sh'
|
27
|
+
$opt['h'] and usage
|
28
|
+
|
29
|
+
editor = Editor.new do |config|
|
30
|
+
config.wait = $opt['w']
|
31
|
+
config.pause_duration = ($opt['p'] || 1).to_i
|
32
|
+
end
|
33
|
+
|
34
|
+
if $opt['s']
|
35
|
+
begin
|
20
36
|
until STDIN.eof?
|
21
|
-
|
22
|
-
|
37
|
+
line = STDIN.gets
|
38
|
+
line = line.sub(/.*?([^:\s]+:)/, '\1')
|
39
|
+
editor.edit(line)
|
23
40
|
end
|
24
|
-
|
25
|
-
argv << file.path
|
26
|
-
elsif serverlist.member?(servername)
|
27
|
-
system *cmd(vim, '-g', servername, remote, "stupid_trick#{rand}")
|
28
|
-
sleep 1
|
29
|
-
exec *cmd(vim, '-g', servername, '--remote-send', '<ESC>:bw<CR>')
|
30
|
-
else
|
31
|
-
exec *cmd(vim, '-g', servername, remote)
|
41
|
+
rescue Interrupt
|
32
42
|
end
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
system *cmd(vim, '-g', servername, '--remote-send', "<ESC>:#$2<CR>")
|
42
|
-
else
|
43
|
-
system *cmd(vim, '-g', servername, remote, a)
|
43
|
+
else
|
44
|
+
argv = ARGV.dup
|
45
|
+
if argv.empty?
|
46
|
+
if !STDIN.tty?
|
47
|
+
file = File.new(File.join(Dir.tmpdir, "edit_tmp.#$$"), 'w')
|
48
|
+
until STDIN.eof?
|
49
|
+
buffer = STDIN.read(8192)
|
50
|
+
file.write buffer
|
44
51
|
end
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
52
|
+
file.close
|
53
|
+
argv << file.path
|
54
|
+
else
|
55
|
+
editor.ensure_running
|
56
|
+
end
|
57
|
+
end
|
58
|
+
unless argv.empty?
|
59
|
+
if editor.file_linenumber?(argv.first)
|
60
|
+
editor.wait = argv.size > 1
|
61
|
+
for current_file in argv
|
62
|
+
STDOUT.puts "Edit #{current_file}"
|
63
|
+
editor.edit current_file
|
49
64
|
end
|
65
|
+
else
|
66
|
+
editor.edit(*argv)
|
50
67
|
end
|
51
|
-
else
|
52
|
-
exec *cmd(vim, '-g', servername, remote, *argv)
|
53
68
|
end
|
54
69
|
end
|
55
70
|
exit 0
|
data/bin/search
CHANGED
@@ -2,164 +2,18 @@
|
|
2
2
|
# encoding: UTF-8
|
3
3
|
|
4
4
|
require 'utils'
|
5
|
-
include Utils
|
6
|
-
require '
|
7
|
-
require 'spruz/xt'
|
8
|
-
|
9
|
-
class ::String
|
10
|
-
include Term::ANSIColor
|
11
|
-
end
|
12
|
-
|
13
|
-
class ::File
|
14
|
-
include Utils::FileXt
|
15
|
-
end
|
16
|
-
|
17
|
-
class Grepper
|
18
|
-
PRUNE = /\A(\.svn|\.git|CVS|tmp)\Z/
|
19
|
-
SKIP = /(\A\.|\.sw[pon]\Z|~\Z)/
|
20
|
-
|
21
|
-
class Queue
|
22
|
-
def initialize(max_size)
|
23
|
-
@max_size, @data = max_size, []
|
24
|
-
end
|
25
|
-
|
26
|
-
attr_reader :max_size
|
27
|
-
|
28
|
-
def data
|
29
|
-
@data.dup
|
30
|
-
end
|
31
|
-
|
32
|
-
def push(x)
|
33
|
-
@data.shift if @data.size > @max_size
|
34
|
-
@data << x
|
35
|
-
self
|
36
|
-
end
|
37
|
-
alias << push
|
38
|
-
end
|
39
|
-
|
40
|
-
def initialize(opts = {})
|
41
|
-
@args = opts[:args] || {}
|
42
|
-
@roots = opts[:roots] || []
|
43
|
-
if n = @args.values_at(*%w[A B C]).compact.first
|
44
|
-
if n.to_s =~ /\A\d+\Z/ and (n = n.to_i) >= 1
|
45
|
-
@queue = Queue.new n
|
46
|
-
else
|
47
|
-
raise ArgumentError, "needs to be an integer number >= 1"
|
48
|
-
end
|
49
|
-
end
|
50
|
-
@pathes = []
|
51
|
-
pattern_opts = opts.subhash(:pattern) | {
|
52
|
-
:cset => @args['a'],
|
53
|
-
:icase => @args['i'],
|
54
|
-
}
|
55
|
-
@pattern = @args['R'] ?
|
56
|
-
FuzzyPattern.new(pattern_opts) :
|
57
|
-
RegexpPattern.new(pattern_opts)
|
58
|
-
@name_pattern =
|
59
|
-
if name_pattern = @args['N']
|
60
|
-
RegexpPattern.new(:pattern => name_pattern)
|
61
|
-
elsif name_pattern = @args['n']
|
62
|
-
FuzzyPattern.new(:pattern => name_pattern)
|
63
|
-
end
|
64
|
-
@skip_pattern =
|
65
|
-
if skip_pattern = @args['S']
|
66
|
-
RegexpPattern.new(:pattern => skip_pattern)
|
67
|
-
elsif skip_pattern = @args['s']
|
68
|
-
FuzzyPattern.new(:pattern => skip_pattern)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
attr_reader :pathes
|
73
|
-
|
74
|
-
def match(filename)
|
75
|
-
@filename = filename
|
76
|
-
bn = File.basename(filename)
|
77
|
-
@output = []
|
78
|
-
s = File.stat(filename)
|
79
|
-
if s.directory? && bn =~ PRUNE
|
80
|
-
$DEBUG and warn "Pruning '#{filename}'."
|
81
|
-
Utils::Find.prune
|
82
|
-
end
|
83
|
-
if s.file? && bn !~ SKIP && (!@name_pattern || @name_pattern.match(bn))
|
84
|
-
File.open(filename, 'rb') do |file|
|
85
|
-
if file.binary? != true
|
86
|
-
$DEBUG and warn "Matching '#{filename}'."
|
87
|
-
match_lines file
|
88
|
-
else
|
89
|
-
$DEBUG and warn "Skipping binary file '#{filename}'."
|
90
|
-
end
|
91
|
-
end
|
92
|
-
else
|
93
|
-
$DEBUG and warn "Skipping '#{filename}'."
|
94
|
-
end
|
95
|
-
unless @output.empty?
|
96
|
-
case
|
97
|
-
when @args['l'], @args['e']
|
98
|
-
@output.uniq!
|
99
|
-
@pathes.concat @output
|
100
|
-
else
|
101
|
-
STDOUT.puts @output
|
102
|
-
end
|
103
|
-
@output.clear
|
104
|
-
end
|
105
|
-
self
|
106
|
-
rescue SystemCallError => e
|
107
|
-
warn "Caught #{e.class}: #{e}"
|
108
|
-
nil
|
109
|
-
end
|
110
|
-
|
111
|
-
def match_lines(file)
|
112
|
-
for line in file
|
113
|
-
if m = @pattern.match(line)
|
114
|
-
@skip_pattern and @skip_pattern =~ line and next
|
115
|
-
line[m.begin(0)...m.end(0)] = m[0].on_yellow
|
116
|
-
@queue and @queue << line
|
117
|
-
if @args['l'] or @args['e']
|
118
|
-
@output << @filename
|
119
|
-
elsif @args['L']
|
120
|
-
@output << "#{@filename}:#{file.lineno}"
|
121
|
-
else
|
122
|
-
@output << "#{@filename}:#{file.lineno}".red
|
123
|
-
if @args['B'] or @args['C']
|
124
|
-
@output.concat @queue.data
|
125
|
-
else
|
126
|
-
@output << line
|
127
|
-
end
|
128
|
-
if @args['A'] or @args['C']
|
129
|
-
where = file.tell
|
130
|
-
@queue.max_size.times do
|
131
|
-
file.eof? and break
|
132
|
-
line = file.readline
|
133
|
-
@queue << line
|
134
|
-
@output << line
|
135
|
-
end
|
136
|
-
file.seek where
|
137
|
-
end
|
138
|
-
end
|
139
|
-
else
|
140
|
-
@queue and @queue << line
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
|
145
|
-
def search
|
146
|
-
@suffix = @args['I']
|
147
|
-
for dir in @roots
|
148
|
-
Utils::Find.find(dir) do |filename|
|
149
|
-
if !@suffix || @suffix == File.extname(filename)[1..-1]
|
150
|
-
match(filename)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
154
|
-
@pathes.sort!
|
155
|
-
self
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
5
|
+
include Utils
|
6
|
+
require 'spruz/go'
|
159
7
|
include Spruz::GO
|
160
8
|
|
161
9
|
def edit_files(pathes)
|
162
|
-
|
10
|
+
editor = Utils::Edit::Editor.new do |config|
|
11
|
+
config.wait = true
|
12
|
+
end
|
13
|
+
for (file, linenumber) in pathes.map { |p| p.split(':') }
|
14
|
+
STDERR.puts "Edit #{file}:#{linenumber}"
|
15
|
+
editor.edit_linenumber(file, linenumber)
|
16
|
+
end
|
163
17
|
end
|
164
18
|
|
165
19
|
def usage
|
@@ -193,7 +47,7 @@ Options are
|
|
193
47
|
end
|
194
48
|
|
195
49
|
args = go 'I:A:B:C:s:S:n:N:a:RcilLeh'
|
196
|
-
args['h'] and usage
|
50
|
+
args['h'] and usage
|
197
51
|
pattern = ARGV.shift or usage
|
198
52
|
roots = (ARGV.empty? ? [ Dir.pwd ] : ARGV).map { |f| File.expand_path(f) }
|
199
53
|
|