The advantage is you don't need to remove the whole line to check the help information. It could also used to check the information of variable while typing. What's ever, maybe it is nothing more than a toy. Let me work with it for a while first. :)
The REPL is written by Julia itself, which is really excite me. Maybe several years later, Julia REPL is another Emacs! I hope it could become more customize. After all, many Julia user are tech-geek. Thank you for your information, and thank you for the REPL! On Thursday, October 30, 2014 12:51:43 PM UTC+1, Kevin Squire wrote: > > Actually, you could already do that if you typed the "?" first... Thanks > for the enthusiasm, though! > > Cheers, > Kevin > > On Thu, Oct 30, 2014 at 3:43 AM, <[email protected] <javascript:>> wrote: > >> I see, I should use meta-Backspace instead. And the undocumented shortcut >> for function arguments is cool! I didn't find that before! >> Just for fun, I changed my code a little, to show help by >> function_name?\t, like: >> julia> sin?\t >> Base.sin(x) >> >> Compute sine of "x", where "x" is in radians >> julia> sin? >> >> function CUSTOM_AUTOCOMPLETION_HOOK(txt,pos) >> if txt[pos]=='?' && pos>1 >> #Show help of function >> m=match(r"([\w\!]+)$",txt[1:pos-1]) >> if !isa(m,Nothing) >> S=m.captures[1] >> if isdefined(parse(S)) >> println("") >> help(S) >> end >> return UTF8String[], 0:-1, true >> end >> end >> m=match(r"(\w+)\[\"([^\"]*)$",txt[1:pos]) >> if !isa(m,Nothing) >> #For String key >> if !isdefined(Main,parse(m.captures[1])) >> return UTF8String[], 0:-1, false >> end >> var=eval(parse(m.captures[1])) >> if !applicable(keys,var) >> return UTF8String[], 0:-1, false >> end >> ky=keys(var) >> if length(ky)>500 >> println("\nToo many keys to be auto-completed.") >> return UTF8String[], 0:-1, true >> end >> ky=[filter(x->isa(x,String),ky)...] >> lst=convert(Vector{UTF8String},[filter(x->beginswith(x,m.captures >> [2]),ky)...]) >> if !(length(txt)>=pos+1 && txt[pos+1]=='\"') >> if length(txt)>=pos+1 && txt[pos+1]==']' >> lst=map(x->x*"\"",lst) >> else >> lst=map(x->x*"\"]",lst) >> end >> end >> return lst, (pos-length(m.captures[2])+1):pos, true >> else >> #For symbol key >> m=match(r"(\w+)\[\:(\w*)$",txt[1:pos]) >> if isa(m,Nothing) || !isdefined(Main,parse(m.captures[1])) >> return UTF8String[], 0:-1, false >> end >> var=eval(parse(m.captures[1])) >> if !applicable(keys,var) >> return UTF8String[], 0:-1, false >> end >> ky=keys(var) >> if length(ky)>500 >> println("\nToo many keys to be auto-completed.") >> return UTF8String[], 0:-1, true >> end >> ky=map(string,[filter(x->isa(x,Symbol),ky)...]) >> lst=convert(Vector{UTF8String},[filter(x->beginswith(x,m.captures >> [2]),ky)...]) >> if !(length(txt)>=pos+1 && txt[pos+1]==']') >> lst=map(x->x*"]",lst) >> end >> return lst, (pos-length(m.captures[2])+1):pos, true >> end >> end >> >> >> >> >> On Thursday, October 30, 2014 10:39:43 AM UTC+1, Ivar Nesje wrote: >>> >>> We have different level of experience with key bindings, and we are used >>> to different things. You won't get far with "It really make me crazy" that >>> Julia doesn't work exactly as Matlab or R, but there are definitely still >>> possibilities to change behaviour if you manage to convince the community >>> that some other way is better. See also the docs >>> <http://docs.julialang.org/en/release-0.3/manual/interacting-with-julia/> >>> where >>> we attempt to describe the different key bindings, and it seems like you >>> are confusing meta-Backspace with ^w. >>> >>> We also have a really nice shortcut (that I can't find in the >>> documentation) where you can press TAB just after a left parens, and get a >>> list of the methods on the function. That is often more directly useful >>> than the help, when you need to lookup the order of the arguments. >>> >>> julia> sin(\t >>> sin(a::Complex{Float16}) at float16.jl:141 sin(x::Real) at math.jl:125 >>> sin(z::Complex{T<:Real}) at complex.jl:518 >>> sin{Tv,Ti}(A::SparseMatrixCSC{Tv,Ti}) >>> at sparse/sparsematrix.jl:450 >>> sin(x::Float64) at math.jl:123 >>> sin{T<:Number}(::AbstractArray{T<:Number,1}) >>> at operators.jl:358 >>> sin(x::Float32) at math.jl:124 >>> sin{T<:Number}(::AbstractArray{T<:Number,2}) >>> at operators.jl:359 >>> sin(a::Float16) at float16.jl:140 >>> sin{T<:Number}(::AbstractArray{T<:Number,N}) >>> at operators.jl:361 >>> sin(x::BigFloat) at mpfr.jl:488 >>> >>> This trick also works when you have started typing some of the >>> arguments, if you ensure that the cursor is right after the parens. >>> >>> Ivar >>> >>> kl. 10:07:37 UTC+1 torsdag 30. oktober 2014 skrev [email protected] >>> følgende: >>>> >>>> It will be prefect if the Tab can also auto-complete the argument names >>>> of a function, like what R did. >>>> >>>> Actually I have other complaints about REPL: >>>> 1. Ctrl+w delected all the line rather than only the last word. It >>>> really make me crazy.... >>>> 2. If I push F1 in the REPL in termnal window (it is running in the >>>> server), the whole system clashed: >>>> julia> ERROR: key not found: '\0' >>>> in match_input at LineEdit.jl:734 (repeats 3 times) >>>> in match_input at LineEdit.jl:731 >>>> in anonymous at LineEdit.jl:833 >>>> in prompt! at ./LineEdit.jl:1349 >>>> in run_interface at ./LineEdit.jl:1324 >>>> in run_interface_3B_9747 at /home/JXiong/programs/julia_0. >>>> 3/julia/usr/bin/../lib/julia/sys.so >>>> in run_frontend at ./REPL.jl:819 >>>> in run_repl at ./REPL.jl:170 >>>> in _start at ./client.jl:399 >>>> in _start_3B_9614 at /home/JXiong/programs/julia_0. >>>> 3/julia/usr/bin/../lib/julia/sys.so >>>> >>>> I really like that in MATLAB, I can see the help of the function I am >>>> typing just by push F1. I think REPL could also support some hot-keys, >>>> like >>>> showing help, showing current directory, showing data tip, showing >>>> function >>>> argument hint, showing command history, and run a custom function during >>>> typing the command. In many time, I cannot remember the function argument >>>> order when I type command, I have to delete the whole line, check help, >>>> and >>>> retype it again. How do you think about it? >>>> >>>> On Wednesday, October 29, 2014 11:02:54 PM UTC+1, Max Suster wrote: >>>>> >>>>> +1 >>>>> >>>>> On Wednesday, October 29, 2014 9:56:33 PM UTC+1, Elliot Saba wrote: >>>>>> >>>>>> I really like the concept; I can't tell you how many times I've tried >>>>>> to tab-complete dict keys. >>>>>> -E >>>>>> >>>>>> On Wed, Oct 29, 2014 at 1:36 PM, Ivar Nesje <[email protected]> wrote: >>>>>> >>>>>>> Nice. What do people think about adding this functionality to Base? >>>>>>> >>>>>>> If anyone likes to read code in a gist, rather than in an email, I >>>>>>> made a link <https://gist.github.com/ivarne/d232c1a815222fc5f896> >>>>>>> >>>>>>> Regards Ivar >>>>>>> >>>>>>> kl. 21:07:45 UTC+1 onsdag 29. oktober 2014 skrev [email protected] >>>>>>> følgende: >>>>>>> >>>>>>>> I get it work ^ ^ Haha!! >>>>>>>> Thank you for your information! >>>>>>>> >>>>>>>> First, insert below code in the beginning of "completions" function >>>>>>>> in /base/REPLCompletions.jl >>>>>>>> <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2FJuliaLang%2Fjulia%2Fblob%2Fmaster%2Fbase%2FREPLCompletions.jl%23L185&sa=D&sntz=1&usg=AFQjCNHzQ0VkvZjQihp3roolMlmxAe9LHQ> >>>>>>>> : >>>>>>>> try >>>>>>>> if isdefined(Main, :CUSTOM_AUTOCOMPLETION_HOOK) >>>>>>>> t=Main.CUSTOM_AUTOCOMPLETION_HOOK(string, pos) >>>>>>>> if t[3] >>>>>>>> return t >>>>>>>> end >>>>>>>> end >>>>>>>> catch err >>>>>>>> println("Error in CUSTOM_AUTOCOMPLETION_HOOK:") >>>>>>>> println(err) >>>>>>>> end >>>>>>>> And recompile Julia. Now I have a hook for the >>>>>>>> custom-autocompletion. >>>>>>>> >>>>>>>> Second, I define such function: >>>>>>>> function CUSTOM_AUTOCOMPLETION_HOOK(txt,pos) >>>>>>>> m=match(r"(\w+)\[\"([^\"]*)$",txt[1:pos]) >>>>>>>> if !isa(m,Nothing) >>>>>>>> #For String key >>>>>>>> if !isdefined(Main,parse(m.captures[1])) >>>>>>>> return UTF8String[], 0:-1, false >>>>>>>> end >>>>>>>> var=eval(parse(m.captures[1])) >>>>>>>> if !applicable(keys,var) >>>>>>>> return UTF8String[], 0:-1, false >>>>>>>> end >>>>>>>> ky=keys(var) >>>>>>>> if length(ky)>500 >>>>>>>> return UTF8String[], 0:-1, false >>>>>>>> end >>>>>>>> ky=[filter(x->isa(x,String),ky)...] >>>>>>>> lst=convert(Vector{UTF8String},[filter(x->beginswith(x,m. >>>>>>>> captures[2]),ky)...]) >>>>>>>> if !(length(txt)>=pos+1 && txt[pos+1]=='\"') >>>>>>>> if length(txt)>=pos+1 && txt[pos+1]==']' >>>>>>>> lst=map(x->x*"\"",lst) >>>>>>>> else >>>>>>>> lst=map(x->x*"\"]",lst) >>>>>>>> end >>>>>>>> end >>>>>>>> return lst, (pos-length(m.captures[2])+1):pos, true >>>>>>>> else >>>>>>>> #For symbol key >>>>>>>> m=match(r"(\w+)\[\:(\w*)$",txt[1:pos]) >>>>>>>> if isa(m,Nothing) || !isdefined(Main,parse(m.captures[1])) >>>>>>>> return UTF8String[], 0:-1, false >>>>>>>> end >>>>>>>> var=eval(parse(m.captures[1])) >>>>>>>> if !applicable(keys,var) >>>>>>>> return UTF8String[], 0:-1, false >>>>>>>> end >>>>>>>> ky=keys(var) >>>>>>>> if length(ky)>500 >>>>>>>> return UTF8String[], 0:-1, false >>>>>>>> end >>>>>>>> ky=map(string,[filter(x->isa(x,Symbol),ky)...]) >>>>>>>> lst=convert(Vector{UTF8String},[filter(x->beginswith(x,m. >>>>>>>> captures[2]),ky)...]) >>>>>>>> if !(length(txt)>=pos+1 && txt[pos+1]==']') >>>>>>>> lst=map(x->x*"]",lst) >>>>>>>> end >>>>>>>> return lst, (pos-length(m.captures[2])+1):pos, true >>>>>>>> end >>>>>>>> end >>>>>>>> >>>>>>>> Now it is work on string and symbol key, really cool! >>>>>>>> It can also auto-complete the method of python object ^ ^v >>>>>>>> >>>>>>>> On Wednesday, October 29, 2014 11:47:32 AM UTC+1, Ivar Nesje wrote: >>>>>>>>> >>>>>>>>> That would be cool! >>>>>>>>> >>>>>>>>> Currently there isn't any hooks you can use for that purpose (I >>>>>>>>> believe), but as most of Julia is written in Julia, it should be a >>>>>>>>> reasonable project to include the required functionality in >>>>>>>>> /base/REPLCompletions.jl >>>>>>>>> <https://github.com/JuliaLang/julia/blob/master/base/REPLCompletions.jl#L185> >>>>>>>>> and submit a pull request on Github. This would likely be nice >>>>>>>>> for other associative structures (PyCall anyone?) also. >>>>>>>>> >>>>>>>>> You will have to look for unclosed `[` that is either empty or >>>>>>>>> continue with a `:` indicating a symbol or `"` indicating a string >>>>>>>>> index. >>>>>>>>> >>>>>>>>> Ivar >>>>>>>>> >>>>>>>>> kl. 10:06:19 UTC+1 onsdag 29. oktober 2014 skrev >>>>>>>>> [email protected] følgende: >>>>>>>>>> >>>>>>>>>> Is there any way to add an customal autocomplete list to Julia >>>>>>>>>> REPL? For example, I really hope the Dict can be as convenient as >>>>>>>>>> MATLAB >>>>>>>>>> structure that the keys can be autpcompleted in command line. >>>>>>>>>> >>>>>>>>> >>>>>> >
