diff --git a/.julia/config/startup.jl b/.julia/config/startup.jl index dd72466..c1e52b7 100644 --- a/.julia/config/startup.jl +++ b/.julia/config/startup.jl @@ -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() && 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() && end return ast end) + end