mirror of
https://github.com/ruby/ruby.git
synced 2025-08-24 13:34:17 +02:00

(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
```
4a0e0e89b7
51 lines
1.6 KiB
Ruby
51 lines
1.6 KiB
Ruby
# 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
|