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