mirror of
https://github.com/python/cpython.git
synced 2024-12-29 19:55:17 +08:00
1061e7270b
M Bindings.py M EditorWindow.py M PyShell.py M config-keys.def M configHandler.py M help.txt 1. Annotate the shell window with last restart boundary upon restart. 2. Provide a shell menu entry and hot key (F6) to jump to the last restart boundary. 3. Add a new shell menu feature to restart the shell. 4. Update the help menu to add these features. 5. Update the help menu to put text in same order as the menus. 6. Correct a capitalization inconsistency on the Edit menu: Expand Word 7. Rename the "Debug" menu to be "Shell": it's doing more now. 8. Rearrange the "Shell" menu to make the StackViewer entries adjacent. 9. Add a get_geometry method to EditorWindow, which may be of use in making window positions persisent. 10. Make <ctrl-v> the "Classic Windows" paste key. 11. Restore decorum on the Help menu by removing "Advice". As Guido said, things will never be the same. Thanks, David!
84 lines
2.4 KiB
Python
84 lines
2.4 KiB
Python
import string
|
|
import re
|
|
|
|
###$ event <<expand-word>>
|
|
###$ win <Alt-slash>
|
|
###$ unix <Alt-slash>
|
|
|
|
class AutoExpand:
|
|
|
|
menudefs = [
|
|
('edit', [
|
|
('E_xpand Word', '<<expand-word>>'),
|
|
]),
|
|
]
|
|
|
|
wordchars = string.ascii_letters + string.digits + "_"
|
|
|
|
def __init__(self, editwin):
|
|
self.text = editwin.text
|
|
self.state = None
|
|
|
|
def expand_word_event(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:]
|