|
|
|
|
@ -1,17 +1,15 @@
@@ -1,17 +1,15 @@
|
|
|
|
|
if Base.isinteractive() && |
|
|
|
|
(local REPL = get(Base.loaded_modules, Base.PkgId(Base.UUID("3fa0cd96-eef1-5676-8a61-b3b8758bbffb"), "REPL"), nothing); REPL !== nothing) |
|
|
|
|
|
|
|
|
|
# Exit Julia with :q |
|
|
|
|
# Exit Julia with :q, restart with :r |
|
|
|
|
pushfirst!(REPL.repl_ast_transforms, function(ast::Union{Expr,Nothing}) |
|
|
|
|
if Meta.isexpr(ast, :toplevel, 2) && ast.args[2] === QuoteNode(:q) |
|
|
|
|
exit() |
|
|
|
|
function toplevel_quotenode(ast, s) |
|
|
|
|
return (Meta.isexpr(ast, :toplevel, 2) && ast.args[2] === QuoteNode(s)) || |
|
|
|
|
(Meta.isexpr(ast, :toplevel) && any(x -> toplevel_quotenode(x, s), ast.args)) |
|
|
|
|
end |
|
|
|
|
return ast |
|
|
|
|
end) |
|
|
|
|
|
|
|
|
|
# Restart Julia with :r |
|
|
|
|
pushfirst!(REPL.repl_ast_transforms, function(ast::Union{Expr,Nothing}) |
|
|
|
|
if Meta.isexpr(ast, :toplevel, 2) && ast.args[2] === QuoteNode(:r) |
|
|
|
|
if toplevel_quotenode(ast, :q) |
|
|
|
|
exit() |
|
|
|
|
elseif toplevel_quotenode(ast, :r) |
|
|
|
|
argv = Base.julia_cmd().exec |
|
|
|
|
opts = Base.JLOptions() |
|
|
|
|
if opts.project != C_NULL |
|
|
|
|
@ -25,25 +23,27 @@ if Base.isinteractive() &&
@@ -25,25 +23,27 @@ if Base.isinteractive() &&
|
|
|
|
|
return ast |
|
|
|
|
end) |
|
|
|
|
|
|
|
|
|
# Automatically load Debugger.jl when encountering @enter or @run and BenchmarkTools.jl |
|
|
|
|
# when encountering @btime or @benchmark. |
|
|
|
|
# Automatically load tooling on demand: |
|
|
|
|
# - Debugger.jl when encountering @enter or @run |
|
|
|
|
# - BenchmarkTools.jl when encountering @btime or @benchmark |
|
|
|
|
pushfirst!(REPL.repl_ast_transforms, function(ast::Union{Expr,Nothing}) |
|
|
|
|
contains_macro(_, _) = false |
|
|
|
|
function contains_macro(x::Expr, s::Symbol) |
|
|
|
|
(Meta.isexpr(x, :macrocall) && x.args[1] === s) || |
|
|
|
|
any(y -> contains_macro(y, s), x.args) |
|
|
|
|
function contains_macro(ast, m) |
|
|
|
|
return ast isa Expr && ( |
|
|
|
|
(Meta.isexpr(ast, :macrocall) && ast.args[1] === m) || |
|
|
|
|
any(x -> contains_macro(x, m), ast.args) |
|
|
|
|
) |
|
|
|
|
end |
|
|
|
|
if Meta.isexpr(ast, :toplevel, 2) && |
|
|
|
|
!isdefined(Main, :Debugger) && |
|
|
|
|
(contains_macro(ast, Symbol("@enter")) || contains_macro(ast, Symbol("@run"))) |
|
|
|
|
if !isdefined(Main, :Debugger) && ( |
|
|
|
|
contains_macro(ast, Symbol("@enter")) || contains_macro(ast, Symbol("@run")) |
|
|
|
|
) |
|
|
|
|
@info "Loading Debugger ..." |
|
|
|
|
try |
|
|
|
|
Core.eval(Main, :(using Debugger)) |
|
|
|
|
catch |
|
|
|
|
end |
|
|
|
|
elseif Meta.isexpr(ast, :toplevel, 2) && |
|
|
|
|
!isdefined(Main, :BenchmarkTools) && |
|
|
|
|
(contains_macro(ast, Symbol("@btime")) || contains_macro(ast, Symbol("@benchmark"))) |
|
|
|
|
elseif !isdefined(Main, :BenchmarkTools) && ( |
|
|
|
|
contains_macro(ast, Symbol("@btime")) || contains_macro(ast, Symbol("@benchmark")) |
|
|
|
|
) |
|
|
|
|
@info "Loading BenchmarkTools ..." |
|
|
|
|
try |
|
|
|
|
Core.eval(Main, :(using BenchmarkTools)) |
|
|
|
|
@ -52,4 +52,5 @@ if Base.isinteractive() &&
@@ -52,4 +52,5 @@ if Base.isinteractive() &&
|
|
|
|
|
end |
|
|
|
|
return ast |
|
|
|
|
end) |
|
|
|
|
|
|
|
|
|
end |
|
|
|
|
|