summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorStan Lo <stan001212@gmail.com>2024-07-03 18:17:38 +0100
committergit <svn-admin@ruby-lang.org>2024-07-03 17:17:42 +0000
commit7fe5f0a1d0e628e9e330169a5c2dedae0d40dedd (patch)
treea7cabf054f4ed2e1388437c564f57fe6150dd1dd /lib
parentf4b313f7338f5fbe37f73aae29f70aeb474f7f5b (diff)
[ruby/irb] Introduce cd command
(https://github.com/ruby/irb/pull/971) It's essentially a combination of pushws and popws commands that are easier to use. Help message: ``` Usage: cd ([target]|..) IRB uses a stack of workspaces to keep track of context(s), with `pushws` and `popws` commands to manipulate the stack. The `cd` command is an attempt to simplify the operation and will be subject to change. When given: - an object, cd will use that object as the new context by pushing it onto the workspace stack. - "..", cd will leave the current context by popping the top workspace off the stack. - no arguments, cd will move to the top workspace on the stack by popping off all workspaces. Examples: cd Foo cd Foo.new cd @ivar cd .. cd ``` https://github.com/ruby/irb/commit/4a0e0e89b7
Diffstat (limited to 'lib')
-rw-r--r--lib/irb/command/cd.rb51
-rw-r--r--lib/irb/default_commands.rb3
2 files changed, 54 insertions, 0 deletions
diff --git a/lib/irb/command/cd.rb b/lib/irb/command/cd.rb
new file mode 100644
index 0000000000..b83c8689ae
--- /dev/null
+++ b/lib/irb/command/cd.rb
@@ -0,0 +1,51 @@
+# frozen_string_literal: true
+
+module IRB
+ module Command
+ class CD < Base
+ category "Workspace"
+ description "Move into the given object or leave the current context."
+
+ help_message(<<~HELP)
+ Usage: cd ([target]|..)
+
+ IRB uses a stack of workspaces to keep track of context(s), with `pushws` and `popws` commands to manipulate the stack.
+ The `cd` command is an attempt to simplify the operation and will be subject to change.
+
+ When given:
+ - an object, cd will use that object as the new context by pushing it onto the workspace stack.
+ - "..", cd will leave the current context by popping the top workspace off the stack.
+ - no arguments, cd will move to the top workspace on the stack by popping off all workspaces.
+
+ Examples:
+
+ cd Foo
+ cd Foo.new
+ cd @ivar
+ cd ..
+ cd
+ HELP
+
+ def execute(arg)
+ case arg
+ when ".."
+ irb_context.pop_workspace
+ when ""
+ # TODO: decide what workspace commands should be kept, and underlying APIs should look like,
+ # and perhaps add a new API to clear the workspace stack.
+ prev_workspace = irb_context.pop_workspace
+ while prev_workspace
+ prev_workspace = irb_context.pop_workspace
+ end
+ else
+ begin
+ obj = eval(arg, irb_context.workspace.binding)
+ irb_context.push_workspace(obj)
+ rescue StandardError => e
+ warn "Error: #{e}"
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/irb/default_commands.rb b/lib/irb/default_commands.rb
index 91c6b2d041..e27a3d4e00 100644
--- a/lib/irb/default_commands.rb
+++ b/lib/irb/default_commands.rb
@@ -5,6 +5,7 @@ require_relative "command/internal_helpers"
require_relative "command/backtrace"
require_relative "command/break"
require_relative "command/catch"
+require_relative "command/cd"
require_relative "command/chws"
require_relative "command/context"
require_relative "command/continue"
@@ -240,6 +241,8 @@ module IRB
_register_with_aliases(:irb_disable_irb, Command::DisableIrb,
[:disable_irb, NO_OVERRIDE]
)
+
+ register(:cd, Command::CD)
end
ExtendCommand = Command