2011-05-01 10:25:37 +00:00
require " pry/default_commands/ls "
class Pry
module DefaultCommands
2011-05-07 05:32:05 +00:00
Context = Pry :: CommandSet . new do
2011-05-01 10:25:37 +00:00
import Ls
command " cd " , " Start a Pry session on VAR (use `cd ..` to go back and `cd /` to return to Pry top-level) " , :keep_retval = > true do | obj |
2011-05-08 06:21:15 +00:00
case obj
when " .. "
2011-08-22 02:48:50 +00:00
2011-08-22 08:56:18 +00:00
if _pry_ . binding_stack . one?
2011-08-22 02:48:50 +00:00
# when breaking out of top-level then behave like `quit` command
2011-08-22 08:56:18 +00:00
_pry_ . binding_stack . clear
2011-08-22 02:48:50 +00:00
throw ( :breakout )
else
# otherwise just pop a binding
_pry_ . binding_stack . pop . eval ( 'self' )
end
2011-09-03 10:37:46 +00:00
when nil , " / "
2011-08-21 06:22:45 +00:00
_pry_ . binding_stack = [ _pry_ . binding_stack . first ]
nil
2011-05-08 06:21:15 +00:00
when " :: "
2011-08-22 02:48:50 +00:00
_pry_ . binding_stack . push TOPLEVEL_BINDING
2011-09-04 01:30:20 +00:00
void
2011-05-08 06:21:15 +00:00
else
2011-08-21 06:22:45 +00:00
_pry_ . binding_stack . push Pry . binding_for ( target . eval ( arg_string ) )
2011-09-04 01:30:20 +00:00
void
2011-05-01 10:25:37 +00:00
end
end
2011-08-22 02:48:50 +00:00
command " switch-to " , " Start a new sub-session on a binding in the current stack (numbered by nesting). " do | selection |
selection = selection . to_i
2011-08-22 08:56:18 +00:00
if selection < 0 || selection > _pry_ . binding_stack . size - 1
output . puts " Invalid binding index #{ selection } - use `nesting` command to view valid indices. "
else
Pry . start ( _pry_ . binding_stack [ selection ] )
end
2011-08-22 02:48:50 +00:00
end
2011-05-01 10:25:37 +00:00
command " nesting " , " Show nesting information. " do
output . puts " Nesting status: "
output . puts " -- "
2011-08-21 06:22:45 +00:00
_pry_ . binding_stack . each_with_index do | obj , level |
2011-05-01 10:25:37 +00:00
if level == 0
2011-08-21 06:22:45 +00:00
output . puts " #{ level } . #{ Pry . view_clip ( obj . eval ( 'self' ) ) } (Pry top level) "
2011-05-01 10:25:37 +00:00
else
2011-08-21 06:22:45 +00:00
output . puts " #{ level } . #{ Pry . view_clip ( obj . eval ( 'self' ) ) } "
2011-05-01 10:25:37 +00:00
end
end
end
2011-08-25 09:41:43 +00:00
command " jump-to " , " Jump to a binding further up the stack, popping all bindings below. " do | break_level |
2011-05-01 10:25:37 +00:00
break_level = break_level . to_i
2011-08-22 02:48:50 +00:00
nesting_level = _pry_ . binding_stack . size - 1
2011-05-01 10:25:37 +00:00
case break_level
2011-08-22 02:48:50 +00:00
when nesting_level
output . puts " Already at nesting level #{ nesting_level } "
when ( 0 ... nesting_level )
_pry_ . binding_stack . slice! ( break_level + 1 , _pry_ . binding_stack . size )
2011-05-01 10:25:37 +00:00
else
2011-08-22 02:48:50 +00:00
max_nest_level = nesting_level - 1
2011-05-01 10:25:37 +00:00
output . puts " Invalid nest level. Must be between 0 and #{ max_nest_level } . Got #{ break_level } . "
end
end
2011-08-25 09:41:43 +00:00
command " exit-all " , " End the current Pry session (popping all bindings) and returning to caller. Accepts optional return value. Aliases: !!@ " do
2011-08-22 02:48:50 +00:00
# clear the binding stack
2011-08-22 08:56:18 +00:00
_pry_ . binding_stack . clear
2011-08-22 02:48:50 +00:00
# break out of the repl loop
2011-08-21 06:22:45 +00:00
throw ( :breakout , target . eval ( arg_string ) )
2011-05-01 10:25:37 +00:00
end
alias_command " !!@ " , " exit-all " , " "
2011-08-25 09:41:43 +00:00
command " exit " , " Pop the current binding and return to the one immediately prior. Note this does NOT exit the program. Aliases: quit " , :keep_retval = > true do
if _pry_ . binding_stack . one?
# when breaking out of top-level then behave like `exit-all`
_pry_ . binding_stack . clear
throw ( :breakout , target . eval ( arg_string ) )
else
# otherwise just pop a binding
popped_object = _pry_ . binding_stack . pop . eval ( 'self' )
# return a user-specified value if given
if ! arg_string . empty?
target . eval ( arg_string )
else
popped_object
end
end
end
alias_command " quit " , " exit " , " "
command " exit-program " , " End the current program. Aliases: quit-program, !!! " do
2011-08-07 09:30:08 +00:00
Pry . save_history if Pry . config . history . should_save
2011-08-29 15:22:10 +00:00
Kernel . exit target . eval ( arg_string ) . to_i
2011-05-01 10:25:37 +00:00
end
2011-08-25 09:41:43 +00:00
alias_command " quit-program " , " exit-program " , " "
alias_command " !!! " , " exit-program " , " "
2011-05-01 10:25:37 +00:00
2011-08-30 17:35:41 +00:00
command " !pry " , " Start a Pry session on current self; this even works mid multi-line expression. " do
2011-05-29 15:41:40 +00:00
target . pry
2011-05-01 10:25:37 +00:00
end
command " whereami " , " Show the code context for the session. (whereami <n> shows <n> extra lines of code around the invocation line. Default: 5) " do | num |
file = target . eval ( '__FILE__' )
line_num = target . eval ( '__LINE__' )
klass = target . eval ( 'self.class' )
if num
i_num = num . to_i
else
i_num = 5
end
meth_name = meth_name_from_binding ( target )
meth_name = " N/A " if ! meth_name
if file =~ / ( \ (.* \ ))|<.*> / || file == " " || file == " -e "
output . puts " Cannot find local context. Did you use `binding.pry` ? "
next
end
set_file_and_dir_locals ( file )
2011-05-07 14:26:53 +00:00
output . puts " \n #{ text . bold ( 'From:' ) } #{ file } @ line #{ line_num } in #{ klass } # #{ meth_name } : \n \n "
2011-05-01 10:25:37 +00:00
# This method inspired by http://rubygems.org/gems/ir_b
File . open ( file ) . each_with_index do | line , index |
line_n = index + 1
next unless line_n > ( line_num - i_num - 1 )
break if line_n > ( line_num + i_num )
if line_n == line_num
code = " => #{ line_n . to_s . rjust ( 3 ) } : #{ line . chomp } "
if Pry . color
code = CodeRay . scan ( code , :ruby ) . term
end
output . puts code
code
else
code = " #{ line_n . to_s . rjust ( 6 ) } : #{ line . chomp } "
if Pry . color
code = CodeRay . scan ( code , :ruby ) . term
end
output . puts code
code
end
end
end
end
end
end