summaryrefslogtreecommitdiff
path: root/lib/irb/extend-command.rb
diff options
context:
space:
mode:
authorkeiju <keiju@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-07-09 11:17:17 +0000
committerkeiju <keiju@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2002-07-09 11:17:17 +0000
commitaf064b04b1622897995fe1177aabfb60db90e6f7 (patch)
tree326cb343c08c55d2d93fa5223c01f940d3591f8b /lib/irb/extend-command.rb
parent93602810e93b5da1c7161fb4b5c1a4025434a9ce (diff)
* irb 0.9
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2627 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/irb/extend-command.rb')
-rw-r--r--lib/irb/extend-command.rb243
1 files changed, 166 insertions, 77 deletions
diff --git a/lib/irb/extend-command.rb b/lib/irb/extend-command.rb
index 3f92707d01..fd71968c1f 100644
--- a/lib/irb/extend-command.rb
+++ b/lib/irb/extend-command.rb
@@ -1,6 +1,6 @@
#
# irb/extend-command.rb - irb command extend
-# $Release Version: 0.7.3$
+# $Release Version: 0.9$
# $Revision$
# $Date$
# by Keiju ISHITSUKA(keiju@ishitsuka.com)
@@ -13,104 +13,149 @@ module IRB
#
# IRB extended command
#
- module ExtendCommand
-# include Loader
-
- def irb_exit(ret = 0)
- irb_context.exit(ret)
- end
- alias irb_quit irb_exit
-
- def irb_fork(&block)
- pid = send ExtendCommand.irb_original_method_name("fork")
- unless pid
- class<<self
- alias_method :exit, ExtendCommand.irb_original_method_name('exit')
- end
- if iterator?
- begin
- yield
- ensure
- exit
- end
- end
- end
- pid
- end
+ module ExtendCommandBundle
+ EXCB = ExtendCommandBundle
- def irb_change_binding(*main)
- irb_context.change_binding(*main)
- end
- alias irb_change_workspace irb_change_binding
-
- def irb_source(file)
- irb_context.source(file)
- end
+ NO_OVERRIDE = 0
+ OVERRIDE_PRIVATE_ONLY = 0x01
+ OVERRIDE_ALL = 0x02
- def irb(*obj)
- require "irb/multi-irb"
- IRB.irb(nil, *obj)
+ def irb_exit(ret = 0)
+ irb_context.exit(ret)
end
def irb_context
- IRB.conf[:MAIN_CONTEXT]
- end
-
- def irb_jobs
- require "irb/multi-irb"
- IRB.JobManager
+ IRB.CurrentContext
end
- def irb_fg(key)
- require "irb/multi-irb"
- IRB.JobManager.switch(key)
- end
-
- def irb_kill(*keys)
- require "irb/multi-irb"
- IRB.JobManager.kill(*keys)
- end
-
- # extend command functions
- def ExtendCommand.extend_object(obj)
- super
- unless (class<<obj;ancestors;end).include?(ExtendCommand)
- obj.install_aliases
+ @ALIASES = [
+ [:context, :irb_context, NO_OVERRIDE],
+ [:conf, :irb_context, NO_OVERRIDE],
+ [:irb_quit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
+ [:exit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
+ [:quit, :irb_exit, OVERRIDE_PRIVATE_ONLY],
+ ]
+
+ @EXTEND_COMMANDS = [
+ [:irb_current_working_workspace, :CurrentWorkingWorkspace, "irb/cmd/chws",
+ [:irb_print_working_workspace, OVERRIDE_ALL],
+ [:irb_cwws, OVERRIDE_ALL],
+ [:irb_pwws, OVERRIDE_ALL],
+# [:irb_cww, OVERRIDE_ALL],
+# [:irb_pww, OVERRIDE_ALL],
+ [:cwws, NO_OVERRIDE],
+ [:pwws, NO_OVERRIDE],
+# [:cww, NO_OVERRIDE],
+# [:pww, NO_OVERRIDE],
+ [:irb_current_working_binding, OVERRIDE_ALL],
+ [:irb_print_working_binding, OVERRIDE_ALL],
+ [:irb_cwb, OVERRIDE_ALL],
+ [:irb_pwb, OVERRIDE_ALL],
+# [:cwb, NO_OVERRIDE],
+# [:pwb, NO_OVERRIDE]
+ ],
+ [:irb_change_workspace, :ChangeWorkspace, "irb/cmd/chws",
+ [:irb_chws, OVERRIDE_ALL],
+# [:irb_chw, OVERRIDE_ALL],
+ [:irb_cws, OVERRIDE_ALL],
+# [:irb_cw, OVERRIDE_ALL],
+ [:chws, NO_OVERRIDE],
+# [:chw, NO_OVERRIDE],
+ [:cws, NO_OVERRIDE],
+# [:cw, NO_OVERRIDE],
+ [:irb_change_binding, OVERRIDE_ALL],
+ [:irb_cb, OVERRIDE_ALL],
+ [:cb, NO_OVERRIDE]],
+
+ [:irb_workspaces, :Workspaces, "irb/cmd/pushws",
+ [:workspaces, NO_OVERRIDE],
+ [:irb_bindings, OVERRIDE_ALL],
+ [:bindings, NO_OVERRIDE]],
+ [:irb_push_workspace, :PushWorkspace, "irb/cmd/pushws",
+ [:irb_pushws, OVERRIDE_ALL],
+# [:irb_pushw, OVERRIDE_ALL],
+ [:pushws, NO_OVERRIDE],
+# [:pushw, NO_OVERRIDE],
+ [:irb_push_binding, OVERRIDE_ALL],
+ [:irb_pushb, OVERRIDE_ALL],
+ [:pushb, NO_OVERRIDE]],
+ [:irb_pop_workspace, :PopWorkspace, "irb/cmd/pushws",
+ [:irb_popws, OVERRIDE_ALL],
+# [:irb_popw, OVERRIDE_ALL],
+ [:popws, NO_OVERRIDE],
+# [:popw, NO_OVERRIDE],
+ [:irb_pop_binding, OVERRIDE_ALL],
+ [:irb_popb, OVERRIDE_ALL],
+ [:popb, NO_OVERRIDE]],
+
+ [:irb_load, :Load, "irb/cmd/load"],
+ [:irb_require, :Require, "irb/cmd/load"],
+ [:irb_source, :Source, "irb/cmd/load",
+ [:source, NO_OVERRIDE]],
+
+ [:irb, :IrbCommand, "irb/cmd/subirb"],
+ [:irb_jobs, :Jobs, "irb/cmd/subirb",
+ [:jobs, NO_OVERRIDE]],
+ [:irb_fg, :Foreground, "irb/cmd/subirb",
+ [:fg, NO_OVERRIDE]],
+ [:irb_kill, :Kill, "irb/cmd/subirb",
+ [:kill, OVERRIDE_PRIVATE_ONLY]],
+ ]
+
+ def EXCB.install_extend_commands
+ for args in @EXTEND_COMMANDS
+ def_extend_command *args
end
end
- OVERRIDE_NOTHING = 0
- OVERRIDE_PRIVATE_ONLY = 0x01
- OVERRIDE_ALL = 0x02
-
- def install_aliases(override = OVERRIDE_NOTHING)
+ # aliases = [commans_alias, flag], ...
+ def EXCB.def_extend_command(cmd_name, cmd_class, load_file = nil, *aliases)
+ case cmd_class
+ when Symbol
+ cmd_class = cmd_class.id2name
+ when String
+ when Class
+ cmd_class = cmd_class.name
+ end
- install_alias_method(:exit, :irb_exit, override | OVERRIDE_PRIVATE_ONLY)
- install_alias_method(:quit, :irb_quit, override | OVERRIDE_PRIVATE_ONLY)
- install_alias_method(:fork, :irb_fork, override | OVERRIDE_PRIVATE_ONLY)
- install_alias_method(:kill, :irb_kill, override | OVERRIDE_PRIVATE_ONLY)
+ if load_file
+ eval %[
+ def #{cmd_name}(*opts, &b)
+ require "#{load_file}"
+ eval %[
+ def #{cmd_name}(*opts, &b)
+ ExtendCommand::#{cmd_class}.execute(irb_context, *opts, &b)
+ end
+ ]
+ send :#{cmd_name}, *opts, &b
+ end
+ ]
+ else
+ eval %[
+ def #{cmd_name}(*opts, &b)
+ ExtendCommand::#{cmd_class}.execute(irb_context, *opts, &b)
+ end
+ ]
+ end
- install_alias_method(:irb_cb, :irb_change_binding, override)
- install_alias_method(:irb_ws, :irb_change_workspace, override)
- install_alias_method(:source, :irb_source, override)
- install_alias_method(:conf, :irb_context, override)
- install_alias_method(:jobs, :irb_jobs, override)
- install_alias_method(:fg, :irb_fg, override)
+ for ali, flag in aliases
+ @ALIASES.push [ali, cmd_name, flag]
+ end
end
- # override = {OVERRIDE_NOTHING, OVERRIDE_PRIVATE_ONLY, OVERRIDE_ALL}
- def install_alias_method(to, from, override = OVERRIDE_NOTHING)
+ # override = {NO_OVERRIDE, OVERRIDE_PRIVATE_ONLY, OVERRIDE_ALL}
+ def install_alias_method(to, from, override = NO_OVERRIDE)
to = to.id2name unless to.kind_of?(String)
from = from.id2name unless from.kind_of?(String)
if override == OVERRIDE_ALL or
(override == OVERRIDE_PRIVATE_ONLY) && !respond_to?(to) or
- (override == OVERRIDE_NOTHING) && !respond_to?(to, true)
+ (override == NO_OVERRIDE) && !respond_to?(to, true)
target = self
(class<<self;self;end).instance_eval{
if target.respond_to?(to, true) &&
- !target.respond_to?(ExtendCommand.irb_original_method_name(to), true)
- alias_method(ExtendCommand.irb_original_method_name(to), to)
+ !target.respond_to?(EXCB.irb_original_method_name(to), true)
+ alias_method(EXCB.irb_original_method_name(to), to)
end
alias_method to, from
}
@@ -122,5 +167,49 @@ module IRB
def self.irb_original_method_name(method_name)
"irb_" + method_name + "_org"
end
+
+ def EXCB.extend_object(obj)
+ unless (class<<obj;ancestors;end).include?(EXCB)
+ super
+ for ali, com, flg in @ALIASES
+ obj.install_alias_method(ali, com, flg)
+ end
+ end
+ end
+
+ install_extend_commands
+ end
+
+ # extension support for Context
+ module ContextExtender
+ CE = ContextExtender
+
+ @EXTEND_COMMANDS = [
+ [:eval_history=, "irb/ext/history.rb"],
+ [:use_tracer=, "irb/ext/tracer.rb"],
+ [:math_mode=, "irb/ext/math-mode.rb"],
+ [:use_loader=, "irb/ext/use-loader.rb"],
+ ]
+
+ def CE.install_extend_commands
+ for args in @EXTEND_COMMANDS
+ def_extend_command *args
+ end
+ end
+
+ def CE.def_extend_command(cmd_name, load_file, *aliases)
+ Context.module_eval %[
+ def #{cmd_name}(*opts, &b)
+ require "#{load_file}"
+ send :#{cmd_name}, *opts, &b
+ end
+ for ali in aliases
+ alias_method ali, cmd_name
+ end
+ ]
+ end
+
+ CE.install_extend_commands
end
end
+