pry 0.8.3-java → 0.8.4pre1-java
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/.document +2 -0
- data/.gitignore +8 -0
- data/.yardopts +1 -0
- data/README.markdown +10 -6
- data/Rakefile +15 -23
- data/TODO +62 -0
- data/bin/pry +3 -1
- data/lib/pry.rb +6 -7
- data/lib/pry/command_context.rb +29 -0
- data/lib/pry/command_processor.rb +15 -28
- data/lib/pry/command_set.rb +234 -0
- data/lib/pry/commands.rb +15 -861
- data/lib/pry/core_extensions.rb +40 -48
- data/lib/pry/default_commands/context.rb +127 -0
- data/lib/pry/default_commands/documentation.rb +145 -0
- data/lib/pry/default_commands/easter_eggs.rb +71 -0
- data/lib/pry/default_commands/gems.rb +59 -0
- data/lib/pry/default_commands/input.rb +38 -0
- data/lib/pry/default_commands/introspection.rb +190 -0
- data/lib/pry/default_commands/ls.rb +199 -0
- data/lib/pry/default_commands/shell.rb +90 -0
- data/lib/pry/helpers.rb +2 -0
- data/lib/pry/{command_base_helpers.rb → helpers/base_helpers.rb} +46 -21
- data/lib/pry/{command_helpers.rb → helpers/command_helpers.rb} +34 -36
- data/lib/pry/pry_class.rb +17 -11
- data/lib/pry/pry_instance.rb +59 -2
- data/lib/pry/version.rb +1 -1
- data/test/{test_helper.rb → helper.rb} +8 -2
- data/test/test_command_helpers.rb +77 -0
- data/test/test_commandset.rb +184 -0
- data/test/{test.rb → test_pry.rb} +164 -132
- data/wiki/Customizing-pry.md +397 -0
- data/wiki/Home.md +4 -0
- metadata +61 -41
- data/lib/pry/command_base.rb +0 -202
@@ -0,0 +1,38 @@
|
|
1
|
+
class Pry
|
2
|
+
module DefaultCommands
|
3
|
+
|
4
|
+
Input = Pry::CommandSet.new :input do
|
5
|
+
|
6
|
+
command "!", "Clear the input buffer. Useful if the parsing process goes wrong and you get stuck in the read loop." do
|
7
|
+
output.puts "Input buffer cleared!"
|
8
|
+
opts[:eval_string].clear
|
9
|
+
end
|
10
|
+
|
11
|
+
command "hist", "Show and replay Readline history. When given no args history is displayed.\nType `hist --help` for more info." do |*args|
|
12
|
+
hist_array = Readline::HISTORY.to_a
|
13
|
+
|
14
|
+
if args.empty?
|
15
|
+
text = add_line_numbers(hist_array.join("\n"), 0)
|
16
|
+
stagger_output(text)
|
17
|
+
next
|
18
|
+
end
|
19
|
+
|
20
|
+
opts = Slop.parse(args) do |opt|
|
21
|
+
opt.banner "Usage: hist [--replay START..END]\nView and replay history\nWhen given no args, history is displayed.\ne.g hist --replay 2..8"
|
22
|
+
opt.on :r, :replay, 'The line (or range of lines) to replay.', true, :as => Range
|
23
|
+
opt.on :h, :help, 'Show this message.', :tail => true do
|
24
|
+
output.puts opt.help
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
next if opts.h?
|
29
|
+
|
30
|
+
actions = Array(hist_array[opts[:replay]]).join("\n") + "\n"
|
31
|
+
Pry.active_instance.input = StringIO.new(actions)
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
class Pry
|
2
|
+
module DefaultCommands
|
3
|
+
|
4
|
+
Introspection = Pry::CommandSet.new :introspection do
|
5
|
+
|
6
|
+
command "show-method", "Show the source for METH. Type `show-method --help` for more info. Aliases: $, show-source" do |*args|
|
7
|
+
target = target()
|
8
|
+
|
9
|
+
opts = Slop.parse!(args) do |opts|
|
10
|
+
opts.banner %{Usage: show-method [OPTIONS] [METH]
|
11
|
+
Show the source for method METH. Tries instance methods first and then methods by default.
|
12
|
+
e.g: show-method hello_method
|
13
|
+
--
|
14
|
+
}
|
15
|
+
opts.on :l, "line-numbers", "Show line numbers."
|
16
|
+
opts.on :M, "instance-methods", "Operate on instance methods."
|
17
|
+
opts.on :m, :methods, "Operate on methods."
|
18
|
+
opts.on :f, :flood, "Do not use a pager to view text longer than one screen."
|
19
|
+
opts.on :c, :context, "Select object context to run under.", true do |context|
|
20
|
+
target = Pry.binding_for(target.eval(context))
|
21
|
+
end
|
22
|
+
opts.on :h, :help, "This message." do
|
23
|
+
output.puts opts
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
next if opts.help?
|
28
|
+
|
29
|
+
meth_name = args.shift
|
30
|
+
if (meth = get_method_object(meth_name, target, opts.to_hash(true))).nil?
|
31
|
+
output.puts "Invalid method name: #{meth_name}. Type `show-method --help` for help"
|
32
|
+
next
|
33
|
+
end
|
34
|
+
|
35
|
+
code, code_type = code_and_code_type_for(meth)
|
36
|
+
next if !code
|
37
|
+
|
38
|
+
output.puts make_header(meth, code_type, code)
|
39
|
+
if Pry.color
|
40
|
+
code = CodeRay.scan(code, code_type).term
|
41
|
+
end
|
42
|
+
|
43
|
+
start_line = false
|
44
|
+
if opts.l?
|
45
|
+
start_line = meth.source_location ? meth.source_location.last : 1
|
46
|
+
end
|
47
|
+
|
48
|
+
render_output(opts.flood?, start_line, code)
|
49
|
+
code
|
50
|
+
end
|
51
|
+
|
52
|
+
alias_command "show-source", "show-method", ""
|
53
|
+
alias_command "$", "show-method", ""
|
54
|
+
|
55
|
+
command "show-command", "Show the source for CMD. Type `show-command --help` for more info." do |*args|
|
56
|
+
options = {}
|
57
|
+
target = target()
|
58
|
+
command_name = nil
|
59
|
+
|
60
|
+
OptionParser.new do |opts|
|
61
|
+
opts.banner = %{Usage: show-command [OPTIONS] [CMD]
|
62
|
+
Show the source for command CMD.
|
63
|
+
e.g: show-command show-method
|
64
|
+
--
|
65
|
+
}
|
66
|
+
opts.on("-l", "--line-numbers", "Show line numbers.") do |line|
|
67
|
+
options[:l] = true
|
68
|
+
end
|
69
|
+
|
70
|
+
opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
|
71
|
+
options[:f] = true
|
72
|
+
end
|
73
|
+
|
74
|
+
opts.on_tail("-h", "--help", "This message.") do
|
75
|
+
output.puts opts
|
76
|
+
options[:h] = true
|
77
|
+
end
|
78
|
+
end.order(args) do |v|
|
79
|
+
command_name = v
|
80
|
+
end
|
81
|
+
|
82
|
+
next if options[:h]
|
83
|
+
|
84
|
+
if !command_name
|
85
|
+
output.puts "You must provide a command name."
|
86
|
+
next
|
87
|
+
end
|
88
|
+
|
89
|
+
if commands[command_name]
|
90
|
+
meth = commands[command_name].block
|
91
|
+
|
92
|
+
code = strip_leading_whitespace(meth.source)
|
93
|
+
file, line = meth.source_location
|
94
|
+
set_file_and_dir_locals(file)
|
95
|
+
check_for_dynamically_defined_method(meth)
|
96
|
+
|
97
|
+
output.puts make_header(meth, :ruby, code)
|
98
|
+
|
99
|
+
if Pry.color
|
100
|
+
code = CodeRay.scan(code, :ruby).term
|
101
|
+
end
|
102
|
+
|
103
|
+
render_output(options[:f], options[:l] ? meth.source_location.last : false, code)
|
104
|
+
code
|
105
|
+
else
|
106
|
+
output.puts "No such command: #{command_name}."
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
command "edit-method", "Edit a method. Type `edit-method --help` for more info." do |*args|
|
111
|
+
target = target()
|
112
|
+
|
113
|
+
opts = Slop.parse!(args) do |opts|
|
114
|
+
opts.banner %{Usage: edit-method [OPTIONS] [METH]
|
115
|
+
Edit the method METH in an editor.
|
116
|
+
Ensure #{bold("Pry.editor")} is set to your editor of choice.
|
117
|
+
e.g: edit-method hello_method
|
118
|
+
--
|
119
|
+
}
|
120
|
+
opts.on :M, "instance-methods", "Operate on instance methods."
|
121
|
+
opts.on :m, :methods, "Operate on methods."
|
122
|
+
opts.on "no-reload", "Do not automatically reload the method's file after editting."
|
123
|
+
opts.on :n, "no-jump", "Do not fast forward editor to first line of method."
|
124
|
+
opts.on :c, :context, "Select object context to run under.", true do |context|
|
125
|
+
target = Pry.binding_for(target.eval(context))
|
126
|
+
end
|
127
|
+
opts.on :h, :help, "This message." do
|
128
|
+
output.puts opts
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
next if opts.help?
|
133
|
+
|
134
|
+
meth_name = args.shift
|
135
|
+
if (meth = get_method_object(meth_name, target, opts.to_hash(true))).nil?
|
136
|
+
output.puts "Invalid method name: #{meth_name}."
|
137
|
+
next
|
138
|
+
end
|
139
|
+
|
140
|
+
next output.puts "Error: No editor set!\nEnsure that #{bold("Pry.editor")} is set to your editor of choice." if !Pry.editor
|
141
|
+
|
142
|
+
if is_a_c_method?(meth)
|
143
|
+
output.puts "Error: Can't edit a C method."
|
144
|
+
elsif is_a_dynamically_defined_method?(meth)
|
145
|
+
output.puts "Error: Can't edit an eval method."
|
146
|
+
|
147
|
+
# editor is invoked here
|
148
|
+
else
|
149
|
+
file, line = meth.source_location
|
150
|
+
set_file_and_dir_locals(file)
|
151
|
+
|
152
|
+
if Pry.editor.respond_to?(:call)
|
153
|
+
editor_invocation = Pry.editor.call(file, line)
|
154
|
+
else
|
155
|
+
# only use start line if -n option is not used
|
156
|
+
start_line_syntax = opts.n? ? "" : start_line_for_editor(line)
|
157
|
+
editor_invocation = "#{Pry.editor} #{start_line_syntax} #{file}"
|
158
|
+
end
|
159
|
+
|
160
|
+
run ".#{editor_invocation}"
|
161
|
+
silence_warnings do
|
162
|
+
load file if !opts["no-reload"]
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
|
168
|
+
helpers do
|
169
|
+
|
170
|
+
def start_line_for_editor(line_number)
|
171
|
+
case Pry.editor
|
172
|
+
when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
|
173
|
+
"+#{line_number}"
|
174
|
+
when /^mate/, /^geany/
|
175
|
+
"-l #{line_number}"
|
176
|
+
else
|
177
|
+
if RUBY_PLATFORM =~ /mswin|mingw/
|
178
|
+
""
|
179
|
+
else
|
180
|
+
"+#{line_number}"
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
@@ -0,0 +1,199 @@
|
|
1
|
+
class Pry
|
2
|
+
module DefaultCommands
|
3
|
+
|
4
|
+
Ls = Pry::CommandSet.new :ls do
|
5
|
+
|
6
|
+
command "ls", "Show the list of vars and methods in the current scope. Type `ls --help` for more info." do |*args|
|
7
|
+
options = {}
|
8
|
+
# Set target local to the default -- note that we can set a different target for
|
9
|
+
# ls if we like: e.g ls my_var
|
10
|
+
target = target()
|
11
|
+
|
12
|
+
OptionParser.new do |opts|
|
13
|
+
opts.banner = %{Usage: ls [OPTIONS] [VAR]\n\
|
14
|
+
List information about VAR (the current context by default).
|
15
|
+
Shows local and instance variables by default.
|
16
|
+
--
|
17
|
+
}
|
18
|
+
opts.on("-g", "--globals", "Display global variables.") do
|
19
|
+
options[:g] = true
|
20
|
+
end
|
21
|
+
|
22
|
+
opts.on("-c", "--constants", "Display constants.") do
|
23
|
+
options[:c] = true
|
24
|
+
end
|
25
|
+
|
26
|
+
opts.on("-l", "--locals", "Display locals.") do
|
27
|
+
options[:l] = true
|
28
|
+
end
|
29
|
+
|
30
|
+
opts.on("-i", "--ivars", "Display instance variables.") do
|
31
|
+
options[:i] = true
|
32
|
+
end
|
33
|
+
|
34
|
+
opts.on("-k", "--class-vars", "Display class variables.") do
|
35
|
+
options[:k] = true
|
36
|
+
end
|
37
|
+
|
38
|
+
opts.on("-m", "--methods", "Display methods (public methods by default).") do
|
39
|
+
options[:m] = true
|
40
|
+
end
|
41
|
+
|
42
|
+
opts.on("-M", "--instance-methods", "Display instance methods (only relevant to classes and modules).") do
|
43
|
+
options[:M] = true
|
44
|
+
end
|
45
|
+
|
46
|
+
opts.on("-P", "--public", "Display public methods (with -m).") do
|
47
|
+
options[:P] = true
|
48
|
+
end
|
49
|
+
|
50
|
+
opts.on("-r", "--protected", "Display protected methods (with -m).") do
|
51
|
+
options[:r] = true
|
52
|
+
end
|
53
|
+
|
54
|
+
opts.on("-p", "--private", "Display private methods (with -m).") do
|
55
|
+
options[:p] = true
|
56
|
+
end
|
57
|
+
|
58
|
+
opts.on("-j", "--just-singletons", "Display just the singleton methods (with -m).") do
|
59
|
+
options[:j] = true
|
60
|
+
end
|
61
|
+
|
62
|
+
opts.on("-s", "--super", "Include superclass entries (relevant to constant and methods options).") do
|
63
|
+
options[:s] = true
|
64
|
+
end
|
65
|
+
|
66
|
+
opts.on("-a", "--all", "Display all types of entries.") do
|
67
|
+
options[:a] = true
|
68
|
+
end
|
69
|
+
|
70
|
+
opts.on("-v", "--verbose", "Verbose ouput.") do
|
71
|
+
options[:v] = true
|
72
|
+
end
|
73
|
+
|
74
|
+
opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
|
75
|
+
options[:f] = true
|
76
|
+
end
|
77
|
+
|
78
|
+
opts.on("--grep REG", "Regular expression to be used.") do |reg|
|
79
|
+
options[:grep] = Regexp.new(reg)
|
80
|
+
end
|
81
|
+
|
82
|
+
opts.on_tail("-h", "--help", "Show this message.") do
|
83
|
+
output.puts opts
|
84
|
+
options[:h] = true
|
85
|
+
end
|
86
|
+
end.order(args) do |new_target|
|
87
|
+
target = Pry.binding_for(target.eval("#{new_target}")) if !options[:h]
|
88
|
+
end
|
89
|
+
|
90
|
+
# exit if we've displayed help
|
91
|
+
next if options[:h]
|
92
|
+
|
93
|
+
# default is locals/ivars/class vars.
|
94
|
+
# Only occurs when no options or when only option is verbose
|
95
|
+
options.merge!({
|
96
|
+
:l => true,
|
97
|
+
:i => true,
|
98
|
+
:k => true
|
99
|
+
}) if options.empty? || (options.size == 1 && options[:v]) || (options.size == 1 && options[:grep])
|
100
|
+
|
101
|
+
options[:grep] = // if !options[:grep]
|
102
|
+
|
103
|
+
|
104
|
+
# Display public methods by default if -m or -M switch is used.
|
105
|
+
options[:P] = true if (options[:m] || options[:M]) && !(options[:p] || options[:r] || options[:j])
|
106
|
+
|
107
|
+
info = {}
|
108
|
+
target_self = target.eval('self')
|
109
|
+
|
110
|
+
# ensure we have a real boolean and not a `nil` (important when
|
111
|
+
# interpolating in the string)
|
112
|
+
options[:s] = !!options[:s]
|
113
|
+
|
114
|
+
# Numbers (e.g 0, 1, 2) are for ordering the hash values in Ruby 1.8
|
115
|
+
i = -1
|
116
|
+
|
117
|
+
# Start collecting the entries selected by the user
|
118
|
+
info["local variables"] = [Array(target.eval("local_variables")).sort, i += 1] if options[:l] || options[:a]
|
119
|
+
info["instance variables"] = [Array(target.eval("instance_variables")).sort, i += 1] if options[:i] || options[:a]
|
120
|
+
|
121
|
+
info["class variables"] = [if target_self.is_a?(Module)
|
122
|
+
Array(target.eval("class_variables")).sort
|
123
|
+
else
|
124
|
+
Array(target.eval("self.class.class_variables")).sort
|
125
|
+
end, i += 1] if options[:k] || options[:a]
|
126
|
+
|
127
|
+
info["global variables"] = [Array(target.eval("global_variables")).sort, i += 1] if options[:g] || options[:a]
|
128
|
+
|
129
|
+
info["public methods"] = [Array(target.eval("public_methods(#{options[:s]})")).uniq.sort, i += 1] if (options[:m] && options[:P]) || options[:a]
|
130
|
+
|
131
|
+
info["protected methods"] = [Array(target.eval("protected_methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:r]) || options[:a]
|
132
|
+
|
133
|
+
info["private methods"] = [Array(target.eval("private_methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:p]) || options[:a]
|
134
|
+
|
135
|
+
info["just singleton methods"] = [Array(target.eval("methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:j]) || options[:a]
|
136
|
+
|
137
|
+
info["public instance methods"] = [Array(target.eval("public_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:P]) || options[:a])
|
138
|
+
|
139
|
+
info["protected instance methods"] = [Array(target.eval("protected_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:r]) || options[:a])
|
140
|
+
|
141
|
+
info["private instance methods"] = [Array(target.eval("private_instance_methods(#{options[:s]})")).uniq.sort, i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:p]) || options[:a])
|
142
|
+
|
143
|
+
# dealing with 1.8/1.9 compatibility issues :/
|
144
|
+
csuper = options[:s]
|
145
|
+
if Module.method(:constants).arity == 0
|
146
|
+
csuper = nil
|
147
|
+
end
|
148
|
+
|
149
|
+
info["constants"] = [Array(target_self.is_a?(Module) ? target.eval("constants(#{csuper})") :
|
150
|
+
target.eval("self.class.constants(#{csuper})")).uniq.sort, i += 1] if options[:c] || options[:a]
|
151
|
+
|
152
|
+
text = ""
|
153
|
+
|
154
|
+
# verbose output?
|
155
|
+
if options[:v]
|
156
|
+
# verbose
|
157
|
+
|
158
|
+
info.sort_by { |k, v| v.last }.each do |k, v|
|
159
|
+
if !v.first.empty?
|
160
|
+
text << "#{k}:\n--\n"
|
161
|
+
filtered_list = v.first.grep options[:grep]
|
162
|
+
if Pry.color
|
163
|
+
text << CodeRay.scan(Pry.view(filtered_list), :ruby).term + "\n"
|
164
|
+
else
|
165
|
+
text << Pry.view(filtered_list) + "\n"
|
166
|
+
end
|
167
|
+
text << "\n\n"
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
if !options[:f]
|
172
|
+
stagger_output(text)
|
173
|
+
else
|
174
|
+
output.puts text
|
175
|
+
end
|
176
|
+
|
177
|
+
# plain
|
178
|
+
else
|
179
|
+
list = info.values.sort_by(&:last).map(&:first).inject(&:+)
|
180
|
+
list = list.grep(options[:grep]) if list
|
181
|
+
list.uniq! if list
|
182
|
+
if Pry.color
|
183
|
+
text << CodeRay.scan(Pry.view(list), :ruby).term + "\n"
|
184
|
+
else
|
185
|
+
text << Pry.view(list) + "\n"
|
186
|
+
end
|
187
|
+
if !options[:f]
|
188
|
+
stagger_output(text)
|
189
|
+
else
|
190
|
+
output.puts text
|
191
|
+
end
|
192
|
+
list
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
class Pry
|
2
|
+
module DefaultCommands
|
3
|
+
|
4
|
+
Shell = Pry::CommandSet.new :shell do
|
5
|
+
|
6
|
+
# this cannot be accessed, it's just for help purposes.
|
7
|
+
command ".<shell command>", "All text following a '.' is forwarded to the shell." do
|
8
|
+
end
|
9
|
+
|
10
|
+
command "shell-mode", "Toggle shell mode. Bring in pwd prompt and file completion." do
|
11
|
+
case Pry.active_instance.prompt
|
12
|
+
when Pry::SHELL_PROMPT
|
13
|
+
Pry.active_instance.pop_prompt
|
14
|
+
Pry.active_instance.custom_completions = Pry::DEFAULT_CUSTOM_COMPLETIONS
|
15
|
+
else
|
16
|
+
Pry.active_instance.push_prompt Pry::SHELL_PROMPT
|
17
|
+
Pry.active_instance.custom_completions = Pry::FILE_COMPLETIONS
|
18
|
+
Readline.completion_proc = Pry::InputCompleter.build_completion_proc target,
|
19
|
+
Pry.active_instance.instance_eval(&Pry::FILE_COMPLETIONS)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
alias_command "file-mode", "shell-mode", ""
|
24
|
+
|
25
|
+
|
26
|
+
command "cat", "Show output of file FILE. Type `cat --help` for more information." do |*args|
|
27
|
+
options= {}
|
28
|
+
file_name = nil
|
29
|
+
start_line = 0
|
30
|
+
end_line = -1
|
31
|
+
file_type = nil
|
32
|
+
|
33
|
+
OptionParser.new do |opts|
|
34
|
+
opts.banner = %{Usage: cat [OPTIONS] FILE
|
35
|
+
Cat a file. Defaults to displaying whole file. Syntax highlights file if type is recognized.
|
36
|
+
e.g: cat hello.rb
|
37
|
+
--
|
38
|
+
}
|
39
|
+
opts.on("-l", "--line-numbers", "Show line numbers.") do |line|
|
40
|
+
options[:l] = true
|
41
|
+
end
|
42
|
+
|
43
|
+
opts.on("-s", "--start LINE", "Start line (defaults to start of file). Line 1 is the first line.") do |line|
|
44
|
+
start_line = line.to_i - 1
|
45
|
+
end
|
46
|
+
|
47
|
+
opts.on("-e", "--end LINE", "End line (defaults to end of file). Line -1 is the last line.") do |line|
|
48
|
+
end_line = line.to_i - 1
|
49
|
+
end
|
50
|
+
|
51
|
+
opts.on("-t", "--type TYPE", "The specific file type for syntax higlighting (e.g ruby, python, cpp, java)") do |type|
|
52
|
+
file_type = type.to_sym
|
53
|
+
end
|
54
|
+
|
55
|
+
opts.on("-f", "--flood", "Do not use a pager to view text longer than one screen.") do
|
56
|
+
options[:f] = true
|
57
|
+
end
|
58
|
+
|
59
|
+
opts.on_tail("-h", "--help", "This message.") do
|
60
|
+
output.puts opts
|
61
|
+
options[:h] = true
|
62
|
+
end
|
63
|
+
end.order(args) do |v|
|
64
|
+
file_name = v
|
65
|
+
end
|
66
|
+
|
67
|
+
next if options[:h]
|
68
|
+
|
69
|
+
if !file_name
|
70
|
+
output.puts "Must provide a file name."
|
71
|
+
next
|
72
|
+
end
|
73
|
+
|
74
|
+
contents, normalized_start_line, _ = read_between_the_lines(file_name, start_line, end_line)
|
75
|
+
|
76
|
+
if Pry.color
|
77
|
+
contents = syntax_highlight_by_file_type_or_specified(contents, file_name, file_type)
|
78
|
+
end
|
79
|
+
|
80
|
+
set_file_and_dir_locals(file_name)
|
81
|
+
render_output(options[:f], options[:l] ? normalized_start_line + 1 : false, contents)
|
82
|
+
contents
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|