JuliaLang / julia

The Julia Programming Language
https://julialang.org/
MIT License
45.87k stars 5.49k forks source link

REPL hints and tab completion freezes the REPL #55434

Open thofma opened 3 months ago

thofma commented 3 months ago

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.

Edit edit: For the fellow victims of this: One can turn it off (on 1.11) by typing the following in the REPL

Base.active_repl.options.hint_tab_completes = false

or putting

atreplinit() do repl
    if VERSION >= v"1.11.0-0"
        repl.options.hint_tab_completes = false
    end
end

in your startup.jl.

Keno commented 3 months ago

Tab completion needs to be moved run on a separate thread. I don't think there are any other good options.

vtjnash commented 3 months ago

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

IanButterworth commented 3 months ago

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()
IanButterworth commented 3 months ago

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

IanButterworth commented 3 months ago

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

exaexa commented 2 weeks ago

@thofma thanks so much for the workaround!

IanButterworth commented 1 week ago

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:

exaexa commented 1 week ago

@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.

exaexa commented 1 week ago

(cc @stelmo )

IanButterworth commented 1 week ago

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

exaexa commented 1 week ago

Oh cool. Is that somewhere in docs? (Must have missed it in there)