<p>We could detect (? It is no valid python and seems appropriate</p>
<p>ITOH tooltip can also give info on non callable. One can trigger tooltip onlt after ?&lt;tab&gt; and remove the ? To allow fast typing.</p>
<div class="gmail_quote">Le 19 déc. 2012 00:05, &quot;Brian Granger&quot; &lt;<a href="mailto:ellisonbg@gmail.com">ellisonbg@gmail.com</a>&gt; a écrit :<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
I think we want both the tab completion and tooltip to work at the<br>
same time = not be mutually exclusive.  I think we should preserve TAB<br>
for the completion logic and move tooltip to something else to be<br>
consistent.  This new tab completion logic is really important.  Let&#39;s<br>
brain storm about ways of allowing both to coexist.<br>
<br>
On Tue, Dec 18, 2012 at 2:03 AM, Matthias BUSSONNIER<br>
&lt;<a href="mailto:bussonniermatthias@gmail.com">bussonniermatthias@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Le 18 déc. 2012 à 10:52, Robert McGibbon a écrit :<br>
&gt;<br>
&gt; Matthias,<br>
&gt;<br>
&gt; Good call. That&#39;s it exactly. Unfortunately, I think dealing with this issue<br>
&gt; is a little above my expertise/experience.<br>
&gt;<br>
&gt; When I apply this patch (pasted below) to the PR, the tab completions show<br>
&gt; in the notebook for foo(&lt;TAB&gt;.<br>
&gt;<br>
&gt; The problem is that behavior kind of conflicts with the tooltip feature,<br>
&gt; which is not a feature of the terminal console.<br>
&gt;<br>
&gt;<br>
&gt; without your patch,<br>
&gt; You could set<br>
&gt; this.tooltip_on_tab = true;<br>
&gt; L25 in codecell.js to false.<br>
&gt; It will trigger the tooltip only if you stay after a opening bracket for a<br>
&gt; certain amount of time.<br>
&gt; The the completer should work as expected.<br>
&gt;<br>
&gt; It should be made configurable.<br>
&gt;<br>
&gt; we could try to tweak the behavior so that (&lt;tab&gt; trigger tooltip<br>
&gt; ([space]&lt;tab&gt; trigger completion.<br>
&gt;<br>
&gt; But I guess that&#39;s beyond the extend of your PR.<br>
&gt; --<br>
&gt; Matthias<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; -Robert<br>
&gt;<br>
&gt; p.s.<br>
&gt;<br>
&gt; I think I&#39;m finally starting to see the wisdom of the comment on line 1046<br>
&gt; of IPython/core/complete.py,<br>
&gt;<br>
&gt;         # FIXME: we should extend our api to return a dict with completions<br>
&gt; for<br>
&gt;         # different types of objects.  The rlcomplete() method could then<br>
&gt;         # simply collapse the dict into a list for readline, but we&#39;d have<br>
&gt;         # richer completion semantics in other evironments.<br>
&gt;<br>
&gt;<br>
&gt; $ git diff<br>
&gt; diff --git a/IPython/frontend/html/notebook/static/js/codecell.js<br>
&gt; b/IPython/frontend/html/notebook/static/js/codecell.js<br>
&gt; index ea34719..000734b 100644<br>
&gt; --- a/IPython/frontend/html/notebook/static/js/codecell.js<br>
&gt; +++ b/IPython/frontend/html/notebook/static/js/codecell.js<br>
&gt; @@ -155,6 +155,8 @@ var IPython = (function (IPython) {<br>
&gt;                  IPython.tooltip.request(that);<br>
&gt;                  // Prevent the event from bubbling up.<br>
&gt;                  event.stop();<br>
&gt; +                console.log(&#39;RTM DEBUG&#39;);<br>
&gt; +                this.completer.startCompletion();<br>
&gt;                  // Prevent CodeMirror from handling the tab.<br>
&gt;                  return true;<br>
&gt;              } else {<br>
&gt; diff --git a/IPython/frontend/html/notebook/static/js/completer.js<br>
&gt; b/IPython/frontend/html/notebook/static/js/completer.js<br>
&gt; index ac2d95c..94aff4b 100644<br>
&gt; --- a/IPython/frontend/html/notebook/static/js/completer.js<br>
&gt; +++ b/IPython/frontend/html/notebook/static/js/completer.js<br>
&gt; @@ -105,8 +105,9 @@ var IPython = (function (IPython) {<br>
&gt;          // we need to check that we are still on a word boundary<br>
&gt;          // because while typing the completer is still reinvoking itself<br>
&gt;          if (!/[0-9a-z._/\\:~-]/i.test(pre_cursor)) {<br>
&gt; -            this.close();<br>
&gt; -            return;<br>
&gt; +            //this.close();<br>
&gt; +            //return;<br>
&gt; +            console.log(&#39;RTM DEBUG2&#39;);<br>
&gt;          }<br>
&gt;<br>
&gt;          this.autopick = false;<br>
&gt;<br>
&gt;<br>
&gt; On Dec 18, 2012, at 1:17 AM, Matthias Bussonnier wrote:<br>
&gt;<br>
&gt; Ah... Then it&#39;s probably the tooltip code that take over.<br>
&gt;<br>
&gt; Same folder, codecell.js look for TAB or pre_cursor.<br>
&gt;<br>
&gt; Completion is not triggerd if char in front of cursor is space or opening<br>
&gt; bracket.<br>
&gt;<br>
&gt; Short from my phone.<br>
&gt;<br>
&gt; Le 18 déc. 2012 09:28, &quot;Robert McGibbon&quot; &lt;<a href="mailto:rmcgibbo@gmail.com">rmcgibbo@gmail.com</a>&gt; a écrit :<br>
&gt;&gt;<br>
&gt;&gt; Marrhias<br>
&gt;&gt;<br>
&gt;&gt; the baz(notevaluated).&lt;TAB&gt; is working in the notebook.<br>
&gt;&gt;<br>
&gt;&gt; it&#39;s the foo(&lt;TAB&gt; that&#39;s not working... yet.<br>
&gt;&gt;<br>
&gt;&gt; my fridge is not out of beer, so i&#39;m still working :)<br>
&gt;&gt;<br>
&gt;&gt; -Robert<br>
&gt;&gt;<br>
&gt;&gt; On Dec 18, 2012, at 12:22 AM, Matthias BUSSONNIER wrote:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; Le 18 déc. 2012 à 09:03, Robert McGibbon a écrit :<br>
&gt;&gt;<br>
&gt;&gt; It&#39;s not working in the notebook with the argument specific completions,<br>
&gt;&gt; but the return value completion is working. There must be some issue with a<br>
&gt;&gt; difference in the line splitting with readline and without. I&#39;ll track it<br>
&gt;&gt; down.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; That&#39;s probably the js that removes everything between bracket by nothing<br>
&gt;&gt; (IIRC, first completer was doing that.)<br>
&gt;&gt;<br>
&gt;&gt; baz(notevaluated).&lt;tab&gt;<br>
&gt;&gt; to<br>
&gt;&gt; baz.&lt;tab&gt;<br>
&gt;&gt;<br>
&gt;&gt; before completion. (or is it tooltip... that does it)<br>
&gt;&gt;<br>
&gt;&gt; Or a security about &#39;as you type&#39;<br>
&gt;&gt;<br>
&gt;&gt; Actually every key press recall the completer once it has been invoked and<br>
&gt;&gt; it decide to &#39;kill itself&#39;<br>
&gt;&gt; on certain things (like closing bracket, spaces...)<br>
&gt;&gt;<br>
&gt;&gt; That would be<br>
&gt;&gt;<br>
&gt;&gt; IPython/frontend/html/notebook/static/js/completer.js ~L 100 smth.<br>
&gt;&gt; --<br>
&gt;&gt; Matthias<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; -Robert<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Dec 17, 2012, at 11:51 PM, Brian Granger wrote:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; This looks really great.  Have you tested it with the notebook yet?  I<br>
&gt;&gt;<br>
&gt;&gt; would imagine that it should already work there as well.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; On Mon, Dec 17, 2012 at 11:27 PM, Robert McGibbon &lt;<a href="mailto:rmcgibbo@gmail.com">rmcgibbo@gmail.com</a>&gt;<br>
&gt;&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hey,<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; I just posted a new PR for annotation based custom tab completion.<br>
&gt;&gt;<br>
&gt;&gt; <a href="https://github.com/ipython/ipython/pull/2701" target="_blank">https://github.com/ipython/ipython/pull/2701</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; The code is fairly complex (~1000 new lines), so I assume that there are<br>
&gt;&gt;<br>
&gt;&gt; bugs. For that reason (and because its fun!), I encourage people<br>
&gt;&gt;<br>
&gt;&gt; to try taking it out for a spin.<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; It lets you do things like this:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; In [1]: from IPython.extensions.completion import tab_complete, globs_to,<br>
&gt;&gt;<br>
&gt;&gt; literal<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; In [2]: @tab_complete<br>
&gt;&gt;<br>
&gt;&gt; ...: def baz(x) -&gt; str:<br>
&gt;&gt;<br>
&gt;&gt; ...:     pass<br>
&gt;&gt;<br>
&gt;&gt; ...:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; In [3]: baz(notevaluated).&lt;TAB&gt;<br>
&gt;&gt;<br>
&gt;&gt; .capitalize  .find        .isspace     .partition   .rstrip<br>
&gt;&gt; .translate<br>
&gt;&gt;<br>
&gt;&gt; .center      .format      .istitle     .replace     .split       .upper<br>
&gt;&gt;<br>
&gt;&gt; .count       .index       .isupper     .rfind       .splitlines  .zfill<br>
&gt;&gt;<br>
&gt;&gt; .decode      .isalnum     .join        .rindex      .startswith<br>
&gt;&gt;<br>
&gt;&gt; .encode      .isalpha     .ljust       .rjust       .strip<br>
&gt;&gt;<br>
&gt;&gt; .endswith    .isdigit     .lower       .rpartition  .swapcase<br>
&gt;&gt;<br>
&gt;&gt; .expandtabs  .islower     .lstrip      .rsplit      .title<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; And this:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; In [4]: @tab_complete<br>
&gt;&gt;<br>
&gt;&gt; ...: def foo(x : globs_to(&#39;*.txt&#39;), mode : literal(&#39;r&#39;, &#39;w&#39;)):<br>
&gt;&gt;<br>
&gt;&gt; ...:     pass<br>
&gt;&gt;<br>
&gt;&gt; ...:<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; In [5]: foo(&lt;TAB&gt;<br>
&gt;&gt;<br>
&gt;&gt; &#39;COPYING.txt&#39;        &#39;dist/&#39;              &#39;setupext/&#39;<br>
&gt;&gt;<br>
&gt;&gt; &#39;IPython/&#39;           &#39;docs/&#39;              &#39;tools/&#39;<br>
&gt;&gt;<br>
&gt;&gt; &#39;__pycache__/&#39;       &#39;ipython.egg-info/&#39;<br>
&gt;&gt;<br>
&gt;&gt; &#39;build/&#39;             &#39;scripts/&#39;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; In[6]: foo(&#39;COPYING.txt&#39;, &lt;TAB&gt;<br>
&gt;&gt;<br>
&gt;&gt; &#39;r&#39;, &#39;w&#39;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; -Robert<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt;<br>
&gt;&gt; IPython-dev mailing list<br>
&gt;&gt;<br>
&gt;&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt;&gt;<br>
&gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; --<br>
&gt;&gt;<br>
&gt;&gt; Brian E. Granger<br>
&gt;&gt;<br>
&gt;&gt; Cal Poly State University, San Luis Obispo<br>
&gt;&gt;<br>
&gt;&gt; <a href="mailto:bgranger@calpoly.edu">bgranger@calpoly.edu</a> and <a href="mailto:ellisonbg@gmail.com">ellisonbg@gmail.com</a><br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt;<br>
&gt;&gt; IPython-dev mailing list<br>
&gt;&gt;<br>
&gt;&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt;&gt;<br>
&gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt;<br>
&gt;&gt; IPython-dev mailing list<br>
&gt;&gt;<br>
&gt;&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt;&gt;<br>
&gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; IPython-dev mailing list<br>
&gt;&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; IPython-dev mailing list<br>
&gt;&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt;&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;&gt;<br>
&gt; _______________________________________________<br>
&gt; IPython-dev mailing list<br>
&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; IPython-dev mailing list<br>
&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; IPython-dev mailing list<br>
&gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
&gt; <a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
&gt;<br>
<br>
<br>
<br>
--<br>
Brian E. Granger<br>
Cal Poly State University, San Luis Obispo<br>
<a href="mailto:bgranger@calpoly.edu">bgranger@calpoly.edu</a> and <a href="mailto:ellisonbg@gmail.com">ellisonbg@gmail.com</a><br>
_______________________________________________<br>
IPython-dev mailing list<br>
<a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
</blockquote></div>