mirror of
https://github.com/ruby/ruby.git
synced 2026-08-28 05:22:06 +08: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 ``` https://github.com/ruby/irb/commit/4a0e0e89b7
52 lines
1.6 KiB
Ruby
52 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
|