Updating tags for StringIO.
[rbx.git] / lib / irb / init.rb
blobfb70e0a36f457d4cb102e0f6c20faa8876f3d449
2 #   irb/init.rb - irb initialize module
3 #       $Release Version: 0.9.5$
4 #       $Revision: 11708 $
5 #       $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6 #       by Keiju ISHITSUKA(keiju@ruby-lang.org)
8 # --
10 #   
13 module IRB
15   # initialize config
16   def IRB.setup(ap_path)
17     IRB.init_config(ap_path)
18     IRB.init_error
19     IRB.parse_opts
20     IRB.run_config
21     IRB.load_modules
23     unless @CONF[:PROMPT][@CONF[:PROMPT_MODE]]
24       IRB.fail(UndefinedPromptMode, @CONF[:PROMPT_MODE]) 
25     end
26   end
28   # @CONF default setting
29   def IRB.init_config(ap_path)
30     # class instance variables
31     @TRACER_INITIALIZED = false
33     # default configurations
34     unless ap_path and @CONF[:AP_NAME]
35       ap_path = File.join(File.dirname(File.dirname(__FILE__)), "irb.rb")
36     end
37     @CONF[:AP_NAME] = File::basename(ap_path, ".rb")
39     @CONF[:IRB_NAME] = "irb"
40     @CONF[:IRB_LIB_PATH] = File.dirname(__FILE__)
42     @CONF[:RC] = true
43     @CONF[:LOAD_MODULES] = []
44     @CONF[:IRB_RC] = nil
46     @CONF[:MATH_MODE] = false
47     @CONF[:USE_READLINE] = false unless defined?(ReadlineInputMethod)
48     @CONF[:INSPECT_MODE] = nil
49     @CONF[:USE_TRACER] = false
50     @CONF[:USE_LOADER] = false
51     @CONF[:IGNORE_SIGINT] = true
52     @CONF[:IGNORE_EOF] = false
53     @CONF[:ECHO] = nil
54     @CONF[:VERBOSE] = nil
56     @CONF[:EVAL_HISTORY] = nil
57     @CONF[:SAVE_HISTORY] = nil
59     @CONF[:BACK_TRACE_LIMIT] = 16
61     @CONF[:PROMPT] = {
62       :NULL => {
63         :PROMPT_I => nil,
64         :PROMPT_N => nil,
65         :PROMPT_S => nil,
66         :PROMPT_C => nil,
67         :RETURN => "%s\n"
68       },
69       :DEFAULT => {
70         :PROMPT_I => "%N(%m):%03n:%i> ",
71         :PROMPT_N => "%N(%m):%03n:%i> ",
72         :PROMPT_S => "%N(%m):%03n:%i%l ",
73         :PROMPT_C => "%N(%m):%03n:%i* ",
74         :RETURN => "=> %s\n"
75       },
76       :CLASSIC => {
77         :PROMPT_I => "%N(%m):%03n:%i> ",
78         :PROMPT_N => "%N(%m):%03n:%i> ",
79         :PROMPT_S => "%N(%m):%03n:%i%l ",
80         :PROMPT_C => "%N(%m):%03n:%i* ",
81         :RETURN => "%s\n"
82       },
83       :SIMPLE => {
84         :PROMPT_I => ">> ",
85         :PROMPT_N => ">> ",
86         :PROMPT_S => nil,
87         :PROMPT_C => "?> ",
88         :RETURN => "=> %s\n"
89       },
90       :INF_RUBY => {
91         :PROMPT_I => "%N(%m):%03n:%i> ",
92 #       :PROMPT_N => "%N(%m):%03n:%i> ",
93         :PROMPT_N => nil,
94         :PROMPT_S => nil,
95         :PROMPT_C => nil,
96         :RETURN => "%s\n",
97         :AUTO_INDENT => true
98       },
99       :XMP => {
100         :PROMPT_I => nil,
101         :PROMPT_N => nil,
102         :PROMPT_S => nil,
103         :PROMPT_C => nil,
104         :RETURN => "    ==>%s\n"
105       }
106     }
108     @CONF[:PROMPT_MODE] = (STDIN.tty? ? :DEFAULT : :NULL)
109     @CONF[:AUTO_INDENT] = false
111     @CONF[:CONTEXT_MODE] = 3 # use binding in function on TOPLEVEL_BINDING
112     @CONF[:SINGLE_IRB] = false
114 #    @CONF[:LC_MESSAGES] = "en"
115     @CONF[:LC_MESSAGES] = Locale.new
116     
117     @CONF[:DEBUG_LEVEL] = 1
118   end
120   def IRB.init_error
121     @CONF[:LC_MESSAGES].load("irb/error.rb")
122   end
124   FEATURE_IOPT_CHANGE_VERSION = "1.9.0"
126   # option analyzing
127   def IRB.parse_opts
128     load_path = []
129     while opt = ARGV.shift
130       case opt
131       when "-f"
132         @CONF[:RC] = false
133       when "-m"
134         @CONF[:MATH_MODE] = true
135       when "-d"
136         $DEBUG = true
137       when /^-r(.+)?/
138         opt = $1 || ARGV.shift
139         @CONF[:LOAD_MODULES].push opt if opt
140       when /^-I(.+)?/
141         opt = $1 || ARGV.shift
142         load_path.concat(opt.split(File::PATH_SEPARATOR)) if opt
143       when /^-K(.)/
144         $KCODE = $1
145       when "--inspect"
146         @CONF[:INSPECT_MODE] = true
147       when "--noinspect"
148         @CONF[:INSPECT_MODE] = false
149       when "--readline"
150         @CONF[:USE_READLINE] = true
151       when "--noreadline"
152         @CONF[:USE_READLINE] = false
153       when "--echo"
154         @CONF[:ECHO] = true
155       when "--noecho"
156         @CONF[:ECHO] = false
157       when "--verbose"
158         @CONF[:VERBOSE] = true
159       when "--noverbose"
160         @CONF[:VERBOSE] = false
161       when "--prompt-mode", "--prompt"
162         prompt_mode = ARGV.shift.upcase.tr("-", "_").intern
163         @CONF[:PROMPT_MODE] = prompt_mode
164       when "--noprompt"
165         @CONF[:PROMPT_MODE] = :NULL
166       when "--inf-ruby-mode"
167         @CONF[:PROMPT_MODE] = :INF_RUBY
168       when "--sample-book-mode", "--simple-prompt"
169         @CONF[:PROMPT_MODE] = :SIMPLE
170       when "--tracer"
171         @CONF[:USE_TRACER] = true
172       when "--back-trace-limit"
173         @CONF[:BACK_TRACE_LIMIT] = ARGV.shift.to_i
174       when "--context-mode"
175         @CONF[:CONTEXT_MODE] = ARGV.shift.to_i
176       when "--single-irb"
177         @CONF[:SINGLE_IRB] = true
178       when "--irb_debug"
179         @CONF[:DEBUG_LEVEL] = ARGV.shift.to_i
180       when "-v", "--version"
181         print IRB.version, "\n"
182         exit 0
183       when "-h", "--help"
184         require "irb/help"
185         IRB.print_usage
186         exit 0
187       when /^-/
188         IRB.fail UnrecognizedSwitch, opt
189       else
190         @CONF[:SCRIPT] = opt
191         $0 = opt
192         break
193       end
194     end
195     if RUBY_VERSION >= FEATURE_IOPT_CHANGE_VERSION
196       load_path.collect! do |path|
197         /\A\.\// =~ path ? path : File.expand_path(path)
198       end
199     end
200     $LOAD_PATH.unshift(*load_path)
201   end
203   # running config
204   def IRB.run_config
205     if @CONF[:RC]
206       begin
207         load rc_file
208       rescue LoadError, Errno::ENOENT
209       rescue
210         print "load error: #{rc_file}\n"
211         print $!.class, ": ", $!, "\n"
212         for err in $@[0, $@.size - 2]
213           print "\t", err, "\n"
214         end
215       end
216     end
217   end
219   IRBRC_EXT = "rc"
220   def IRB.rc_file(ext = IRBRC_EXT)
221     if !@CONF[:RC_NAME_GENERATOR]
222       rc_file_generators do |rcgen|
223         @CONF[:RC_NAME_GENERATOR] ||= rcgen
224         if File.exist?(rcgen.call(IRBRC_EXT))
225           @CONF[:RC_NAME_GENERATOR] = rcgen
226           break
227         end
228       end
229     end
230     @CONF[:RC_NAME_GENERATOR].call ext
231   end
233   # enumerate possible rc-file base name generators
234   def IRB.rc_file_generators
235     if irbrc = ENV["IRBRC"]
236       yield proc{|rc|  rc == "rc" ? irbrc : irbrc+rc}
237     end
238     if home = ENV["HOME"]
239       yield proc{|rc| home+"/.irb#{rc}"} 
240     end
241     home = Dir.pwd
242     yield proc{|rc| home+"/.irb#{rc}"}
243     yield proc{|rc| home+"/irb#{rc.sub(/\A_?/, '.')}"}
244     yield proc{|rc| home+"/_irb#{rc}"}
245     yield proc{|rc| home+"/$irb#{rc}"}
246   end
248   # loading modules
249   def IRB.load_modules
250     for m in @CONF[:LOAD_MODULES]
251       begin
252         require m
253       rescue
254         print $@[0], ":", $!.class, ": ", $!, "\n"
255       end
256     end
257   end