classification
Title: Syntax-related improvements to IDLE
Type: Stage:
Components: IDLE Versions:
process
Status: closed Resolution: accepted
Dependencies: Superseder:
Assigned To: kbk Nosy List: kbk, noamr
Priority: normal Keywords: patch

Created on 2004-02-29 01:40 by noamr, last changed 2005-11-18 22:09 by kbk. This issue is now closed.

Files
File name Uploaded Description Edit
syntaxdiffs noamr, 2004-02-29 01:40 Diffs agains CVS in 29.02.04
idlesyntax.10Jul05.diff kbk, 2005-10-09 18:30 New Patch from NR sent 10Jul05
Messages (5)
msg45432 - (view) Author: Noam Raphael (noamr) * Date: 2004-02-29 01:40
Yes! It's finally here! The big bunch of syntax-related
improvements to IDLE!

Here are a few highlights:
* Completion in Visual C++ style!
* CallTip windows now disappear when you don't want them!
* ParenMatch now works!

And in a more general way:
* The MultiCall class enables one event to trigger
multiple actions, so that you extensions can do
whatever they want without fighting who'll know when a
key is being released (for example).
* The HyperParser class gives extensions a better
understanding of Python code, so that CallTips and
ParenMatch can now be shown from anywhere in the code
(not only after opening/closing parens), and CallTips
and AutoCompletion is available for complex
expressions, not just for expressions which look like
identifier1.identifer2.

IDLE with these changes was tested by about 15 people
for a few months, and beside some minor inconviniences
(for example, concerning when AutoComplete chooses to
complete), no critical bugs were found.

Here's a complete description of all the changes to files:

* Used MultiCall
In order to allow multiple actions to happen when one
event happens (for example, when closing a bracket,
show the opening bracket and close the calltip), I
wrote a class called MultiCall, which, in this case,
inherits from the Text widget, and overrides binding
functions, so that all matching
functions will be called when an event takes place.
New file: MultiCall.py
EditorWindow.py:
  diff 1, line 8: importing MultiCall
  diff 2, line 89: Use MultiCallCreator(Text) instead
of Text
  diff 3, line 226: bind set_line_and_column using
virtual events, so that it will be handled by MultiCall
  diff 4, line 333: Control+C, in Windows keys, means
both copy and break. The three lines added solve the
conflict.
  diff 5,6,7, line 524: When changing key
configuration, first the current keys must be unbinded,
then the new ones binded.
configDialog.py:
  diffs 1,2,3: When changing key configuration, first
the current keys must be unbinded, then the new ones
binded.

* Improved parsing abilities - HyperParser
The new HyperParser class uses PyParse to find
information about the bracketing structure of a Python
code, and to find the expression which should be
evaluated in CallTips and AutoComplete.
New file: HyperParser.py
EditorWindow.py: diff 8, 9, line 1072: Previously, the
prompt was detected textually, by searching for ">>>".
This is not generic, and I changed it to look for a
text tagged by the "console" tag.
PyParse.py:
  diff 1, line 16: 'if' and 'for' can't be considered
block openers now, since list comprehension was introduced.
  diff 2-5, line 147: using the "prompt" tag instead of
searching for ">>>".
  diff 6-15, line 357: Now, _study2 also saves
information about the bracketing structure of the code.
PyShell.py:
  diff 1, line 1049: use the "prompt" tag instead of
searching for ">>>"

* Added the AutoComplete extension:
This extension opens a completion window after typing a
dot or when requesting a completion using tab or
control+space. It will evaluate code with function
calls only when requested by control+space.
New file: AutoComplete.py
New file: AutoCompleteWindow.py
config-extensions.def:
  diff 5: three new bindings - force-open-completions
opens a completion win and is ready to evaluate
functions. autocomplete tries to complete the current
word, and if fails, opens a completion window (happens
on tab). try-open-completions will open a completion
window when no functions calls need to be done.
run.py:
  diffs 1,2,3: Added functions in run.py for fetching
the available completions, in a method copied from the
method CallTips used when fetching the call tip.

* Improved the CallTips extension:
This extension is greatly improved, by using
HyperParser: CallTips now work for multi-lined function
calls, they can be opened from anywhere inside a
function brackets, and can evaluate expressions which
result in functions.
CallTips.py:
  diff 1, line 6: The future plans are already here.
  diff 2, line 11: no need to import string
  diff 3, line 14: import HyperParser
  diff 4, line 20: Now there's a menu command to open a
calltip.
  diff 5, line 39: cosmetical
  diff 6-11, line 44: Now there's no paren_open_event
and paren_close_event, since you can open CallTips
without typing parens. There's
force_open_calltip_event, which opens a calltip and is
ready to	make function calls, and
try_open_calltip_event, which will not agree to do such
a thing. We also use HyperParser, instead of finding
the function by ourselves.
  diff 12, line 153: It makes more sense to show the
repr of default arguments in calltips, not the str of them.
CallTipWindow.py:
  Now, the CallTipWindow is smart - it binds events to
hide itself and to position itself. Hiding occurs when
the cursor gets out of the parens.
config-extensions.def:
  diffs 1,2, line 42: We have three new bindings:
force-open-calltip opens a calltip and make function
calls, if needed. try-open-calltip opens a calltip if
it doesn't need to make function calls. refresh-calltip
will close a calltip if not needed, and change it to
another one if	needed. It is binded both to parenright
and 0, because if the shift was raised before the
zero/parenright key, the event generated is KeyRelease-0.

* Improved the ParenMatch extension:
First, it now works, thanks to MultiCall. Also, it now
can be invoked without closing a paren, and the
surrounding parens will be highlighted.
ParenMatch.py:
  All the code for event handling and finding the paren
area was rewritten, using HyperParser, and relying on
MultiCall.
config-extensions.def:
  diff 3, line 50: enable it again
  diff 4,5: changed the binding so we now have
flash-paren, which shows the	surrounding parens, and
paren-closed, which is instead of flash-open-paren.

Patch and enjoy!
Noam Raphael
msg45433 - (view) Author: Noam Raphael (noamr) * Date: 2004-04-26 21:49
Logged In: YES 
user_id=679426

I made a small usability bug, because I didn't parenthesize
a boolean expression correctly.
Line 298 should be changed to:
and (self.mode==AutoComplete.COMPLETE_ATTRIBUTES or self.start):

Happy Israel Independence Day!
Noam Raphael
msg45434 - (view) Author: Kurt B. Kaiser (kbk) * (Python committer) Date: 2005-10-09 18:30
Logged In: YES 
user_id=149084

Add Noam Raphael's patch dated 10Jul05
msg45435 - (view) Author: Kurt B. Kaiser (kbk) * (Python committer) Date: 2005-10-10 04:02
Logged In: YES 
user_id=149084

Checked in idlesyntax.10Jul05.diff on a branch:
IDLE-syntax-branch.

To switch to this branch:
cvs up -r IDLE-syntax-branch

To switch back to the IDLE trunk:
cvs up -A

Further changes to this line of development should
be submitted as diffs against the branch.
msg45436 - (view) Author: Kurt B. Kaiser (kbk) * (Python committer) Date: 2005-11-18 22:09
Logged In: YES 
user_id=149084

Merged to svn trunk.

Further changes to this line of development should
be submitted as diffs against the trunk.
History
Date User Action Args
2004-02-29 01:40:09noamrcreate