[IPython-dev] function specific tab completion via annotations

Matthias BUSSONNIER bussonniermatthias at gmail.com
Tue Dec 18 05:03:53 EST 2012


Le 18 déc. 2012 à 10:52, Robert McGibbon a écrit :

> Matthias,
> 
> Good call. That's it exactly. Unfortunately, I think dealing with this issue is a little above my expertise/experience.
> 
> When I apply this patch (pasted below) to the PR, the tab completions show in the notebook for foo(<TAB>.
> 
> The problem is that behavior kind of conflicts with the tooltip feature, which is not a feature of the terminal console.

without your patch, 
You could set         
this.tooltip_on_tab = true;
L25 in codecell.js to false. 
It will trigger the tooltip only if you stay after a opening bracket for a certain amount of time.
The the completer should work as expected. 

It should be made configurable. 

we could try to tweak the behavior so that (<tab> trigger tooltip
([space]<tab> trigger completion.

But I guess that's beyond the extend of your PR.
-- 
Matthias


> 
> -Robert
> 
> p.s.
> 
> I think I'm finally starting to see the wisdom of the comment on line 1046 of IPython/core/complete.py,
> 
>>         # FIXME: we should extend our api to return a dict with completions for
>>         # different types of objects.  The rlcomplete() method could then
>>         # simply collapse the dict into a list for readline, but we'd have
>>         # richer completion semantics in other evironments.
> 
> 
> $ git diff
> diff --git a/IPython/frontend/html/notebook/static/js/codecell.js b/IPython/frontend/html/notebook/static/js/codecell.js
> index ea34719..000734b 100644
> --- a/IPython/frontend/html/notebook/static/js/codecell.js
> +++ b/IPython/frontend/html/notebook/static/js/codecell.js
> @@ -155,6 +155,8 @@ var IPython = (function (IPython) {
>                  IPython.tooltip.request(that);
>                  // Prevent the event from bubbling up.
>                  event.stop();
> +                console.log('RTM DEBUG');
> +                this.completer.startCompletion();
>                  // Prevent CodeMirror from handling the tab.
>                  return true;
>              } else {
> diff --git a/IPython/frontend/html/notebook/static/js/completer.js b/IPython/frontend/html/notebook/static/js/completer.js
> index ac2d95c..94aff4b 100644
> --- a/IPython/frontend/html/notebook/static/js/completer.js
> +++ b/IPython/frontend/html/notebook/static/js/completer.js
> @@ -105,8 +105,9 @@ var IPython = (function (IPython) {
>          // we need to check that we are still on a word boundary
>          // because while typing the completer is still reinvoking itself
>          if (!/[0-9a-z._/\\:~-]/i.test(pre_cursor)) {
> -            this.close();
> -            return;
> +            //this.close();
> +            //return;
> +            console.log('RTM DEBUG2');
>          }
>  
>          this.autopick = false;
> 
> 
> On Dec 18, 2012, at 1:17 AM, Matthias Bussonnier wrote:
> 
>> Ah... Then it's probably the tooltip code that take over.
>> 
>> Same folder, codecell.js look for TAB or pre_cursor.
>> 
>> Completion is not triggerd if char in front of cursor is space or opening bracket.
>> 
>> Short from my phone.
>> 
>> Le 18 déc. 2012 09:28, "Robert McGibbon" <rmcgibbo at gmail.com> a écrit :
>> Marrhias
>> 
>> the baz(notevaluated).<TAB> is working in the notebook.
>> 
>> it's the foo(<TAB> that's not working... yet.
>> 
>> my fridge is not out of beer, so i'm still working :)
>> 
>> -Robert
>> 
>> On Dec 18, 2012, at 12:22 AM, Matthias BUSSONNIER wrote:
>> 
>>> 
>>> Le 18 déc. 2012 à 09:03, Robert McGibbon a écrit :
>>> 
>>>> It's not working in the notebook with the argument specific completions, but the return value completion is working. There must be some issue with a difference in the line splitting with readline and without. I'll track it down.
>>> 
>>> That's probably the js that removes everything between bracket by nothing
>>> (IIRC, first completer was doing that.)
>>> 
>>> baz(notevaluated).<tab>
>>> to 
>>> baz.<tab>
>>> 
>>> before completion. (or is it tooltip... that does it) 
>>> 
>>> Or a security about 'as you type' 
>>> 
>>> Actually every key press recall the completer once it has been invoked and it decide to 'kill itself' 
>>> on certain things (like closing bracket, spaces...) 
>>> 
>>> That would be 
>>> 
>>> IPython/frontend/html/notebook/static/js/completer.js ~L 100 smth.
>>> -- 
>>> Matthias
>>> 
>>> 
>>> 
>>>> 
>>>> -Robert
>>>> 
>>>> On Dec 17, 2012, at 11:51 PM, Brian Granger wrote:
>>>> 
>>>>> This looks really great.  Have you tested it with the notebook yet?  I
>>>>> would imagine that it should already work there as well.
>>>>> 
>>>>> On Mon, Dec 17, 2012 at 11:27 PM, Robert McGibbon <rmcgibbo at gmail.com> wrote:
>>>>>> Hey,
>>>>>> 
>>>>>> I just posted a new PR for annotation based custom tab completion.
>>>>>> https://github.com/ipython/ipython/pull/2701
>>>>>> 
>>>>>> The code is fairly complex (~1000 new lines), so I assume that there are
>>>>>> bugs. For that reason (and because its fun!), I encourage people
>>>>>> to try taking it out for a spin.
>>>>>> 
>>>>>> 
>>>>>> It lets you do things like this:
>>>>>> 
>>>>>> In [1]: from IPython.extensions.completion import tab_complete, globs_to,
>>>>>> literal
>>>>>> 
>>>>>> In [2]: @tab_complete
>>>>>> ...: def baz(x) -> str:
>>>>>> ...:     pass
>>>>>> ...:
>>>>>> 
>>>>>> In [3]: baz(notevaluated).<TAB>
>>>>>> .capitalize  .find        .isspace     .partition   .rstrip      .translate
>>>>>> .center      .format      .istitle     .replace     .split       .upper
>>>>>> .count       .index       .isupper     .rfind       .splitlines  .zfill
>>>>>> .decode      .isalnum     .join        .rindex      .startswith
>>>>>> .encode      .isalpha     .ljust       .rjust       .strip
>>>>>> .endswith    .isdigit     .lower       .rpartition  .swapcase
>>>>>> .expandtabs  .islower     .lstrip      .rsplit      .title
>>>>>> 
>>>>>> 
>>>>>> And this:
>>>>>> 
>>>>>> In [4]: @tab_complete
>>>>>> ...: def foo(x : globs_to('*.txt'), mode : literal('r', 'w')):
>>>>>> ...:     pass
>>>>>> ...:
>>>>>> 
>>>>>> In [5]: foo(<TAB>
>>>>>> 'COPYING.txt'        'dist/'              'setupext/'
>>>>>> 'IPython/'           'docs/'              'tools/'
>>>>>> '__pycache__/'       'ipython.egg-info/'
>>>>>> 'build/'             'scripts/'
>>>>>> 
>>>>>> In[6]: foo('COPYING.txt', <TAB>
>>>>>> 'r', 'w'
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -Robert
>>>>>> 
>>>>>> _______________________________________________
>>>>>> IPython-dev mailing list
>>>>>> IPython-dev at scipy.org
>>>>>> http://mail.scipy.org/mailman/listinfo/ipython-dev
>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> Brian E. Granger
>>>>> Cal Poly State University, San Luis Obispo
>>>>> bgranger at calpoly.edu and ellisonbg at gmail.com
>>>>> _______________________________________________
>>>>> IPython-dev mailing list
>>>>> IPython-dev at scipy.org
>>>>> http://mail.scipy.org/mailman/listinfo/ipython-dev
>>>> 
>>>> _______________________________________________
>>>> IPython-dev mailing list
>>>> IPython-dev at scipy.org
>>>> http://mail.scipy.org/mailman/listinfo/ipython-dev
>>> 
>>> _______________________________________________
>>> IPython-dev mailing list
>>> IPython-dev at scipy.org
>>> http://mail.scipy.org/mailman/listinfo/ipython-dev
>> 
>> 
>> _______________________________________________
>> IPython-dev mailing list
>> IPython-dev at scipy.org
>> http://mail.scipy.org/mailman/listinfo/ipython-dev
>> 
>> _______________________________________________
>> IPython-dev mailing list
>> IPython-dev at scipy.org
>> http://mail.scipy.org/mailman/listinfo/ipython-dev
> 
> _______________________________________________
> IPython-dev mailing list
> IPython-dev at scipy.org
> http://mail.scipy.org/mailman/listinfo/ipython-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ipython-dev/attachments/20121218/7a60fa25/attachment.html>


More information about the IPython-dev mailing list