julia
julia copied to clipboard
REPL hints and tab completion freezes the REPL
Sometimes tab completion freezes the REPL. For example, I type
julia> complicated_hard_to_infer_function(f(x) * y, g(x), TAB
and this gives me a frozen REPL for a few minutes, where not even Ctrl-C does something useful. Not a great user experience (in particular the Ctrl-C not responding part).
@MasonProtter provided the following reproducer (my original example is free of @generated):
julia> @generated function foo()
@info "Compiling foo()"
sleep(10)
(;a=1, b=2)
end;
julia> foo().[ Info: Compiling foo()
This is with julia 1.10.
Can we make the under the hood type inference give up if the result cannot be returned "immediately"? Alternatively, can we make Ctrl-C work?
Edit: It is really bad on 1.11, where this is triggered by the tab completion "hint", so almost always.
Tab completion needs to be moved run on a separate thread. I don't think there are any other good options.
Most of inference supports cancellation (except the IRInterp where the implementation is marked broken) via LimitedAccuracy and the dont_work_on_me flag. It could be hooked to timeout after either some amount of delay or on the next keystroke (particularly better with threads so it could keep running though). I have also been working on resumable inference, which maybe completed soon, and could be used as a basis for this in the REPLCompletions
It's probably clear already, but this is even more of an issue on 1.11+ because of tab completion hinting.
i.e. on 1.11 I hit this just by typing foo().
julia> foo().[ Info: Compiling foo()
And I don't believe we're likely to make 1.11 start up with multiple threads by default, so I think the only option for 1.11 is to add a timeout? Perhaps a shorter timeout for hinting
so I think the only option for 1.11 is to add a timeout?
@vtjnash @Keno do you think thats the case? I think this needs figuring out, ideally before first release
@thofma thanks so much for the workaround!
I'm putting this on the 1.12 milestone as I don't believe it's properly fixable on 1.11
The two non mutually exclusive suggestions are:
- Move completion generation to another thread https://github.com/JuliaLang/julia/issues/55434#issuecomment-2278943374
- Utilize inference cancellation after a timeout https://github.com/JuliaLang/julia/issues/55434#issuecomment-2282241858
@IanButterworth defaulting to many threads is a resource hog and interrupting is not stable at all. Can we have a simpler option that does this effectively instead? (perhaps an env variable that disables the autocomplete hint, to prevent unfixable freezes?)
Note: Base.active_repl does not exist at time when startup.jl is executed so that file can't be used as a "global config" for this purpose very easily.
(cc @stelmo )
Are you following the recommended way to disable it? https://julialang.org/blog/2024/10/julia-1.11-highlights/#improved_tab_completion_and_hinting_in_the_repl
Oh cool. Is that somewhere in docs? (Must have missed it in there)
Might be a related issue: https://discourse.julialang.org/t/sympy-makes-repl-to-stuck/124814