summaryrefslogtreecommitdiffstats
path: root/Tools/idle/AutoExpand.py
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/idle/AutoExpand.py')
-rw-r--r--Tools/idle/AutoExpand.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/Tools/idle/AutoExpand.py b/Tools/idle/AutoExpand.py
new file mode 100644
index 0000000..0d80ce8
--- /dev/null
+++ b/Tools/idle/AutoExpand.py
@@ -0,0 +1,75 @@
+import string
+import re
+
+class AutoExpand:
+
+ wordchars = string.letters + string.digits + "_"
+
+ def __init__(self, text):
+ self.text = text
+ self.text.wordlist = None
+ self.state = None
+ self.text.bind("<<expand-word>>", self.autoexpand)
+
+ def autoexpand(self, event):
+ curinsert = self.text.index("insert")
+ curline = self.text.get("insert linestart", "insert lineend")
+ if not self.state:
+ words = self.getwords()
+ index = 0
+ else:
+ words, index, insert, line = self.state
+ if insert != curinsert or line != curline:
+ words = self.getwords()
+ index = 0
+ if not words:
+ self.text.bell()
+ return "break"
+ word = self.getprevword()
+ self.text.delete("insert - %d chars" % len(word), "insert")
+ newword = words[index]
+ index = (index + 1) % len(words)
+ if index == 0:
+ self.text.bell() # Warn we cycled around
+ self.text.insert("insert", newword)
+ curinsert = self.text.index("insert")
+ curline = self.text.get("insert linestart", "insert lineend")
+ self.state = words, index, curinsert, curline
+ return "break"
+
+ def getwords(self):
+ word = self.getprevword()
+ if not word:
+ return []
+ before = self.text.get("1.0", "insert wordstart")
+ wbefore = re.findall(r"\b" + word + r"\w+\b", before)
+ del before
+ after = self.text.get("insert wordend", "end")
+ wafter = re.findall(r"\b" + word + r"\w+\b", after)
+ del after
+ if not wbefore and not wafter:
+ return []
+ words = []
+ dict = {}
+ # search backwards through words before
+ wbefore.reverse()
+ for w in wbefore:
+ if dict.get(w):
+ continue
+ words.append(w)
+ dict[w] = w
+ # search onwards through words after
+ for w in wafter:
+ if dict.get(w):
+ continue
+ words.append(w)
+ dict[w] = w
+ words.append(word)
+ return words
+
+ def getprevword(self):
+ line = self.text.get("insert linestart", "insert")
+ i = len(line)
+ while i > 0 and line[i-1] in self.wordchars:
+ i = i-1
+ return line[i:]