irb 1.0.0 → 1.4.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.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. data/.document +4 -0
  3. data/Gemfile +10 -2
  4. data/LICENSE.txt +3 -3
  5. data/README.md +3 -3
  6. data/Rakefile +17 -1
  7. data/doc/irb/irb-tools.rd.ja +184 -0
  8. data/doc/irb/irb.rd.ja +427 -0
  9. data/irb.gemspec +18 -4
  10. data/lib/irb/cmd/fork.rb +2 -4
  11. data/lib/irb/cmd/help.rb +10 -5
  12. data/lib/irb/cmd/info.rb +32 -0
  13. data/lib/irb/cmd/ls.rb +101 -0
  14. data/lib/irb/cmd/measure.rb +43 -0
  15. data/lib/irb/cmd/nop.rb +10 -4
  16. data/lib/irb/cmd/pushws.rb +0 -1
  17. data/lib/irb/cmd/show_source.rb +93 -0
  18. data/lib/irb/cmd/whereami.rb +20 -0
  19. data/lib/irb/color.rb +246 -0
  20. data/lib/irb/color_printer.rb +47 -0
  21. data/lib/irb/completion.rb +254 -55
  22. data/lib/irb/context.rb +165 -72
  23. data/lib/irb/easter-egg.rb +138 -0
  24. data/lib/irb/ext/change-ws.rb +0 -1
  25. data/lib/irb/ext/history.rb +47 -11
  26. data/lib/irb/ext/loader.rb +46 -20
  27. data/lib/irb/ext/multi-irb.rb +7 -7
  28. data/lib/irb/ext/save-history.rb +36 -11
  29. data/lib/irb/ext/tracer.rb +14 -2
  30. data/lib/irb/ext/use-loader.rb +4 -3
  31. data/lib/irb/ext/workspaces.rb +0 -1
  32. data/lib/irb/extend-command.rb +113 -63
  33. data/lib/irb/frame.rb +12 -7
  34. data/lib/irb/help.rb +0 -1
  35. data/lib/irb/init.rb +146 -26
  36. data/lib/irb/input-method.rb +287 -9
  37. data/lib/irb/inspector.rb +15 -11
  38. data/lib/irb/lc/error.rb +55 -16
  39. data/lib/irb/lc/help-message +25 -13
  40. data/lib/irb/lc/ja/error.rb +55 -14
  41. data/lib/irb/lc/ja/help-message +11 -6
  42. data/lib/irb/locale.rb +13 -4
  43. data/lib/irb/notifier.rb +12 -8
  44. data/lib/irb/output-method.rb +6 -6
  45. data/lib/irb/ruby-lex.rb +673 -992
  46. data/lib/irb/ruby_logo.aa +37 -0
  47. data/lib/irb/version.rb +2 -2
  48. data/lib/irb/workspace.rb +65 -21
  49. data/lib/irb/xmp.rb +1 -1
  50. data/lib/irb.rb +276 -96
  51. data/man/irb.1 +229 -0
  52. metadata +25 -31
  53. data/.gitignore +0 -9
  54. data/.travis.yml +0 -6
  55. data/lib/irb/lc/.document +0 -4
  56. data/lib/irb/ruby-token.rb +0 -267
  57. data/lib/irb/slex.rb +0 -282
data/lib/irb/context.rb CHANGED
@@ -22,10 +22,10 @@ module IRB
22
22
  #
23
23
  # The optional +input_method+ argument:
24
24
  #
25
- # +nil+:: uses stdin or Readline
25
+ # +nil+:: uses stdin or Reidline or Readline
26
26
  # +String+:: uses a File
27
27
  # +other+:: uses this as InputMethod
28
- def initialize(irb, workspace = nil, input_method = nil, output_method = nil)
28
+ def initialize(irb, workspace = nil, input_method = nil)
29
29
  @irb = irb
30
30
  if workspace
31
31
  @workspace = workspace
@@ -39,7 +39,22 @@ module IRB
39
39
  @rc = IRB.conf[:RC]
40
40
  @load_modules = IRB.conf[:LOAD_MODULES]
41
41
 
42
- @use_readline = IRB.conf[:USE_READLINE]
42
+ if IRB.conf.has_key?(:USE_SINGLELINE)
43
+ @use_singleline = IRB.conf[:USE_SINGLELINE]
44
+ elsif IRB.conf.has_key?(:USE_READLINE) # backward compatibility
45
+ @use_singleline = IRB.conf[:USE_READLINE]
46
+ else
47
+ @use_singleline = nil
48
+ end
49
+ if IRB.conf.has_key?(:USE_MULTILINE)
50
+ @use_multiline = IRB.conf[:USE_MULTILINE]
51
+ elsif IRB.conf.has_key?(:USE_REIDLINE) # backward compatibility
52
+ @use_multiline = IRB.conf[:USE_REIDLINE]
53
+ else
54
+ @use_multiline = nil
55
+ end
56
+ @use_colorize = IRB.conf[:USE_COLORIZE]
57
+ @use_autocomplete = IRB.conf[:USE_AUTOCOMPLETE]
43
58
  @verbose = IRB.conf[:VERBOSE]
44
59
  @io = nil
45
60
 
@@ -64,23 +79,42 @@ module IRB
64
79
 
65
80
  case input_method
66
81
  when nil
67
- case use_readline?
82
+ @io = nil
83
+ case use_multiline?
68
84
  when nil
69
- if (defined?(ReadlineInputMethod) && STDIN.tty? &&
70
- IRB.conf[:PROMPT_MODE] != :INF_RUBY)
71
- @io = ReadlineInputMethod.new
85
+ if STDIN.tty? && IRB.conf[:PROMPT_MODE] != :INF_RUBY && !use_singleline?
86
+ # Both of multiline mode and singleline mode aren't specified.
87
+ @io = ReidlineInputMethod.new
72
88
  else
73
- @io = StdioInputMethod.new
89
+ @io = nil
74
90
  end
75
91
  when false
76
- @io = StdioInputMethod.new
92
+ @io = nil
77
93
  when true
78
- if defined?(ReadlineInputMethod)
79
- @io = ReadlineInputMethod.new
94
+ @io = ReidlineInputMethod.new
95
+ end
96
+ unless @io
97
+ case use_singleline?
98
+ when nil
99
+ if (defined?(ReadlineInputMethod) && STDIN.tty? &&
100
+ IRB.conf[:PROMPT_MODE] != :INF_RUBY)
101
+ @io = ReadlineInputMethod.new
102
+ else
103
+ @io = nil
104
+ end
105
+ when false
106
+ @io = nil
107
+ when true
108
+ if defined?(ReadlineInputMethod)
109
+ @io = ReadlineInputMethod.new
110
+ else
111
+ @io = nil
112
+ end
80
113
  else
81
- @io = StdioInputMethod.new
114
+ @io = nil
82
115
  end
83
116
  end
117
+ @io = StdioInputMethod.new unless @io
84
118
 
85
119
  when String
86
120
  @io = FileInputMethod.new(input_method)
@@ -91,17 +125,22 @@ module IRB
91
125
  end
92
126
  self.save_history = IRB.conf[:SAVE_HISTORY] if IRB.conf[:SAVE_HISTORY]
93
127
 
94
- if output_method
95
- @output_method = output_method
96
- else
97
- @output_method = StdioOutputMethod.new
98
- end
128
+ @extra_doc_dirs = IRB.conf[:EXTRA_DOC_DIRS]
99
129
 
100
130
  @echo = IRB.conf[:ECHO]
101
131
  if @echo.nil?
102
132
  @echo = true
103
133
  end
104
- self.debug_level = IRB.conf[:DEBUG_LEVEL]
134
+
135
+ @echo_on_assignment = IRB.conf[:ECHO_ON_ASSIGNMENT]
136
+ if @echo_on_assignment.nil?
137
+ @echo_on_assignment = :truncate
138
+ end
139
+
140
+ @newline_before_multiline_output = IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]
141
+ if @newline_before_multiline_output.nil?
142
+ @newline_before_multiline_output = true
143
+ end
105
144
  end
106
145
 
107
146
  # The top-level workspace, see WorkSpace#main
@@ -111,18 +150,18 @@ module IRB
111
150
 
112
151
  # The toplevel workspace, see #home_workspace
113
152
  attr_reader :workspace_home
114
- # WorkSpace in the current context
153
+ # WorkSpace in the current context.
115
154
  attr_accessor :workspace
116
- # The current thread in this context
155
+ # The current thread in this context.
117
156
  attr_reader :thread
118
- # The current input method
157
+ # The current input method.
119
158
  #
120
- # Can be either StdioInputMethod, ReadlineInputMethod, FileInputMethod or
121
- # other specified when the context is created. See ::new for more
122
- # information on +input_method+.
159
+ # Can be either StdioInputMethod, ReadlineInputMethod,
160
+ # ReidlineInputMethod, FileInputMethod or other specified when the
161
+ # context is created. See ::new for more # information on +input_method+.
123
162
  attr_accessor :io
124
163
 
125
- # Current irb session
164
+ # Current irb session.
126
165
  attr_accessor :irb
127
166
  # A copy of the default <code>IRB.conf[:AP_NAME]</code>
128
167
  attr_accessor :ap_name
@@ -137,26 +176,34 @@ module IRB
137
176
  # +input_method+ passed to Context.new
138
177
  attr_accessor :irb_path
139
178
 
140
- # Whether +Readline+ is enabled or not.
179
+ # Whether multiline editor mode is enabled or not.
141
180
  #
142
- # A copy of the default <code>IRB.conf[:USE_READLINE]</code>
181
+ # A copy of the default <code>IRB.conf[:USE_MULTILINE]</code>
182
+ attr_reader :use_multiline
183
+ # Whether singleline editor mode is enabled or not.
143
184
  #
144
- # See #use_readline= for more information.
145
- attr_reader :use_readline
185
+ # A copy of the default <code>IRB.conf[:USE_SINGLELINE]</code>
186
+ attr_reader :use_singleline
187
+ # Whether colorization is enabled or not.
188
+ #
189
+ # A copy of the default <code>IRB.conf[:USE_COLORIZE]</code>
190
+ attr_reader :use_colorize
191
+ # A copy of the default <code>IRB.conf[:USE_AUTOCOMPLETE]</code>
192
+ attr_reader :use_autocomplete
146
193
  # A copy of the default <code>IRB.conf[:INSPECT_MODE]</code>
147
194
  attr_reader :inspect_mode
148
195
 
149
196
  # A copy of the default <code>IRB.conf[:PROMPT_MODE]</code>
150
197
  attr_reader :prompt_mode
151
- # Standard IRB prompt
198
+ # Standard IRB prompt.
152
199
  #
153
200
  # See IRB@Customizing+the+IRB+Prompt for more information.
154
201
  attr_accessor :prompt_i
155
- # IRB prompt for continuated strings
202
+ # IRB prompt for continuated strings.
156
203
  #
157
204
  # See IRB@Customizing+the+IRB+Prompt for more information.
158
205
  attr_accessor :prompt_s
159
- # IRB prompt for continuated statement (e.g. immediately after an +if+)
206
+ # IRB prompt for continuated statement. (e.g. immediately after an +if+)
160
207
  #
161
208
  # See IRB@Customizing+the+IRB+Prompt for more information.
162
209
  attr_accessor :prompt_c
@@ -165,17 +212,17 @@ module IRB
165
212
  # Can be either the default <code>IRB.conf[:AUTO_INDENT]</code>, or the
166
213
  # mode set by #prompt_mode=
167
214
  #
168
- # To enable auto-indentation in irb:
215
+ # To disable auto-indentation in irb:
169
216
  #
170
- # IRB.conf[:AUTO_INDENT] = true
217
+ # IRB.conf[:AUTO_INDENT] = false
171
218
  #
172
219
  # or
173
220
  #
174
- # irb_context.auto_indent_mode = true
221
+ # irb_context.auto_indent_mode = false
175
222
  #
176
223
  # or
177
224
  #
178
- # IRB.CurrentContext.auto_indent_mode = true
225
+ # IRB.CurrentContext.auto_indent_mode = false
179
226
  #
180
227
  # See IRB@Configuration for more information.
181
228
  attr_accessor :auto_indent_mode
@@ -196,9 +243,12 @@ module IRB
196
243
  #
197
244
  # If set to +false+, <code>^D</code> will quit irb.
198
245
  attr_accessor :ignore_eof
246
+ # Specify the installation locations of the ri file to be displayed in the
247
+ # document dialog.
248
+ attr_accessor :extra_doc_dirs
199
249
  # Whether to echo the return value to output or not.
200
250
  #
201
- # Uses IRB.conf[:ECHO] if available, or defaults to +true+.
251
+ # Uses <code>IRB.conf[:ECHO]</code> if available, or defaults to +true+.
202
252
  #
203
253
  # puts "hello"
204
254
  # # hello
@@ -207,14 +257,59 @@ module IRB
207
257
  # puts "omg"
208
258
  # # omg
209
259
  attr_accessor :echo
260
+ # Whether to echo for assignment expressions.
261
+ #
262
+ # If set to +false+, the value of assignment will not be shown.
263
+ #
264
+ # If set to +true+, the value of assignment will be shown.
265
+ #
266
+ # If set to +:truncate+, the value of assignment will be shown and truncated.
267
+ #
268
+ # It defaults to +:truncate+.
269
+ #
270
+ # a = "omg"
271
+ # #=> omg
272
+ #
273
+ # a = "omg" * 10
274
+ # #=> omgomgomgomgomgomgomg...
275
+ #
276
+ # IRB.CurrentContext.echo_on_assignment = false
277
+ # a = "omg"
278
+ #
279
+ # IRB.CurrentContext.echo_on_assignment = true
280
+ # a = "omg" * 10
281
+ # #=> omgomgomgomgomgomgomgomgomgomg
282
+ #
283
+ # To set the behaviour of showing on assignment in irb:
284
+ #
285
+ # IRB.conf[:ECHO_ON_ASSIGNMENT] = :truncate or true or false
286
+ #
287
+ # or
288
+ #
289
+ # irb_context.echo_on_assignment = :truncate or true or false
290
+ #
291
+ # or
292
+ #
293
+ # IRB.CurrentContext.echo_on_assignment = :truncate or true or false
294
+ attr_accessor :echo_on_assignment
295
+ # Whether a newline is put before multiline output.
296
+ #
297
+ # Uses <code>IRB.conf[:NEWLINE_BEFORE_MULTILINE_OUTPUT]</code> if available,
298
+ # or defaults to +true+.
299
+ #
300
+ # "abc\ndef"
301
+ # #=>
302
+ # abc
303
+ # def
304
+ # IRB.CurrentContext.newline_before_multiline_output = false
305
+ # "abc\ndef"
306
+ # #=> abc
307
+ # def
308
+ attr_accessor :newline_before_multiline_output
210
309
  # Whether verbose messages are displayed or not.
211
310
  #
212
311
  # A copy of the default <code>IRB.conf[:VERBOSE]</code>
213
312
  attr_accessor :verbose
214
- # The debug level of irb
215
- #
216
- # See #debug_level= for more information.
217
- attr_reader :debug_level
218
313
 
219
314
  # The limit of backtrace lines displayed as top +n+ and tail +n+.
220
315
  #
@@ -225,18 +320,36 @@ module IRB
225
320
  # See IRB@Command+line+options for more command line options.
226
321
  attr_accessor :back_trace_limit
227
322
 
228
- # Alias for #use_readline
229
- alias use_readline? use_readline
323
+ # Alias for #use_multiline
324
+ alias use_multiline? use_multiline
325
+ # Alias for #use_singleline
326
+ alias use_singleline? use_singleline
327
+ # backward compatibility
328
+ alias use_reidline use_multiline
329
+ # backward compatibility
330
+ alias use_reidline? use_multiline
331
+ # backward compatibility
332
+ alias use_readline use_singleline
333
+ # backward compatibility
334
+ alias use_readline? use_singleline
335
+ # Alias for #use_colorize
336
+ alias use_colorize? use_colorize
337
+ # Alias for #use_autocomplete
338
+ alias use_autocomplete? use_autocomplete
230
339
  # Alias for #rc
231
340
  alias rc? rc
232
341
  alias ignore_sigint? ignore_sigint
233
342
  alias ignore_eof? ignore_eof
234
343
  alias echo? echo
344
+ alias echo_on_assignment? echo_on_assignment
345
+ alias newline_before_multiline_output? newline_before_multiline_output
235
346
 
236
347
  # Returns whether messages are displayed or not.
237
348
  def verbose?
238
349
  if @verbose.nil?
239
- if defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
350
+ if @io.kind_of?(ReidlineInputMethod)
351
+ false
352
+ elsif defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
240
353
  false
241
354
  elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
242
355
  true
@@ -249,9 +362,11 @@ module IRB
249
362
  end
250
363
 
251
364
  # Whether #verbose? is +true+, and +input_method+ is either
252
- # StdioInputMethod or ReadlineInputMethod, see #io for more information.
365
+ # StdioInputMethod or ReidlineInputMethod or ReadlineInputMethod, see #io
366
+ # for more information.
253
367
  def prompting?
254
368
  verbose? || (STDIN.tty? && @io.kind_of?(StdioInputMethod) ||
369
+ @io.kind_of?(ReidlineInputMethod) ||
255
370
  (defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
256
371
  end
257
372
 
@@ -276,6 +391,7 @@ module IRB
276
391
  @prompt_c = pconf[:PROMPT_C]
277
392
  @prompt_n = pconf[:PROMPT_N]
278
393
  @return_format = pconf[:RETURN]
394
+ @return_format = "%s\n" if @return_format == nil
279
395
  if ai = pconf.include?(:AUTO_INDENT)
280
396
  @auto_indent_mode = ai
281
397
  else
@@ -350,36 +466,11 @@ module IRB
350
466
  @inspect_mode
351
467
  end
352
468
 
353
- # Obsolete method.
354
- #
355
- # Can be set using the +--noreadline+ and +--readline+ command line
356
- # options.
357
- #
358
- # See IRB@Command+line+options for more command line options.
359
- def use_readline=(opt)
360
- print "This method is obsolete."
361
- print "Do nothing."
362
- end
363
-
364
- # Sets the debug level of irb
365
- #
366
- # Can also be set using the +--irb_debug+ command line option.
367
- #
368
- # See IRB@Command+line+options for more command line options.
369
- def debug_level=(value)
370
- @debug_level = value
371
- RubyLex.debug_level = value
372
- end
373
-
374
- # Whether or not debug mode is enabled, see #debug_level=.
375
- def debug?
376
- @debug_level > 0
377
- end
378
-
379
469
  def evaluate(line, line_no, exception: nil) # :nodoc:
380
470
  @line_no = line_no
381
471
  if exception
382
- line = "begin ::Kernel.raise _; rescue _.class; #{line}; end"
472
+ line_no -= 1
473
+ line = "begin ::Kernel.raise _; rescue _.class\n#{line}\n""end"
383
474
  @workspace.local_variable_set(:_, exception)
384
475
  end
385
476
  set_last_value(@workspace.evaluate(self, line, irb_path, line_no))
@@ -393,6 +484,8 @@ module IRB
393
484
  # Exits the current session, see IRB.irb_exit
394
485
  def exit(ret = 0)
395
486
  IRB.irb_exit(@irb, ret)
487
+ rescue UncaughtThrowError
488
+ super
396
489
  end
397
490
 
398
491
  NOPRINTING_IVARS = ["@last_value"] # :nodoc:
@@ -0,0 +1,138 @@
1
+ require "reline"
2
+
3
+ module IRB
4
+ class << self
5
+ class Vec
6
+ def initialize(x, y, z)
7
+ @x, @y, @z = x, y, z
8
+ end
9
+
10
+ attr_reader :x, :y, :z
11
+
12
+ def sub(other)
13
+ Vec.new(@x - other.x, @y - other.y, @z - other.z)
14
+ end
15
+
16
+ def dot(other)
17
+ @x*other.x + @y*other.y + @z*other.z
18
+ end
19
+
20
+ def cross(other)
21
+ ox, oy, oz = other.x, other.y, other.z
22
+ Vec.new(@y*oz-@z*oy, @z*ox-@x*oz, @x*oy-@y*ox)
23
+ end
24
+
25
+ def normalize
26
+ r = Math.sqrt(self.dot(self))
27
+ Vec.new(@x / r, @y / r, @z / r)
28
+ end
29
+ end
30
+
31
+ class Canvas
32
+ def initialize((h, w))
33
+ @data = (0..h-2).map { [0] * w }
34
+ @scale = [w / 2.0, h-2].min
35
+ @center = Complex(w / 2, h-2)
36
+ end
37
+
38
+ def line((x1, y1), (x2, y2))
39
+ p1 = Complex(x1, y1) / 2 * @scale + @center
40
+ p2 = Complex(x2, y2) / 2 * @scale + @center
41
+ line0(p1, p2)
42
+ end
43
+
44
+ private def line0(p1, p2)
45
+ mid = (p1 + p2) / 2
46
+ if (p1 - p2).abs < 1
47
+ x, y = mid.rect
48
+ @data[y / 2][x] |= (y % 2 > 1 ? 2 : 1)
49
+ else
50
+ line0(p1, mid)
51
+ line0(p2, mid)
52
+ end
53
+ end
54
+
55
+ def draw
56
+ @data.each {|row| row.fill(0) }
57
+ yield
58
+ @data.map {|row| row.map {|n| " ',;"[n] }.join }.join("\n")
59
+ end
60
+ end
61
+
62
+ class RubyModel
63
+ def initialize
64
+ @faces = init_ruby_model
65
+ end
66
+
67
+ def init_ruby_model
68
+ cap_vertices = (0..5).map {|i| Vec.new(*Complex.polar(1, i * Math::PI / 3).rect, 1) }
69
+ middle_vertices = (0..5).map {|i| Vec.new(*Complex.polar(2, (i + 0.5) * Math::PI / 3).rect, 0) }
70
+ bottom_vertex = Vec.new(0, 0, -2)
71
+
72
+ faces = [cap_vertices]
73
+ 6.times do |j|
74
+ i = j-1
75
+ faces << [cap_vertices[i], middle_vertices[i], cap_vertices[j]]
76
+ faces << [cap_vertices[j], middle_vertices[i], middle_vertices[j]]
77
+ faces << [middle_vertices[i], bottom_vertex, middle_vertices[j]]
78
+ end
79
+
80
+ faces
81
+ end
82
+
83
+ def render_frame(i)
84
+ angle = i / 10.0
85
+ dir = Vec.new(*Complex.polar(1, angle).rect, Math.sin(angle)).normalize
86
+ dir2 = Vec.new(*Complex.polar(1, angle - Math::PI/2).rect, 0)
87
+ up = dir.cross(dir2)
88
+ nm = dir.cross(up)
89
+ @faces.each do |vertices|
90
+ v0, v1, v2, = vertices
91
+ if v1.sub(v0).cross(v2.sub(v0)).dot(dir) > 0
92
+ points = vertices.map {|p| [nm.dot(p), up.dot(p)] }
93
+ (points + [points[0]]).each_cons(2) do |p1, p2|
94
+ yield p1, p2
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ private def easter_egg(type = nil)
102
+ type ||= [:logo, :dancing].sample
103
+ case type
104
+ when :logo
105
+ File.open(File.join(__dir__, 'ruby_logo.aa')) do |f|
106
+ require "rdoc"
107
+ RDoc::RI::Driver.new.page do |io|
108
+ IO.copy_stream(f, io)
109
+ end
110
+ end
111
+ when :dancing
112
+ begin
113
+ canvas = Canvas.new(Reline.get_screen_size)
114
+ Reline::IOGate.set_winch_handler do
115
+ canvas = Canvas.new(Reline.get_screen_size)
116
+ end
117
+ ruby_model = RubyModel.new
118
+ print "\e[?1049h"
119
+ 0.step do |i| # TODO (0..).each needs Ruby 2.6 or later
120
+ buff = canvas.draw do
121
+ ruby_model.render_frame(i) do |p1, p2|
122
+ canvas.line(p1, p2)
123
+ end
124
+ end
125
+ buff[0, 20] = "\e[0mPress Ctrl+C to stop\e[31m\e[1m"
126
+ print "\e[H" + buff
127
+ sleep 0.05
128
+ end
129
+ rescue Interrupt
130
+ ensure
131
+ print "\e[0m\e[?1049l"
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ IRB.__send__(:easter_egg, ARGV[0]&.to_sym) if $0 == __FILE__
@@ -43,4 +43,3 @@ module IRB # :nodoc:
43
43
  end
44
44
  end
45
45
  end
46
-
@@ -22,7 +22,7 @@ module IRB # :nodoc:
22
22
  def set_last_value(value)
23
23
  _set_last_value(value)
24
24
 
25
- if @eval_history
25
+ if defined?(@eval_history) && @eval_history
26
26
  @eval_history_values.push @line_no, @last_value
27
27
  @workspace.evaluate self, "__ = IRB.CurrentContext.instance_eval{@eval_history_values}"
28
28
  end
@@ -30,9 +30,13 @@ module IRB # :nodoc:
30
30
  @last_value
31
31
  end
32
32
 
33
- # The command result history limit.
33
+ remove_method :eval_history= if method_defined?(:eval_history=)
34
+ # The command result history limit. This method is not available until
35
+ # #eval_history= was called with non-nil value (directly or via
36
+ # setting <code>IRB.conf[:EVAL_HISTORY]</code> in <code>.irbrc</code>).
34
37
  attr_reader :eval_history
35
- # Sets command result history limit.
38
+ # Sets command result history limit. Default value is set from
39
+ # <code>IRB.conf[:EVAL_HISTORY]</code>.
36
40
  #
37
41
  # +no+ is an Integer or +nil+.
38
42
  #
@@ -41,6 +45,9 @@ module IRB # :nodoc:
41
45
  # If +no+ is 0, the number of history items is unlimited.
42
46
  #
43
47
  # If +no+ is +nil+, execution result history isn't used (default).
48
+ #
49
+ # History values are available via <code>__</code> variable, see
50
+ # IRB::History.
44
51
  def eval_history=(no)
45
52
  if no
46
53
  if defined?(@eval_history) && @eval_history
@@ -58,20 +65,51 @@ module IRB # :nodoc:
58
65
  end
59
66
  end
60
67
 
61
- class History # :nodoc:
62
-
63
- def initialize(size = 16)
68
+ # Represents history of results of previously evaluated commands.
69
+ #
70
+ # Available via <code>__</code> variable, only if <code>IRB.conf[:EVAL_HISTORY]</code>
71
+ # or <code>IRB::CurrentContext().eval_history</code> is non-nil integer value
72
+ # (by default it is +nil+).
73
+ #
74
+ # Example (in `irb`):
75
+ #
76
+ # # Initialize history
77
+ # IRB::CurrentContext().eval_history = 10
78
+ # # => 10
79
+ #
80
+ # # Perform some commands...
81
+ # 1 + 2
82
+ # # => 3
83
+ # puts 'x'
84
+ # # x
85
+ # # => nil
86
+ # raise RuntimeError
87
+ # # ...error raised
88
+ #
89
+ # # Inspect history (format is "<item number> <evaluated value>":
90
+ # __
91
+ # # => 1 10
92
+ # # 2 3
93
+ # # 3 nil
94
+ #
95
+ # __[1]
96
+ # # => 10
97
+ #
98
+ class History
99
+
100
+ def initialize(size = 16) # :nodoc:
64
101
  @size = size
65
102
  @contents = []
66
103
  end
67
104
 
68
- def size(size)
105
+ def size(size) # :nodoc:
69
106
  if size != 0 && size < @size
70
107
  @contents = @contents[@size - size .. @size]
71
108
  end
72
109
  @size = size
73
110
  end
74
111
 
112
+ # Get one item of the content (both positive and negative indexes work).
75
113
  def [](idx)
76
114
  begin
77
115
  if idx >= 0
@@ -84,14 +122,14 @@ module IRB # :nodoc:
84
122
  end
85
123
  end
86
124
 
87
- def push(no, val)
125
+ def push(no, val) # :nodoc:
88
126
  @contents.push [no, val]
89
127
  @contents.shift if @size != 0 && @contents.size > @size
90
128
  end
91
129
 
92
130
  alias real_inspect inspect
93
131
 
94
- def inspect
132
+ def inspect # :nodoc:
95
133
  if @contents.empty?
96
134
  return real_inspect
97
135
  end
@@ -115,5 +153,3 @@ module IRB # :nodoc:
115
153
  end
116
154
  end
117
155
  end
118
-
119
-