pry 0.9.0pre3-java → 0.9.4pre2-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.
Files changed (47) hide show
  1. data/.gitignore +1 -0
  2. data/CHANGELOG +84 -6
  3. data/CONTRIBUTORS +13 -0
  4. data/README.markdown +23 -183
  5. data/Rakefile +22 -19
  6. data/TODO +36 -6
  7. data/bin/pry +12 -1
  8. data/lib/pry.rb +60 -12
  9. data/lib/pry/command_context.rb +21 -0
  10. data/lib/pry/command_processor.rb +62 -16
  11. data/lib/pry/command_set.rb +25 -11
  12. data/lib/pry/commands.rb +0 -3
  13. data/lib/pry/completion.rb +6 -6
  14. data/lib/pry/config.rb +25 -5
  15. data/lib/pry/default_commands/basic.rb +27 -6
  16. data/lib/pry/default_commands/context.rb +84 -35
  17. data/lib/pry/default_commands/documentation.rb +69 -31
  18. data/lib/pry/default_commands/easter_eggs.rb +5 -0
  19. data/lib/pry/default_commands/input.rb +193 -56
  20. data/lib/pry/default_commands/introspection.rb +98 -50
  21. data/lib/pry/default_commands/ls.rb +51 -21
  22. data/lib/pry/default_commands/shell.rb +57 -13
  23. data/lib/pry/extended_commands/experimental.rb +0 -32
  24. data/lib/pry/extended_commands/user_command_api.rb +33 -2
  25. data/lib/pry/helpers/base_helpers.rb +30 -10
  26. data/lib/pry/helpers/command_helpers.rb +75 -16
  27. data/lib/pry/helpers/text.rb +12 -11
  28. data/lib/pry/history.rb +61 -0
  29. data/lib/pry/plugins.rb +23 -12
  30. data/lib/pry/pry_class.rb +51 -50
  31. data/lib/pry/pry_instance.rb +129 -119
  32. data/lib/pry/version.rb +1 -1
  33. data/pry.gemspec +46 -0
  34. data/test/helper.rb +37 -3
  35. data/test/test_command_processor.rb +62 -19
  36. data/test/test_command_set.rb +40 -2
  37. data/test/test_completion.rb +27 -0
  38. data/test/test_default_commands/test_context.rb +185 -1
  39. data/test/test_default_commands/test_documentation.rb +10 -0
  40. data/test/test_default_commands/test_input.rb +207 -11
  41. data/test/test_default_commands/test_introspection.rb +20 -1
  42. data/test/test_default_commands/test_shell.rb +18 -0
  43. data/test/test_pry.rb +261 -45
  44. data/test/test_pry_history.rb +82 -0
  45. data/test/test_pry_output.rb +44 -0
  46. data/test/test_special_locals.rb +35 -0
  47. metadata +185 -159
@@ -3,6 +3,41 @@ class Pry
3
3
 
4
4
  Ls = Pry::CommandSet.new do
5
5
 
6
+ helpers do
7
+ def should_trim?(target, options)
8
+ if target.eval('self').is_a? Module
9
+ options[:e] || target.eval('self') >= Object
10
+ else
11
+ options[:e]
12
+ end
13
+ end
14
+
15
+ def trim_methods(target, options, visibility)
16
+ if should_trim?(target, options)
17
+ []
18
+ else
19
+ Object.send("#{visibility}_instance_methods")
20
+ end
21
+ end
22
+
23
+ def ls_color_map
24
+ {
25
+ "local variables" => :bright_red,
26
+ "instance variables" => :bright_blue,
27
+ "class variables" => :blue,
28
+ "global variables" => :bright_magenta,
29
+ "just singleton methods" => :green,
30
+ "public methods" => :green,
31
+ "private methods" => :green,
32
+ "protected methods" => :green,
33
+ "public instance methods" => :bright_green,
34
+ "private instance methods" => :bright_green,
35
+ "protected instance methods" => :bright_green,
36
+ "constants" => :red
37
+ }
38
+ end
39
+ end
40
+
6
41
  command "ls", "Show the list of vars and methods in the current scope. Type `ls --help` for more info." do |*args|
7
42
  options = {}
8
43
  # Set target local to the default -- note that we can set a different target for
@@ -59,10 +94,14 @@ Shows local and instance variables by default.
59
94
  options[:j] = true
60
95
  end
61
96
 
62
- opts.on("-s", "--super", "Include superclass entries (relevant to constant and methods options).") do
97
+ opts.on("-s", "--super", "Include superclass entries excluding Object (relevant to constant and methods options).") do
63
98
  options[:s] = true
64
99
  end
65
100
 
101
+ opts.on("-e", "--everything", "Include superclass entries including Object (must be combined with -s switch).") do
102
+ options[:e] = true
103
+ end
104
+
66
105
  opts.on("-a", "--all", "Display all types of entries.") do
67
106
  options[:a] = true
68
107
  end
@@ -126,19 +165,19 @@ Shows local and instance variables by default.
126
165
 
127
166
  info["global variables"] = [Array(target.eval("global_variables")).sort, i += 1] if options[:g] || options[:a]
128
167
 
129
- info["public methods"] = [Array(target.eval("public_methods(#{options[:s]})")).uniq.sort, i += 1] if (options[:m] && options[:P]) || options[:a]
168
+ info["public methods"] = [Array(target.eval("public_methods(#{options[:s]})")).uniq.sort - trim_methods(target, options, :public), i += 1] if (options[:m] && options[:P]) || options[:a]
130
169
 
131
- info["protected methods"] = [Array(target.eval("protected_methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:r]) || options[:a]
170
+ info["protected methods"] = [Array(target.eval("protected_methods(#{options[:s]})")).sort - trim_methods(target, options, :protected), i += 1] if (options[:m] && options[:r]) || options[:a]
132
171
 
133
- info["private methods"] = [Array(target.eval("private_methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:p]) || options[:a]
172
+ info["private methods"] = [Array(target.eval("private_methods(#{options[:s]})")).sort - trim_methods(target, options, :private), i += 1] if (options[:m] && options[:p]) || options[:a]
134
173
 
135
- info["just singleton methods"] = [Array(target.eval("methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:j]) || options[:a]
174
+ info["just singleton methods"] = [Array(target.eval("methods(#{options[:s]})")).sort, i += 1] if (options[:m] && options[:j]) && !options[:a]
136
175
 
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])
176
+ info["public instance methods"] = [Array(target.eval("public_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(target, options, :public), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:P]) || options[:a])
138
177
 
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])
178
+ info["protected instance methods"] = [Array(target.eval("protected_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(target, options, :protected), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:r]) || options[:a])
140
179
 
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])
180
+ info["private instance methods"] = [Array(target.eval("private_instance_methods(#{options[:s]})")).uniq.sort - trim_methods(target, options, :private), i += 1] if target_self.is_a?(Module) && ((options[:M] && options[:p]) || options[:a])
142
181
 
143
182
  # dealing with 1.8/1.9 compatibility issues :/
144
183
  csuper = options[:s]
@@ -159,11 +198,7 @@ Shows local and instance variables by default.
159
198
  if !v.first.empty?
160
199
  text << "#{k}:\n--\n"
161
200
  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
201
+ text << text().bright_green(filtered_list.join(" "))
167
202
  text << "\n\n"
168
203
  end
169
204
  end
@@ -176,14 +211,9 @@ Shows local and instance variables by default.
176
211
 
177
212
  # plain
178
213
  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(list.inspect, :ruby).term + "\n"
184
- else
185
- text << list.inspect + "\n"
186
- end
214
+ list = info.sort_by { |k, v| v.last }.map { |k, v| [k, [v.first.grep(options[:grep])], v.last] }
215
+ list = list.each { |k, v| text << text().send(ls_color_map[k], v.first.join(" ")); text << " " }
216
+
187
217
  if !options[:f]
188
218
  stagger_output(text)
189
219
  else
@@ -3,7 +3,7 @@ class Pry
3
3
 
4
4
  Shell = Pry::CommandSet.new do
5
5
 
6
- command(/\.(.*)/, "All text following a '.' is forwarded to the shell.", :listing => ".<shell command>") do |cmd|
6
+ command(/\.(.*)/, "All text following a '.' is forwarded to the shell.", :listing => ".<shell command>", :use_prefix => false) do |cmd|
7
7
  if cmd =~ /^cd\s+(.+)/i
8
8
  dest = $1
9
9
  begin
@@ -20,15 +20,15 @@ class Pry
20
20
  end
21
21
 
22
22
  command "shell-mode", "Toggle shell mode. Bring in pwd prompt and file completion." do
23
- case Pry.active_instance.prompt
23
+ case _pry_.prompt
24
24
  when Pry::SHELL_PROMPT
25
- Pry.active_instance.pop_prompt
26
- Pry.active_instance.custom_completions = Pry::DEFAULT_CUSTOM_COMPLETIONS
25
+ _pry_.pop_prompt
26
+ _pry_.custom_completions = Pry::DEFAULT_CUSTOM_COMPLETIONS
27
27
  else
28
- Pry.active_instance.push_prompt Pry::SHELL_PROMPT
29
- Pry.active_instance.custom_completions = Pry::FILE_COMPLETIONS
28
+ _pry_.push_prompt Pry::SHELL_PROMPT
29
+ _pry_.custom_completions = Pry::FILE_COMPLETIONS
30
30
  Readline.completion_proc = Pry::InputCompleter.build_completion_proc target,
31
- Pry.active_instance.instance_eval(&Pry::FILE_COMPLETIONS)
31
+ _pry_.instance_eval(&Pry::FILE_COMPLETIONS)
32
32
  end
33
33
  end
34
34
 
@@ -37,6 +37,7 @@ class Pry
37
37
  command "cat", "Show output of file FILE. Type `cat --help` for more information." do |*args|
38
38
  start_line = 0
39
39
  end_line = -1
40
+ file_name = nil
40
41
 
41
42
  opts = Slop.parse!(args) do |opt|
42
43
  opt.on :s, :start, "Start line (defaults to start of file)Line 1 is the first line.", true, :as => Integer do |line|
@@ -47,6 +48,20 @@ class Pry
47
48
  end_line = line - 1
48
49
  end
49
50
 
51
+ opt.on :ex, "Show a window of N lines either side of the last exception (defaults to 5).", :optional => true, :as => Integer do |window_size|
52
+ window_size ||= 5
53
+ ex = _pry_.last_exception
54
+ next if !ex
55
+ start_line = (ex.line - 1) - window_size
56
+ start_line = start_line < 0 ? 0 : start_line
57
+ end_line = (ex.line - 1) + window_size
58
+ if is_core_rbx_path?(ex.file)
59
+ file_name = rbx_convert_path_to_full(ex.file)
60
+ else
61
+ file_name = ex.file
62
+ end
63
+ end
64
+
50
65
  opt.on :l, "line-numbers", "Show line numbers."
51
66
  opt.on :t, :type, "The specific file type for syntax higlighting (e.g ruby, python)", true, :as => Symbol
52
67
  opt.on :f, :flood, "Do not use a pager to view text longer than one screen."
@@ -57,21 +72,50 @@ class Pry
57
72
 
58
73
  next if opts.help?
59
74
 
60
- file_name = args.shift
75
+ if opts.ex?
76
+ next output.puts "No Exception or Exception has no associated file." if file_name.nil?
77
+ next output.puts "Cannot cat exceptions raised in REPL." if Pry.eval_path == file_name
78
+ else
79
+ file_name = args.shift
80
+ end
81
+
61
82
  if !file_name
62
83
  output.puts "Must provide a file name."
63
84
  next
64
85
  end
65
86
 
66
- contents, normalized_start_line, _ = read_between_the_lines(file_name, start_line, end_line)
87
+ contents, _, _ = read_between_the_lines(file_name, start_line, end_line)
88
+ contents = syntax_highlight_by_file_type_or_specified(contents, file_name, opts[:type])
67
89
 
68
- if Pry.color
69
- contents = syntax_highlight_by_file_type_or_specified(contents, file_name, opts[:type])
90
+ if opts.l?
91
+ contents = text.with_line_numbers contents, start_line + 1
92
+ end
93
+
94
+ # add the arrow pointing to line that caused the exception
95
+ if opts.ex?
96
+ contents = text.with_line_numbers contents, start_line + 1, :bright_red
97
+
98
+ contents = contents.lines.each_with_index.map do |line, idx|
99
+ l = idx + start_line
100
+ if l == (_pry_.last_exception.line - 1)
101
+ " =>#{line}"
102
+ else
103
+ " #{line}"
104
+ end
105
+ end.join
106
+
107
+ # header for exceptions
108
+ output.puts "\n#{Pry::Helpers::Text.bold('Exception:')} #{_pry_.last_exception.class}: #{_pry_.last_exception.message}\n--"
109
+ output.puts "#{Pry::Helpers::Text.bold('From:')} #{file_name} @ line #{_pry_.last_exception.line}\n\n"
70
110
  end
71
111
 
72
112
  set_file_and_dir_locals(file_name)
73
- render_output(opts.flood?, opts.l? ? normalized_start_line + 1 : false, contents)
74
- contents
113
+
114
+ if opts.f?
115
+ output.puts contents
116
+ else
117
+ stagger_output(contents)
118
+ end
75
119
  end
76
120
  end
77
121
 
@@ -3,7 +3,6 @@ class Pry
3
3
 
4
4
  Experimental = Pry::CommandSet.new do
5
5
 
6
-
7
6
  command "reload-method", "Reload the source specifically for a method", :requires_gem => "method_reload" do |meth_name|
8
7
  if (meth = get_method_object(meth_name, target, {})).nil?
9
8
  output.puts "Invalid method name: #{meth_name}."
@@ -12,37 +11,6 @@ class Pry
12
11
 
13
12
  meth.reload
14
13
  end
15
-
16
- command "play", "Play a string as input" do |*args|
17
- Slop.parse!(args) do |opt|
18
- opt.banner "Usage: play-method [--replay START..END] [--clear] [--grep PATTERN] [--help]\n"
19
-
20
- opt.on :l, :lines, 'The line (or range of lines) to replay.', true, :as => Range
21
- opt.on :m, :method, 'Play a method.', true do |meth_name|
22
- if (meth = get_method_object(meth_name, target, {})).nil?
23
- output.puts "Invalid method name: #{meth_name}."
24
- next
25
- end
26
- code, code_type = code_and_code_type_for(meth)
27
- next if !code
28
-
29
- range = opt.l? ? opt[:l] : (0..-1)
30
-
31
- Pry.active_instance.input = StringIO.new(code[range])
32
- end
33
-
34
- opt.on :f, "file", 'The line (or range of lines) to replay.', true do |file_name|
35
- text = File.read File.expand_path(file_name)
36
- range = opt.l? ? opt[:l] : (0..-1)
37
-
38
- Pry.active_instance.input = StringIO.new(text[range])
39
- end
40
-
41
- opt.on :h, :help, "This message." do
42
- output.puts opt
43
- end
44
- end
45
- end
46
14
  end
47
15
  end
48
16
  end
@@ -3,11 +3,11 @@ class Pry
3
3
 
4
4
  UserCommandAPI = Pry::CommandSet.new do
5
5
 
6
- command "define-command", "To honor Mon-Ouie" do |arg|
6
+ command "define-command", "Define a command in the session, use same syntax as `command` method for command API" do |arg|
7
7
  next output.puts("Provide an arg!") if arg.nil?
8
8
 
9
9
  prime_string = "command #{arg_string}\n"
10
- command_string = Pry.active_instance.r(target, prime_string)
10
+ command_string = _pry_.r(target, prime_string)
11
11
 
12
12
  eval_string.replace <<-HERE
13
13
  _pry_.commands.instance_eval do
@@ -17,6 +17,37 @@ class Pry
17
17
 
18
18
  end
19
19
 
20
+ command "reload-command", "Reload a command. reload-command CMD_NAME CMD_SET" do |command_name, set_name|
21
+ next output.puts "Must provide command name" if command_name.nil?
22
+ next output.puts "Must provide command set name" if set_name.nil?
23
+
24
+ cmd = Pry.config.commands.commands[command_name]
25
+ file_name = cmd.block.source_location.first
26
+
27
+ silence_warnings do
28
+ load file_name
29
+ end
30
+ Pry.config.commands.import target.eval(set_name)
31
+ _pry_.commands.import target.eval(set_name)
32
+ set_file_and_dir_locals(file_name)
33
+ end
34
+
35
+ command "edit-command", "Edit a command. edit-command CMD_NAME CMD_SET" do |command_name, set_name|
36
+ next output.puts "Must provide command name" if command_name.nil?
37
+ next output.puts "Must provide a command set name" if set_name.nil?
38
+
39
+ cmd = Pry.config.commands.commands[command_name]
40
+ file_name = cmd.block.source_location.first
41
+
42
+ invoke_editor(*cmd.block.source_location)
43
+ silence_warnings do
44
+ load file_name
45
+ end
46
+ Pry.config.commands.import target.eval(set_name)
47
+ _pry_.commands.import target.eval(set_name)
48
+ set_file_and_dir_locals(file_name)
49
+ end
50
+
20
51
  end
21
52
  end
22
53
  end
@@ -2,6 +2,7 @@ class Pry
2
2
  module Helpers
3
3
 
4
4
  module BaseHelpers
5
+
5
6
  module_function
6
7
 
7
8
  def silence_warnings
@@ -35,10 +36,11 @@ class Pry
35
36
 
36
37
  def set_file_and_dir_locals(file_name)
37
38
  return if !target
38
- $_file_temp = File.expand_path(file_name)
39
- $_dir_temp = File.dirname($_file_temp)
40
- target.eval("_file_ = $_file_temp")
41
- target.eval("_dir_ = $_dir_temp")
39
+ _pry_.last_file = File.expand_path(file_name)
40
+ _pry_.inject_local("_file_", _pry_.last_file, target)
41
+
42
+ _pry_.last_dir = File.dirname(_pry_.last_file)
43
+ _pry_.inject_local("_dir_", _pry_.last_dir, target)
42
44
  end
43
45
 
44
46
  def stub_proc(name, options)
@@ -63,8 +65,16 @@ class Pry
63
65
  end
64
66
  end
65
67
 
68
+ def colorize_code(code)
69
+ if Pry.color
70
+ CodeRay.scan(code, :ruby).term
71
+ else
72
+ code
73
+ end
74
+ end
75
+
66
76
  def highlight(string, regexp, highlight_color=:bright_yellow)
67
- highlighted = string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" }
77
+ string.gsub(regexp) { |match| "<#{highlight_color}>#{match}</#{highlight_color}>" }
68
78
  end
69
79
 
70
80
  # formatting
@@ -77,8 +87,18 @@ class Pry
77
87
  27
78
88
  end
79
89
 
90
+ # are we on Jruby platform?
91
+ def jruby?
92
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
93
+ end
94
+
95
+ # are we on rbx platform?
96
+ def rbx?
97
+ defined?(RUBY_ENGINE) && RUBY_ENGINE =~ /rbx/
98
+ end
99
+
80
100
  # a simple pager for systems without `less`. A la windows.
81
- def simple_pager(text)
101
+ def simple_pager(text, output=output())
82
102
  text_array = text.lines.to_a
83
103
  text_array.each_slice(page_size) do |chunk|
84
104
  output.puts chunk.join
@@ -93,20 +113,20 @@ class Pry
93
113
  # Try to use `less` for paging, if it fails then use
94
114
  # simple_pager. Also do not page if Pry.pager is falsey
95
115
  # FIXME! Another JRuby hack
96
- def stagger_output(text)
116
+ def stagger_output(text, output=output())
97
117
  if text.lines.count < page_size || !Pry.pager
98
118
  output.puts text
99
119
  return
100
120
  end
101
121
 
102
122
  # FIXME! Another JRuby hack
103
- if Object.const_defined?(:RUBY_ENGINE) && RUBY_ENGINE =~ /jruby/
104
- simple_pager(text)
123
+ if jruby?
124
+ simple_pager(text, output)
105
125
  else
106
126
  lesspipe { |less| less.puts text }
107
127
  end
108
128
  rescue Errno::ENOENT
109
- simple_pager(text)
129
+ simple_pager(text, output)
110
130
  rescue Errno::EPIPE
111
131
  end
112
132
 
@@ -15,9 +15,9 @@ class Pry
15
15
  end
16
16
 
17
17
  # if start_line is not false then add line numbers starting with start_line
18
- def render_output(should_flood, start_line, text)
18
+ def render_output(should_flood, start_line, text, color=:blue)
19
19
  if start_line
20
- text = Pry::Helpers::Text.with_line_numbers text, start_line
20
+ text = Pry::Helpers::Text.with_line_numbers text, start_line, color
21
21
  end
22
22
 
23
23
  if should_flood
@@ -40,11 +40,14 @@ class Pry
40
40
  end
41
41
 
42
42
  ########### RBX HELPERS #############
43
+ def is_core_rbx_path?(path)
44
+ rbx? &&
45
+ path.start_with?("kernel")
46
+ end
47
+
43
48
  def rbx_core?(meth)
44
- defined?(RUBY_ENGINE) &&
45
- RUBY_ENGINE =~ /rbx/ &&
46
49
  meth.source_location &&
47
- meth.source_location.first.start_with?("kernel")
50
+ is_core_rbx_path?(meth.source_location.first)
48
51
  end
49
52
 
50
53
  def rvm_ruby?(path)
@@ -70,6 +73,28 @@ class Pry
70
73
  end
71
74
  end
72
75
 
76
+ def rbx_convert_path_to_full(path)
77
+ if rvm_ruby?(Rubinius::BIN_PATH)
78
+ rbx_rvm_convert_path_to_full(path)
79
+ else
80
+ rbx_std_convert_path_to_full(path)
81
+ end
82
+ end
83
+
84
+ def rbx_rvm_convert_path_to_full(path)
85
+ ruby_name = File.dirname(Rubinius::BIN_PATH).split("/").last
86
+ source_path = File.join(File.dirname(File.dirname(File.dirname(Rubinius::BIN_PATH))), "src", ruby_name)
87
+ file_name = File.join(source_path, path)
88
+ raise "Cannot find rbx core source" if !File.exists?(file_name)
89
+ file_name
90
+ end
91
+
92
+ def rbx_std_convert_path_to_full(path)
93
+ file_name = File.join(Rubinius::BIN_PATH, "..", path)
94
+ raise "Cannot find rbx core source" if !File.exists?(file_name)
95
+ file_name
96
+ end
97
+
73
98
  def rbx_core_path_line_for(meth)
74
99
  if rvm_ruby?(Rubinius::BIN_PATH)
75
100
  rvm_rbx_core_path_line_for(meth)
@@ -79,21 +104,14 @@ class Pry
79
104
  end
80
105
 
81
106
  def std_rbx_core_path_line_for(meth)
82
- file_name = File.join(Rubinius::BIN_PATH, "..", meth.source_location.first)
83
- raise "Cannot find rbx core source" if !File.exists?(file_name)
84
-
107
+ file_name = rbx_std_convert_path_to_full(meth.source_location.first)
85
108
  start_line = meth.source_location.last
86
109
 
87
110
  [file_name, start_line]
88
111
  end
89
112
 
90
113
  def rvm_rbx_core_path_line_for(meth)
91
- ruby_name = File.dirname(Rubinius::BIN_PATH).split("/").last
92
- source_path = File.join(File.dirname(File.dirname(File.dirname(Rubinius::BIN_PATH))), "src", ruby_name)
93
-
94
- file_name = File.join(source_path, meth.source_location.first)
95
- raise "Cannot find rbx core source" if !File.exists?(file_name)
96
-
114
+ file_name = rbx_rvm_convert_path_to_full(meth.source_location.first)
97
115
  start_line = meth.source_location.last
98
116
 
99
117
  [file_name, start_line]
@@ -255,7 +273,11 @@ class Pry
255
273
  end
256
274
 
257
275
  language_detected = file_type if file_type
258
- CodeRay.scan(contents, language_detected).term
276
+ if Pry.color
277
+ CodeRay.scan(contents, language_detected).term
278
+ else
279
+ contents
280
+ end
259
281
  end
260
282
 
261
283
  # convert negative line numbers to positive by wrapping around
@@ -286,7 +308,7 @@ class Pry
286
308
 
287
309
  def process_yardoc_tag(comment, tag)
288
310
  in_tag_block = nil
289
- output = comment.lines.map do |v|
311
+ comment.lines.map do |v|
290
312
  if in_tag_block && v !~ /^\S/
291
313
  Pry::Helpers::Text.strip_color Pry::Helpers::Text.strip_color(v)
292
314
  elsif in_tag_block
@@ -328,6 +350,43 @@ class Pry
328
350
  code.sub(/\A\s*\/\*.*?\*\/\s*/m, '')
329
351
  end
330
352
 
353
+ def invoke_editor(file, line)
354
+ if Pry.config.editor.respond_to?(:call)
355
+ editor_invocation = Pry.config.editor.call(file, line)
356
+ else
357
+ editor_invocation = "#{Pry.config.editor} #{start_line_syntax_for_editor(file, line)}"
358
+ end
359
+
360
+ if jruby?
361
+ require 'spoon'
362
+ pid = Spoon.spawnp(*editor_invocation.split)
363
+ Process.waitpid(pid)
364
+ else
365
+ run ".#{editor_invocation}"
366
+ end
367
+ end
368
+
369
+ def start_line_syntax_for_editor(file_name, line_number)
370
+ file_name = file_name.gsub(/\//, '\\') if RUBY_PLATFORM =~ /mswin|mingw/
371
+
372
+ case Pry.config.editor
373
+ when /^[gm]?vi/, /^emacs/, /^nano/, /^pico/, /^gedit/, /^kate/
374
+ "+#{line_number} #{file_name}"
375
+ when /^mate/, /^geany/
376
+ "-l #{line_number} #{file_name}"
377
+ when /^uedit32/
378
+ "#{file_name}/#{line_number}"
379
+ when /^jedit/
380
+ "#{file_name} +line:#{line_number}"
381
+ else
382
+ if RUBY_PLATFORM =~ /mswin|mingw/
383
+ "#{file_name}"
384
+ else
385
+ "+#{line_number} #{file_name}"
386
+ end
387
+ end
388
+ end
389
+
331
390
  def prompt(message, options="Yn")
332
391
  opts = options.scan(/./)
333
392
  optstring = opts.join("/") # case maintained