annotate Lib/idlelib/AutoComplete.py @ 78069:a8aa77458e12 3.2

Add c_size_t and c_ssize_t to the ctypes summary table.
author Antoine Pitrou <solipsis@pitrou.net>
date Thu, 12 Jul 2012 20:31:50 +0200
parents 62030ebb2b01
children 82fc6ff7aa3e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
1 """AutoComplete.py - An IDLE extension for automatically completing names.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
2
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
3 This extension can complete either attribute names of file names. It can pop
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
4 a window with all available names, for the user to select from.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
5 """
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
6 import os
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
7 import sys
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
8 import string
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
9
42714
2ec16b6b4d04 Switch to absolute imports to support direct execution of modules. Many
Kurt B. Kaiser <kbk@shore.net>
parents: 42516
diff changeset
10 from idlelib.configHandler import idleConf
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
11
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
12 # This string includes all chars that may be in a file name (without a path
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
13 # separator)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
14 FILENAME_CHARS = string.ascii_letters + string.digits + os.curdir + "._~#$:-"
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
15 # This string includes all chars that may be in an identifier
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
16 ID_CHARS = string.ascii_letters + string.digits + "_"
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
17
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
18 # These constants represent the two different types of completions
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
19 COMPLETE_ATTRIBUTES, COMPLETE_FILES = range(1, 2+1)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
20
42714
2ec16b6b4d04 Switch to absolute imports to support direct execution of modules. Many
Kurt B. Kaiser <kbk@shore.net>
parents: 42516
diff changeset
21 from idlelib import AutoCompleteWindow
2ec16b6b4d04 Switch to absolute imports to support direct execution of modules. Many
Kurt B. Kaiser <kbk@shore.net>
parents: 42516
diff changeset
22 from idlelib.HyperParser import HyperParser
42516
f0cfed38b9d9 Fix circular import issue
Kurt B. Kaiser <kbk@shore.net>
parents: 42515
diff changeset
23
f0cfed38b9d9 Fix circular import issue
Kurt B. Kaiser <kbk@shore.net>
parents: 42515
diff changeset
24 import __main__
f0cfed38b9d9 Fix circular import issue
Kurt B. Kaiser <kbk@shore.net>
parents: 42515
diff changeset
25
46664
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46222
diff changeset
26 SEPS = os.sep
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46222
diff changeset
27 if os.altsep: # e.g. '/' on Windows...
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46222
diff changeset
28 SEPS += os.altsep
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46222
diff changeset
29
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
30 class AutoComplete:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
31
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
32 menudefs = [
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
33 ('edit', [
43734
3e5edf19d5f0 Merged revisions 58221-58741 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 42714
diff changeset
34 ("Show Completions", "<<force-open-completions>>"),
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
35 ])
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
36 ]
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
37
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
38 popupwait = idleConf.GetOption("extensions", "AutoComplete",
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
39 "popupwait", type="int", default=0)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
40
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
41 def __init__(self, editwin=None):
46222
aed698c8647b Merged revisions 62021,62029,62035-62038,62043-62044,62052-62053 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 43734
diff changeset
42 self.editwin = editwin
aed698c8647b Merged revisions 62021,62029,62035-62038,62043-62044,62052-62053 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 43734
diff changeset
43 if editwin is None: # subprocess and test
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
44 return
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
45 self.text = editwin.text
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
46 self.autocompletewindow = None
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
47
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
48 # id of delayed call, and the index of the text insert when the delayed
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
49 # call was issued. If _delayed_completion_id is None, there is no
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
50 # delayed call.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
51 self._delayed_completion_id = None
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
52 self._delayed_completion_index = None
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
53
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
54 def _make_autocomplete_window(self):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
55 return AutoCompleteWindow.AutoCompleteWindow(self.text)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
56
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
57 def _remove_autocomplete_window(self, event=None):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
58 if self.autocompletewindow:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
59 self.autocompletewindow.hide_window()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
60 self.autocompletewindow = None
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
61
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
62 def force_open_completions_event(self, event):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
63 """Happens when the user really wants to open a completion list, even
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
64 if a function call is needed.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
65 """
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
66 self.open_completions(True, False, True)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
67
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
68 def try_open_completions_event(self, event):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
69 """Happens when it would be nice to open a completion list, but not
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 46664
diff changeset
70 really necessary, for example after an dot, so function
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
71 calls won't be made.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
72 """
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
73 lastchar = self.text.get("insert-1c")
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
74 if lastchar == ".":
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
75 self._open_completions_later(False, False, False,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
76 COMPLETE_ATTRIBUTES)
46664
031dfe455585 Merged revisions 62425-62429,62434-62436,62441,62444,62446-62448,62450-62455,62463,62465-62466,62469,62474,62476-62478,62480,62485,62492,62497-62498,62500,62507,62513-62514,62516,62521,62531,62535,62545-62546,62548-62551,62553-62559,62569,62574,62577,62593,62595,62604-62606,62608,62616,62626-62627,62636,62638,62644-62645,62647-62648,62651-62653,62656,62661,62663,62680,62686-62687,62696,62699-62703,62711 via svnmerge from
Christian Heimes <christian@cheimes.de>
parents: 46222
diff changeset
77 elif lastchar in SEPS:
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
78 self._open_completions_later(False, False, False,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
79 COMPLETE_FILES)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
80
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
81 def autocomplete_event(self, event):
51776
d06a3ebf306f Merged revisions 69846 via svnmerge from
Mark Dickinson <dickinsm@gmail.com>
parents: 46664
diff changeset
82 """Happens when the user wants to complete his word, and if necessary,
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
83 open a completion list after that (if there is more than one
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
84 completion)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
85 """
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
86 if hasattr(event, "mc_state") and event.mc_state:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
87 # A modifier was pressed along with the tab, continue as usual.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
88 return
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
89 if self.autocompletewindow and self.autocompletewindow.is_active():
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
90 self.autocompletewindow.complete()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
91 return "break"
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
92 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
93 opened = self.open_completions(False, True, True)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
94 if opened:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
95 return "break"
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
96
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
97 def _open_completions_later(self, *args):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
98 self._delayed_completion_index = self.text.index("insert")
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
99 if self._delayed_completion_id is not None:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
100 self.text.after_cancel(self._delayed_completion_id)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
101 self._delayed_completion_id = \
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
102 self.text.after(self.popupwait, self._delayed_open_completions,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
103 *args)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
104
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
105 def _delayed_open_completions(self, *args):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
106 self._delayed_completion_id = None
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
107 if self.text.index("insert") != self._delayed_completion_index:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
108 return
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
109 self.open_completions(*args)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
110
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
111 def open_completions(self, evalfuncs, complete, userWantsWin, mode=None):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
112 """Find the completions and create the AutoCompleteWindow.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
113 Return True if successful (no syntax error or so found).
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
114 if complete is True, then if there's nothing to complete and no
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
115 start of completion, won't open completions and return False.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
116 If mode is given, will open a completion list only in this mode.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
117 """
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
118 # Cancel another delayed call, if it exists.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
119 if self._delayed_completion_id is not None:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
120 self.text.after_cancel(self._delayed_completion_id)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
121 self._delayed_completion_id = None
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
122
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
123 hp = HyperParser(self.editwin, "insert")
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
124 curline = self.text.get("insert linestart", "insert")
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
125 i = j = len(curline)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
126 if hp.is_in_string() and (not mode or mode==COMPLETE_FILES):
77322
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
127 # Find the beginning of the string
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
128 # fetch_completions will look at the file system to determine whether the
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
129 # string value constitutes an actual file name
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
130 # XXX could consider raw strings here and unescape the string value if it's
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
131 # not raw.
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
132 self._remove_autocomplete_window()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
133 mode = COMPLETE_FILES
77322
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
134 # Find last separator or string start
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
135 while i and curline[i-1] not in "'\"" + SEPS:
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
136 i -= 1
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
137 comp_start = curline[i:j]
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
138 j = i
77322
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
139 # Find string start
41e85ac2ccef Issue #14937: Perform auto-completion of filenames in strings even for non-ASCII filenames.
Martin v. Löwis <martin@v.loewis.de>
parents: 74797
diff changeset
140 while i and curline[i-1] not in "'\"":
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
141 i -= 1
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
142 comp_what = curline[i:j]
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
143 elif hp.is_in_code() and (not mode or mode==COMPLETE_ATTRIBUTES):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
144 self._remove_autocomplete_window()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
145 mode = COMPLETE_ATTRIBUTES
77424
62030ebb2b01 Issue #14937: Fix typo. Patch by Roger Serwy.
Martin v. Löwis <martin@v.loewis.de>
parents: 77326
diff changeset
146 while i and (curline[i-1] in ID_CHARS or ord(curline[i-1]) > 127):
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
147 i -= 1
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
148 comp_start = curline[i:j]
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
149 if i and curline[i-1] == '.':
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
150 hp.set_index("insert-%dc" % (len(curline)-(i-1)))
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
151 comp_what = hp.get_expression()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
152 if not comp_what or \
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
153 (not evalfuncs and comp_what.find('(') != -1):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
154 return
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
155 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
156 comp_what = ""
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
157 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
158 return
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
159
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
160 if complete and not comp_what and not comp_start:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
161 return
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
162 comp_lists = self.fetch_completions(comp_what, mode)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
163 if not comp_lists[0]:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
164 return
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
165 self.autocompletewindow = self._make_autocomplete_window()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
166 self.autocompletewindow.show_window(comp_lists,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
167 "insert-%dc" % len(comp_start),
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
168 complete,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
169 mode,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
170 userWantsWin)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
171 return True
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
172
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
173 def fetch_completions(self, what, mode):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
174 """Return a pair of lists of completions for something. The first list
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
175 is a sublist of the second. Both are sorted.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
176
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
177 If there is a Python subprocess, get the comp. list there. Otherwise,
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
178 either fetch_completions() is running in the subprocess itself or it
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
179 was called in an IDLE EditorWindow before any script had been run.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
180
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
181 The subprocess environment is that of the most recently run script. If
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
182 two unrelated modules are being edited some calltips in the current
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
183 module may be inoperative if the module was not the last to run.
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
184 """
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
185 try:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
186 rpcclt = self.editwin.flist.pyshell.interp.rpcclt
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
187 except:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
188 rpcclt = None
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
189 if rpcclt:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
190 return rpcclt.remotecall("exec", "get_the_completion_list",
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
191 (what, mode), {})
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
192 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
193 if mode == COMPLETE_ATTRIBUTES:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
194 if what == "":
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
195 namespace = __main__.__dict__.copy()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
196 namespace.update(__main__.__builtins__.__dict__)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
197 bigl = eval("dir()", namespace)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
198 bigl.sort()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
199 if "__all__" in bigl:
74797
d8f988b0c959 #13933 refine patch using 'new' builtin
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74767
diff changeset
200 smalll = sorted(eval("__all__", namespace))
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
201 else:
42515
0870e8e9e99f Fix filter() issues
Kurt B. Kaiser <kbk@shore.net>
parents: 42324
diff changeset
202 smalll = [s for s in bigl if s[:1] != '_']
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
203 else:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
204 try:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
205 entity = self.get_entity(what)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
206 bigl = dir(entity)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
207 bigl.sort()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
208 if "__all__" in bigl:
74797
d8f988b0c959 #13933 refine patch using 'new' builtin
Terry Jan Reedy <tjreedy@udel.edu>
parents: 74767
diff changeset
209 smalll = sorted(entity.__all__)
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
210 else:
42515
0870e8e9e99f Fix filter() issues
Kurt B. Kaiser <kbk@shore.net>
parents: 42324
diff changeset
211 smalll = [s for s in bigl if s[:1] != '_']
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
212 except:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
213 return [], []
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
214
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
215 elif mode == COMPLETE_FILES:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
216 if what == "":
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
217 what = "."
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
218 try:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
219 expandedpath = os.path.expanduser(what)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
220 bigl = os.listdir(expandedpath)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
221 bigl.sort()
42515
0870e8e9e99f Fix filter() issues
Kurt B. Kaiser <kbk@shore.net>
parents: 42324
diff changeset
222 smalll = [s for s in bigl if s[:1] != '.']
35891
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
223 except OSError:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
224 return [], []
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
225
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
226 if not smalll:
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
227 smalll = bigl
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
228 return smalll, bigl
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
229
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
230 def get_entity(self, name):
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
231 """Lookup name in a namespace spanning sys.modules and __main.dict__"""
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
232 namespace = sys.modules.copy()
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
233 namespace.update(__main__.__dict__)
8fd46b660e66 Merge IDLE-syntax-branch r39668:41449 into trunk
Kurt B. Kaiser <kbk@shore.net>
parents:
diff changeset
234 return eval(name, namespace)