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, <xiongji...@gmail.com> 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 xiong...@gmail.com >> 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 <iva...@gmail.com> 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 xiong...@gmail.com >>>>>> 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.cap >>>>>>> tures[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.cap >>>>>>> tures[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 xiong...@gmail.com >>>>>>>> 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. >>>>>>>>> >>>>>>>> >>>>>