annotate Lib/idlelib/AutoExpand.py @ 79675:c0a2294de787 2.7

Issue #16199: Backport 2to3 typo fix from 3.2.
author Chris Jerdonek <chris.jerdonek@gmail.com>
date Thu, 11 Oct 2012 16:15:46 -0700
parents b865925ef68a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1 import string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
2 import re
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
3
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
4 ###$ event <<expand-word>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
5 ###$ win <Alt-slash>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
6 ###$ unix <Alt-slash>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
7
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
8 class AutoExpand:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
9
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
10 menudefs = [
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
11 ('edit', [
27074
b865925ef68a M AutoExpand.py
Kurt B. Kaiser <kbk@shore.net>
parents: 25278
diff changeset
12 ('E_xpand Word', '<<expand-word>>'),
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
13 ]),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
14 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
15
25278
f3d88ee05928 Merge Py Idle's Rev 1.5
Kurt B. Kaiser <kbk@shore.net>
parents: 21765
diff changeset
16 wordchars = string.ascii_letters + string.digits + "_"
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
17
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
18 def __init__(self, editwin):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19 self.text = editwin.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
20 self.state = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
21
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
22 def expand_word_event(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
23 curinsert = self.text.index("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
24 curline = self.text.get("insert linestart", "insert lineend")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
25 if not self.state:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
26 words = self.getwords()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
27 index = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
28 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
29 words, index, insert, line = self.state
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
30 if insert != curinsert or line != curline:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
31 words = self.getwords()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
32 index = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
33 if not words:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
34 self.text.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
35 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
36 word = self.getprevword()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
37 self.text.delete("insert - %d chars" % len(word), "insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
38 newword = words[index]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
39 index = (index + 1) % len(words)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
40 if index == 0:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
41 self.text.bell() # Warn we cycled around
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
42 self.text.insert("insert", newword)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
43 curinsert = self.text.index("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
44 curline = self.text.get("insert linestart", "insert lineend")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
45 self.state = words, index, curinsert, curline
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
46 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
48 def getwords(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
49 word = self.getprevword()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
50 if not word:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
51 return []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
52 before = self.text.get("1.0", "insert wordstart")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
53 wbefore = re.findall(r"\b" + word + r"\w+\b", before)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
54 del before
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
55 after = self.text.get("insert wordend", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
56 wafter = re.findall(r"\b" + word + r"\w+\b", after)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
57 del after
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
58 if not wbefore and not wafter:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
59 return []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
60 words = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
61 dict = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
62 # search backwards through words before
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
63 wbefore.reverse()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
64 for w in wbefore:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
65 if dict.get(w):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66 continue
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 words.append(w)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
68 dict[w] = w
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
69 # search onwards through words after
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
70 for w in wafter:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
71 if dict.get(w):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
72 continue
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
73 words.append(w)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
74 dict[w] = w
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
75 words.append(word)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76 return words
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78 def getprevword(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79 line = self.text.get("insert linestart", "insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
80 i = len(line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 while i > 0 and line[i-1] in self.wordchars:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82 i = i-1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
83 return line[i:]