annotate Lib/idlelib/PyShell.py @ 18586:fe44428f9774 legacy-trunk

py-cvs-2001_07_13 (Rev 1.34) merge "Amazing. A very subtle change in policy in descr-branch actually found a bug here. Here's the deal: Class PyShell derives from class OutputWindow. Method PyShell.close() wants to invoke its parent method, but because PyShell long ago was inherited from class PyShellEditorWindow, it invokes PyShelEditorWindow.close(self). Now, class PyShellEditorWindow itself derives from class OutputWindow, and inherits the close() method from there without overriding it. Under the old rules, PyShellEditorWindow.close would return an unbound method restricted to the class that defined the implementation of close(), which was OutputWindow.close. Under the new rules, the unbound method is restricted to the class whose method was requested, that is PyShellEditorWindow, and this was correctly trapped as an error." --GvR
author Kurt B. Kaiser <kbk@shore.net>
date Sat, 14 Jul 2001 05:10:34 +0000
parents 12e7ad108229
children 6238a222b7cd
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 #! /usr/bin/env python
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
2
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
3 # changes by dscherer@cmu.edu
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
4
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
5 # the main() function has been replaced by a whole class, in order to
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
6 # address the constraint that only one process can sit on the port
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
7 # hard-coded into the loader.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
8
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
9 # It attempts to load the RPC protocol server and publish itself. If
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
10 # that fails, it assumes that some other copy of IDLE is already running
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
11 # on the port and attempts to contact it. It then uses the RPC mechanism
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
12 # to ask that copy to do whatever it was instructed (via the command
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
13 # line) to do. (Think netscape -remote). The handling of command line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
14 # arguments for remotes is still very incomplete.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
15
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
16 # default behavior (no command line options) is to NOT start the Python
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
17 # Shell. If files are specified, they are opened, otherwise a single
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
18 # blank editor window opens.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
20 # If any command line -options are specified, a shell does appear. This
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
21 # is necessary to make the current semantics of the options make sense.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
22
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
23 import os
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
24 import spawn
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
25 import sys
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
26 import string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
27 import getopt
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
28 import re
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
29 import protocol
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
30 import warnings
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
31
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
32 import linecache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
33 from code import InteractiveInterpreter
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
34
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
35 from Tkinter import *
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
36 import tkMessageBox
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
37
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
38 from EditorWindow import EditorWindow, fixwordbreaks
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
39 from FileList import FileList
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
40 from ColorDelegator import ColorDelegator
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
41 from UndoDelegator import UndoDelegator
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
42 from OutputWindow import OutputWindow, OnDemandOutputWindow
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
43 from IdleConf import idleconf
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
44 import idlever
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
45
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
46 # We need to patch linecache.checkcache, because we don't want it
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47 # to throw away our <pyshell#...> entries.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
48 # Rather than repeating its code here, we save those entries,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
49 # then call the original function, and then restore the saved entries.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
50 def linecache_checkcache(orig_checkcache=linecache.checkcache):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
51 cache = linecache.cache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
52 save = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
53 for filename in cache.keys():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
54 if filename[:1] + filename[-1:] == '<>':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
55 save[filename] = cache[filename]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
56 orig_checkcache()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
57 cache.update(save)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
58 linecache.checkcache = linecache_checkcache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
59
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
60
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
61 # Note: <<newline-and-indent>> event is defined in AutoIndent.py
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
62
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
63 #$ event <<plain-newline-and-indent>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
64 #$ win <Control-j>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
65 #$ unix <Control-j>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 #$ event <<beginning-of-line>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
68 #$ win <Control-a>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
69 #$ win <Home>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
70 #$ unix <Control-a>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
71 #$ unix <Home>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
72
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
73 #$ event <<history-next>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
74 #$ win <Alt-n>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
75 #$ unix <Alt-n>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77 #$ event <<history-previous>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78 #$ win <Alt-p>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79 #$ unix <Alt-p>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
80
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 #$ event <<interrupt-execution>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82 #$ win <Control-c>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
83 #$ unix <Control-c>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
84
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
85 #$ event <<end-of-file>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
86 #$ win <Control-d>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
87 #$ unix <Control-d>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
88
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
89 #$ event <<open-stack-viewer>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
90
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
91 #$ event <<toggle-debugger>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
92
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
93
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
94 class PyShellEditorWindow(EditorWindow):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
95
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
96 # Regular text edit window when a shell is present
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
97 # XXX ought to merge with regular editor window
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
98
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
99 def __init__(self, *args):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
100 apply(EditorWindow.__init__, (self,) + args)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
101 self.text.bind("<<set-breakpoint-here>>", self.set_breakpoint_here)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
102 self.text.bind("<<open-python-shell>>", self.flist.open_shell)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
103
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
104 rmenu_specs = [
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
105 ("Set breakpoint here", "<<set-breakpoint-here>>"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
106 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
107
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
108 def set_breakpoint_here(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
109 if not self.flist.pyshell or not self.flist.pyshell.interp.debugger:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
110 self.text.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
111 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
112 self.flist.pyshell.interp.debugger.set_breakpoint_here(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
113
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
114
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
115 class PyShellFileList(FileList):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
116
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
117 # File list when a shell is present
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
118
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
119 EditorWindow = PyShellEditorWindow
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
120
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
121 pyshell = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
122
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
123 def open_shell(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
124 if self.pyshell:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
125 self.pyshell.wakeup()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
126 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
127 self.pyshell = PyShell(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
128 self.pyshell.begin()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
129 return self.pyshell
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
130
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
131
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
132 class ModifiedColorDelegator(ColorDelegator):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
133
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
134 # Colorizer for the shell window itself
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
135
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
136 def recolorize_main(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
137 self.tag_remove("TODO", "1.0", "iomark")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
138 self.tag_add("SYNC", "1.0", "iomark")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
139 ColorDelegator.recolorize_main(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
140
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
141 tagdefs = ColorDelegator.tagdefs.copy()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
142 cconf = idleconf.getsection('Colors')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
143
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
144 tagdefs.update({
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
145 "stdin": cconf.getcolor("stdin"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
146 "stdout": cconf.getcolor("stdout"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
147 "stderr": cconf.getcolor("stderr"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
148 "console": cconf.getcolor("console"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
149 "ERROR": cconf.getcolor("ERROR"),
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
150 None: cconf.getcolor("normal"),
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
151 })
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
152
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
153
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
154 class ModifiedUndoDelegator(UndoDelegator):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
155
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
156 # Forbid insert/delete before the I/O mark
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
157
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
158 def insert(self, index, chars, tags=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
159 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
160 if self.delegate.compare(index, "<", "iomark"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
161 self.delegate.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
162 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
163 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
164 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
165 UndoDelegator.insert(self, index, chars, tags)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
166
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
167 def delete(self, index1, index2=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
168 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
169 if self.delegate.compare(index1, "<", "iomark"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
170 self.delegate.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
171 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
172 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
173 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
174 UndoDelegator.delete(self, index1, index2)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
175
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
176 class ModifiedInterpreter(InteractiveInterpreter):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
177
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
178 def __init__(self, tkconsole):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
179 self.tkconsole = tkconsole
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
180 locals = sys.modules['__main__'].__dict__
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
181 InteractiveInterpreter.__init__(self, locals=locals)
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
182 self.save_warnings_filters = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
183
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
184 gid = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
185
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
186 def execsource(self, source):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
187 # Like runsource() but assumes complete exec source
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
188 filename = self.stuffsource(source)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
189 self.execfile(filename, source)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
190
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
191 def execfile(self, filename, source=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
192 # Execute an existing file
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
193 if source is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
194 source = open(filename, "r").read()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
195 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
196 code = compile(source, filename, "exec")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
197 except (OverflowError, SyntaxError):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
198 self.tkconsole.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
199 InteractiveInterpreter.showsyntaxerror(self, filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
200 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
201 self.runcode(code)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
202
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
203 def runsource(self, source):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
204 # Extend base class to stuff the source in the line cache first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
205 filename = self.stuffsource(source)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
206 self.more = 0
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
207 self.save_warnings_filters = warnings.filters[:]
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
208 warnings.filterwarnings(action="error", category=SyntaxWarning)
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
209 try:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
210 return InteractiveInterpreter.runsource(self, source, filename)
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
211 finally:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
212 if self.save_warnings_filters is not None:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
213 warnings.filters[:] = self.save_warnings_filters
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
214 self.save_warnings_filters = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
215
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
216 def stuffsource(self, source):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
217 # Stuff source in the filename cache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
218 filename = "<pyshell#%d>" % self.gid
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
219 self.gid = self.gid + 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
220 lines = string.split(source, "\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
221 linecache.cache[filename] = len(source)+1, 0, lines, filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
222 return filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
223
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
224 def showsyntaxerror(self, filename=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
225 # Extend base class to color the offending position
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
226 # (instead of printing it and pointing at it with a caret)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
227 text = self.tkconsole.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
228 stuff = self.unpackerror()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
229 if not stuff:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
230 self.tkconsole.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
231 InteractiveInterpreter.showsyntaxerror(self, filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
232 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
233 msg, lineno, offset, line = stuff
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
234 if lineno == 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
235 pos = "iomark + %d chars" % (offset-1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
236 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
237 pos = "iomark linestart + %d lines + %d chars" % (lineno-1,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
238 offset-1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
239 text.tag_add("ERROR", pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
240 text.see(pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
241 char = text.get(pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
242 if char and char in string.letters + string.digits + "_":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
243 text.tag_add("ERROR", pos + " wordstart", pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
244 self.tkconsole.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
245 self.write("SyntaxError: %s\n" % str(msg))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
246
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
247 def unpackerror(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
248 type, value, tb = sys.exc_info()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
249 ok = type is SyntaxError
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
250 if ok:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
251 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
252 msg, (dummy_filename, lineno, offset, line) = value
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
253 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
254 ok = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
255 if ok:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
256 return msg, lineno, offset, line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
257 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
258 return None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
259
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
260 def showtraceback(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
261 # Extend base class method to reset output properly
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
262 text = self.tkconsole.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
263 self.tkconsole.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
264 self.checklinecache()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
265 InteractiveInterpreter.showtraceback(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
266
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
267 def checklinecache(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
268 c = linecache.cache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
269 for key in c.keys():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
270 if key[:1] + key[-1:] != "<>":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
271 del c[key]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
272
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
273 debugger = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
274
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
275 def setdebugger(self, debugger):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
276 self.debugger = debugger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
277
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
278 def getdebugger(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
279 return self.debugger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
280
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
281 def runcode(self, code):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
282 # Override base class method
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
283 if self.save_warnings_filters is not None:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
284 warnings.filters[:] = self.save_warnings_filters
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
285 self.save_warnings_filters = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
286 debugger = self.debugger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
287 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
288 self.tkconsole.beginexecuting()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
289 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
290 if debugger:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
291 debugger.run(code, self.locals)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
292 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
293 exec code in self.locals
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
294 except SystemExit:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
295 if tkMessageBox.askyesno(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
296 "Exit?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
297 "Do you want to exit altogether?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
298 default="yes",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
299 master=self.tkconsole.text):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
300 raise
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
301 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
302 self.showtraceback()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
303 if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
304 self.tkconsole.open_stack_viewer()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
305 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
306 self.showtraceback()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
307 if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
308 self.tkconsole.open_stack_viewer()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
309
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
310 finally:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
311 self.tkconsole.endexecuting()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
312
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
313 def write(self, s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
314 # Override base class write
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
315 self.tkconsole.console.write(s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
316
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
317
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
318 class PyShell(OutputWindow):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
319
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
320 shell_title = "Python Shell"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
321
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
322 # Override classes
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
323 ColorDelegator = ModifiedColorDelegator
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
324 UndoDelegator = ModifiedUndoDelegator
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
325
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
326 # Override menu bar specs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
327 menu_specs = PyShellEditorWindow.menu_specs[:]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
328 menu_specs.insert(len(menu_specs)-2, ("debug", "_Debug"))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
329
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
330 # New classes
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
331 from IdleHistory import History
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
332
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
333 def __init__(self, flist=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
334 self.interp = ModifiedInterpreter(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
335 if flist is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
336 root = Tk()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
337 fixwordbreaks(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
338 root.withdraw()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
339 flist = PyShellFileList(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
340
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
341 OutputWindow.__init__(self, flist, None, None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
342
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
343 import __builtin__
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
344 __builtin__.quit = __builtin__.exit = "To exit, type Ctrl-D."
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
345
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
346 self.auto = self.extensions["AutoIndent"] # Required extension
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
347 self.auto.config(usetabs=1, indentwidth=8, context_use_ps1=1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
348
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
349 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
350 text.configure(wrap="char")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
351 text.bind("<<newline-and-indent>>", self.enter_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
352 text.bind("<<plain-newline-and-indent>>", self.linefeed_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
353 text.bind("<<interrupt-execution>>", self.cancel_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
354 text.bind("<<beginning-of-line>>", self.home_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
355 text.bind("<<end-of-file>>", self.eof_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
356 text.bind("<<open-stack-viewer>>", self.open_stack_viewer)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
357 text.bind("<<toggle-debugger>>", self.toggle_debugger)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
358 text.bind("<<open-python-shell>>", self.flist.open_shell)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
359 text.bind("<<toggle-jit-stack-viewer>>", self.toggle_jit_stack_viewer)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
360
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
361 self.save_stdout = sys.stdout
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
362 self.save_stderr = sys.stderr
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
363 self.save_stdin = sys.stdin
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
364 sys.stdout = PseudoFile(self, "stdout")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
365 sys.stderr = PseudoFile(self, "stderr")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
366 sys.stdin = self
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
367 self.console = PseudoFile(self, "console")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
368
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
369 self.history = self.History(self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
370
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
371 reading = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
372 executing = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
373 canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
374 endoffile = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
375
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
376 def toggle_debugger(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
377 if self.executing:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
378 tkMessageBox.showerror("Don't debug now",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
379 "You can only toggle the debugger when idle",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
380 master=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
381 self.set_debugger_indicator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
382 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
383 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
384 db = self.interp.getdebugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
385 if db:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
386 self.close_debugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
387 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
388 self.open_debugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
389
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
390 def set_debugger_indicator(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
391 db = self.interp.getdebugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
392 self.setvar("<<toggle-debugger>>", not not db)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
393
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
394 def toggle_jit_stack_viewer( self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
395 pass # All we need is the variable
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
396
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
397 def close_debugger(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
398 db = self.interp.getdebugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
399 if db:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
400 self.interp.setdebugger(None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
401 db.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
402 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
403 self.console.write("[DEBUG OFF]\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
404 sys.ps1 = ">>> "
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
405 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
406 self.set_debugger_indicator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
407
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
408 def open_debugger(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
409 import Debugger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
410 self.interp.setdebugger(Debugger.Debugger(self))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
411 sys.ps1 = "[DEBUG ON]\n>>> "
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
412 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
413 self.set_debugger_indicator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
414
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
415 def beginexecuting(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
416 # Helper for ModifiedInterpreter
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
417 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
418 self.executing = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
419 ##self._cancel_check = self.cancel_check
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
420 ##sys.settrace(self._cancel_check)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
421
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
422 def endexecuting(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
423 # Helper for ModifiedInterpreter
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
424 ##sys.settrace(None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
425 ##self._cancel_check = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
426 self.executing = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
427 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
428
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
429 def close(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
430 # Extend base class method
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
431 if self.executing:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
432 # XXX Need to ask a question here
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
433 if not tkMessageBox.askokcancel(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
434 "Kill?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
435 "The program is still running; do you want to kill it?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
436 default="ok",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
437 master=self.text):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
438 return "cancel"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
439 self.canceled = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
440 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
441 self.top.quit()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
442 return "cancel"
18586
fe44428f9774 py-cvs-2001_07_13 (Rev 1.34) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18560
diff changeset
443 return OutputWindow.close(self)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
444
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
445 def _close(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
446 self.close_debugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
447 # Restore std streams
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
448 sys.stdout = self.save_stdout
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
449 sys.stderr = self.save_stderr
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
450 sys.stdin = self.save_stdin
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
451 # Break cycles
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
452 self.interp = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
453 self.console = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
454 self.auto = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
455 self.flist.pyshell = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
456 self.history = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
457 OutputWindow._close(self) # Really EditorWindow._close
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
458
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
459 def ispythonsource(self, filename):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
460 # Override this so EditorWindow never removes the colorizer
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
461 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
462
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
463 def short_title(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
464 return self.shell_title
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
465
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
466 COPYRIGHT = \
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
467 'Type "copyright", "credits" or "license" for more information.'
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
468
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
469 def begin(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
470 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
471 self.write("Python %s on %s\n%s\nIDLE %s -- press F1 for help\n" %
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
472 (sys.version, sys.platform, self.COPYRIGHT,
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
473 idlever.IDLE_VERSION))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
474 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
475 sys.ps1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
476 except AttributeError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
477 sys.ps1 = ">>> "
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
478 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
479 import Tkinter
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
480 Tkinter._default_root = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
481
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
482 def interact(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
483 self.begin()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
484 self.top.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
485
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
486 def readline(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
487 save = self.reading
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
488 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
489 self.reading = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
490 self.top.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
491 finally:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
492 self.reading = save
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
493 line = self.text.get("iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
494 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
495 if self.canceled:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
496 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
497 raise KeyboardInterrupt
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
498 if self.endoffile:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
499 self.endoffile = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
500 return ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
501 return line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
502
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
503 def isatty(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
504 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
505
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
506 def cancel_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
507 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
508 if self.text.compare("sel.first", "!=", "sel.last"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
509 return # Active selection -- always use default binding
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
510 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
511 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
512 if not (self.executing or self.reading):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
513 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
514 self.write("KeyboardInterrupt\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
515 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
516 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
517 self.endoffile = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
518 self.canceled = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
519 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
520 self.top.quit()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
521 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
522
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
523 def eof_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
524 if self.executing and not self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
525 return # Let the default binding (delete next char) take over
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
526 if not (self.text.compare("iomark", "==", "insert") and
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
527 self.text.compare("insert", "==", "end-1c")):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
528 return # Let the default binding (delete next char) take over
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
529 if not self.executing:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
530 ## if not tkMessageBox.askokcancel(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
531 ## "Exit?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
532 ## "Are you sure you want to exit?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
533 ## default="ok", master=self.text):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
534 ## return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
535 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
536 self.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
537 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
538 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
539 self.endoffile = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
540 self.top.quit()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
541 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
542
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
543 def home_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
544 if event.state != 0 and event.keysym == "Home":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
545 return # <Modifier-Home>; fall back to class binding
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
546 if self.text.compare("iomark", "<=", "insert") and \
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
547 self.text.compare("insert linestart", "<=", "iomark"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
548 self.text.mark_set("insert", "iomark")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
549 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
550 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
551 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
552
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
553 def linefeed_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
554 # Insert a linefeed without entering anything (still autoindented)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
555 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
556 self.text.insert("insert", "\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
557 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
558 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
559 self.auto.auto_indent(event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
560 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
561
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
562 def enter_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
563 if self.executing and not self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
564 return # Let the default binding (insert '\n') take over
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
565 # If some text is selected, recall the selection
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
566 # (but only if this before the I/O mark)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
567 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
568 sel = self.text.get("sel.first", "sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
569 if sel:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
570 if self.text.compare("sel.last", "<=", "iomark"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
571 self.recall(sel)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
572 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
573 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
574 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
575 # If we're strictly before the line containing iomark, recall
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
576 # the current line, less a leading prompt, less leading or
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
577 # trailing whitespace
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
578 if self.text.compare("insert", "<", "iomark linestart"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
579 # Check if there's a relevant stdin range -- if so, use it
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
580 prev = self.text.tag_prevrange("stdin", "insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
581 if prev and self.text.compare("insert", "<", prev[1]):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
582 self.recall(self.text.get(prev[0], prev[1]))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
583 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
584 next = self.text.tag_nextrange("stdin", "insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
585 if next and self.text.compare("insert lineend", ">=", next[0]):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
586 self.recall(self.text.get(next[0], next[1]))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
587 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
588 # No stdin mark -- just get the current line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
589 self.recall(self.text.get("insert linestart", "insert lineend"))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
590 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
591 # If we're in the current input and there's only whitespace
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
592 # beyond the cursor, erase that whitespace first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
593 s = self.text.get("insert", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
594 if s and not string.strip(s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
595 self.text.delete("insert", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
596 # If we're in the current input before its last line,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
597 # insert a newline right at the insert point
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
598 if self.text.compare("insert", "<", "end-1c linestart"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
599 self.auto.auto_indent(event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
600 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
601 # We're in the last line; append a newline and submit it
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
602 self.text.mark_set("insert", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
603 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
604 self.text.insert("insert", "\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
605 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
606 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
607 self.auto.auto_indent(event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
608 self.text.tag_add("stdin", "iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
609 self.text.update_idletasks()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
610 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
611 self.top.quit() # Break out of recursive mainloop() in raw_input()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
612 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
613 self.runit()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
614 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
615
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
616 def recall(self, s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
617 if self.history:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
618 self.history.recall(s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
619
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
620 def runit(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
621 line = self.text.get("iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
622 # Strip off last newline and surrounding whitespace.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
623 # (To allow you to hit return twice to end a statement.)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
624 i = len(line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
625 while i > 0 and line[i-1] in " \t":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
626 i = i-1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
627 if i > 0 and line[i-1] == "\n":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
628 i = i-1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
629 while i > 0 and line[i-1] in " \t":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
630 i = i-1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
631 line = line[:i]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
632 more = self.interp.runsource(line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
633 if not more:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
634 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
635
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
636 def cancel_check(self, frame, what, args,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
637 dooneevent=tkinter.dooneevent,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
638 dontwait=tkinter.DONT_WAIT):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
639 # Hack -- use the debugger hooks to be able to handle events
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
640 # and interrupt execution at any time.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
641 # This slows execution down quite a bit, so you may want to
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
642 # disable this (by not calling settrace() in runcode() above)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
643 # for full-bore (uninterruptable) speed.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
644 # XXX This should become a user option.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
645 if self.canceled:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
646 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
647 dooneevent(dontwait)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
648 if self.canceled:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
649 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
650 raise KeyboardInterrupt
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
651 return self._cancel_check
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
652
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
653 def open_stack_viewer(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
654 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
655 sys.last_traceback
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
656 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
657 tkMessageBox.showerror("No stack trace",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
658 "There is no stack trace yet.\n"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
659 "(sys.last_traceback is not defined)",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
660 master=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
661 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
662 from StackViewer import StackBrowser
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
663 sv = StackBrowser(self.root, self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
664
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
665 def showprompt(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
666 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
667 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
668 s = str(sys.ps1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
669 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
670 s = ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
671 self.console.write(s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
672 self.text.mark_set("insert", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
673
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
674 def resetoutput(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
675 source = self.text.get("iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
676 if self.history:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
677 self.history.history_store(source)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
678 if self.text.get("end-2c") != "\n":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
679 self.text.insert("end-1c", "\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
680 self.text.mark_set("iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
681 sys.stdout.softspace = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
682
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
683 def write(self, s, tags=()):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
684 self.text.mark_gravity("iomark", "right")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
685 OutputWindow.write(self, s, tags, "iomark")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
686 self.text.mark_gravity("iomark", "left")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
687 if self.canceled:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
688 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
689 raise KeyboardInterrupt
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
690
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
691 class PseudoFile:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
692
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
693 def __init__(self, shell, tags):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
694 self.shell = shell
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
695 self.tags = tags
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
696
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
697 def write(self, s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
698 self.shell.write(s, self.tags)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
699
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
700 def writelines(self, l):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
701 map(self.write, l)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
702
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
703 def flush(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
704 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
705
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
706 def isatty(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
707 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
708
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
709 usage_msg = """\
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
710 usage: idle.py [-c command] [-d] [-e] [-s] [-t title] [arg] ...
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
711
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
712 -c command run this command
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
713 -d enable debugger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
714 -e edit mode; arguments are files to be edited
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
715 -s run $IDLESTARTUP or $PYTHONSTARTUP before anything else
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
716 -t title set title of shell window
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
717
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
718 When neither -c nor -e is used, and there are arguments, and the first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
719 argument is not '-', the first argument is run as a script. Remaining
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
720 arguments are arguments to the script or to the command run by -c.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
721 """
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
722
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
723 class usageError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
724 def __init__(self, string): self.string = string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
725 def __repr__(self): return self.string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
726
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
727 class main:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
728 def __init__(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
729 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
730 self.server = protocol.Server(connection_hook = self.address_ok)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
731 protocol.publish( 'IDLE', self.connect )
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
732 self.main( sys.argv[1:] )
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
733 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
734 except protocol.connectionLost:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
735 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
736 client = protocol.Client()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
737 IDLE = client.getobject('IDLE')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
738 if IDLE:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
739 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
740 IDLE.remote( sys.argv[1:] )
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
741 except usageError, msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
742 sys.stderr.write("Error: %s\n" % str(msg))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
743 sys.stderr.write(usage_msg)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
744 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
745 except protocol.connectionLost:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
746 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
747
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
748 # xxx Should scream via Tk()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
749 print "Something already has our socket, but it won't open a window for me!"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
750 print "Unable to proceed."
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
751
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
752 def idle(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
753 spawn.kill_zombies()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
754 self.server.rpc_loop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
755 root.after(25, self.idle)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
756
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
757 # We permit connections from localhost only
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
758 def address_ok(self, addr):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
759 return addr[0] == '127.0.0.1'
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
760
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
761 def connect(self, client, addr):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
762 return self
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
763
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
764 def remote( self, argv ):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
765 # xxx Should make this behavior match the behavior in main, or redo
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
766 # command line options entirely.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
767
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
768 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
769 opts, args = getopt.getopt(argv, "c:deist:")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
770 except getopt.error, msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
771 raise usageError(msg)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
772
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
773 for filename in args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
774 flist.open(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
775 if not args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
776 flist.new()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
777
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
778 def main( self, argv ):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
779 cmd = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
780 edit = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
781 noshell = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
782
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
783 debug = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
784 startup = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
785
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
786 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
787 opts, args = getopt.getopt(argv, "c:deist:")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
788 except getopt.error, msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
789 sys.stderr.write("Error: %s\n" % str(msg))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
790 sys.stderr.write(usage_msg)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
791 sys.exit(2)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
792
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
793 for o, a in opts:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
794 noshell = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
795 if o == '-c':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
796 cmd = a
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
797 if o == '-d':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
798 debug = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
799 if o == '-e':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
800 edit = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
801 if o == '-s':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
802 startup = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
803 if o == '-t':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
804 PyShell.shell_title = a
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
805
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
806 if noshell: edit=1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
807
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
808 for i in range(len(sys.path)):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
809 sys.path[i] = os.path.abspath(sys.path[i])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
810
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
811 pathx = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
812 if edit:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
813 for filename in args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
814 pathx.append(os.path.dirname(filename))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
815 elif args and args[0] != "-":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
816 pathx.append(os.path.dirname(args[0]))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
817 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
818 pathx.append(os.curdir)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
819 for dir in pathx:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
820 dir = os.path.abspath(dir)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
821 if not dir in sys.path:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
822 sys.path.insert(0, dir)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
823
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
824 global flist, root
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
825 root = Tk(className="Idle")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
826 fixwordbreaks(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
827 root.withdraw()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
828 flist = PyShellFileList(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
829
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
830 if edit:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
831 for filename in args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
832 flist.open(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
833 if not args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
834 flist.new()
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
835 else:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
836 if cmd:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
837 sys.argv = ["-c"] + args
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
838 else:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
839 sys.argv = args or [""]
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
840
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
841 #dbg=OnDemandOutputWindow(flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
842 #dbg.set_title('Internal IDLE Problem')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
843 #sys.stdout = PseudoFile(dbg,['stdout'])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
844 #sys.stderr = PseudoFile(dbg,['stderr'])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
845
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
846 if noshell:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
847 flist.pyshell = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
848 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
849 shell = PyShell(flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
850 interp = shell.interp
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
851 flist.pyshell = shell
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
852
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
853 if startup:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
854 filename = os.environ.get("IDLESTARTUP") or \
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
855 os.environ.get("PYTHONSTARTUP")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
856 if filename and os.path.isfile(filename):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
857 interp.execfile(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
858
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
859 if debug:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
860 shell.open_debugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
861 if cmd:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
862 interp.execsource(cmd)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
863 elif not edit and args and args[0] != "-":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
864 interp.execfile(args[0])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
865
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
866 shell.begin()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
867
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
868 self.idle()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
869 root.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
870 root.destroy()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
871
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
872
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
873 if __name__ == "__main__":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
874 main()