annotate Lib/idlelib/PyShell.py @ 23547:b74afdd072eb legacy-trunk

GvR's rpc patch
author Chui Tey <chui.tey@advdata.com.au>
date Sun, 26 May 2002 13:36:41 +0000
parents 194ed5e0dc8f
children 24b0f6d693e3
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
18613
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
5 # The main() function has been replaced by a whole class, in order to
13975
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
18613
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
16 # Default behavior (no command line options) is to open an editor window
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
17 # instead of starting the Python Shell. However, if called as
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
18 # Pyshell.main(0), the Shell will be started instead of the editor window.
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
19
18613
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
20 # In the default editor mode, if files are specified, they are opened.
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
21
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
22 # If any command line options are specified, a shell does appear, and if
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
23 # the -e option is used, both a shell and an editor window open.
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
24
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
25 import os
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
26 import spawn
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
27 import sys
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
28 import string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
29 import getopt
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
30 import re
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
31 import protocol
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
32 import socket
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
33 import time
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
34 import warnings
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
35 import traceback
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
36
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
37 import linecache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
38 from code import InteractiveInterpreter
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
39
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
40 from Tkinter import *
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
41 import tkMessageBox
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
42
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
43 from EditorWindow import EditorWindow, fixwordbreaks
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
44 from FileList import FileList
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
45 from ColorDelegator import ColorDelegator
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
46 from UndoDelegator import UndoDelegator
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
47 from OutputWindow import OutputWindow, OnDemandOutputWindow
20864
8957341f98f8 further config system work
Steven M. Gava <elguavas@python.net>
parents: 20306
diff changeset
48 from configHandler import idleConf
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
49 import idlever
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
50
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
51 import rpc
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
52
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
53 use_subprocess = 0 # Set to 1 to spawn subprocess for command execution
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
54
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
55 # Change warnings module to write to sys.__stderr__
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
56 try:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
57 import warnings
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
58 except ImportError:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
59 pass
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
60 else:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
61 def idle_showwarning(message, category, filename, lineno):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
62 file = sys.__stderr__
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
63 file.write(warnings.formatwarning(message, category, filename, lineno))
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
64 warnings.showwarning = idle_showwarning
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
65
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
66 # We need to patch linecache.checkcache, because we don't want it
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
67 # to throw away our <pyshell#...> entries.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
68 # Rather than repeating its code here, we save those entries,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
69 # then call the original function, and then restore the saved entries.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
70 def linecache_checkcache(orig_checkcache=linecache.checkcache):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
71 cache = linecache.cache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
72 save = {}
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
73 for filename in cache.keys():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
74 if filename[:1] + filename[-1:] == '<>':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
75 save[filename] = cache[filename]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
76 orig_checkcache()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
77 cache.update(save)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
78 linecache.checkcache = linecache_checkcache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
79
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
80
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
81 # Note: <<newline-and-indent>> event is defined in AutoIndent.py
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
82
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
83 #$ event <<plain-newline-and-indent>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
84 #$ win <Control-j>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
85 #$ unix <Control-j>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
86
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
87 #$ event <<beginning-of-line>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
88 #$ win <Control-a>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
89 #$ win <Home>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
90 #$ unix <Control-a>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
91 #$ unix <Home>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
92
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
93 #$ event <<history-next>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
94 #$ win <Alt-n>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
95 #$ unix <Alt-n>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
96
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
97 #$ event <<history-previous>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
98 #$ win <Alt-p>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
99 #$ unix <Alt-p>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
100
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
101 #$ event <<interrupt-execution>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
102 #$ win <Control-c>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
103 #$ unix <Control-c>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
104
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
105 #$ event <<end-of-file>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
106 #$ win <Control-d>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
107 #$ unix <Control-d>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
108
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
109 #$ event <<open-stack-viewer>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
110
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
111 #$ event <<toggle-debugger>>
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
112
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
113
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
114 class PyShellEditorWindow(EditorWindow):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
115
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
116 # Regular text edit window when a shell is present
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
117 # XXX ought to merge with regular editor window
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
118
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
119 def __init__(self, *args):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
120 apply(EditorWindow.__init__, (self,) + args)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
121 self.text.bind("<<set-breakpoint-here>>", self.set_breakpoint_here)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
122 self.text.bind("<<open-python-shell>>", self.flist.open_shell)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
123
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
124 rmenu_specs = [
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
125 ("Set breakpoint here", "<<set-breakpoint-here>>"),
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
126 ]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
127
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
128 def set_breakpoint_here(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
129 if not self.flist.pyshell or not self.flist.pyshell.interp.debugger:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
130 self.text.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
131 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
132 self.flist.pyshell.interp.debugger.set_breakpoint_here(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
133
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
134
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
135 class PyShellFileList(FileList):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
136
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
137 # File list when a shell is present
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
138
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
139 EditorWindow = PyShellEditorWindow
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
140
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
141 pyshell = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
142
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
143 def open_shell(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
144 if self.pyshell:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
145 self.pyshell.wakeup()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
146 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
147 self.pyshell = PyShell(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
148 self.pyshell.begin()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
149 return self.pyshell
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
150
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
151
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
152 class ModifiedColorDelegator(ColorDelegator):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
153
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
154 # Colorizer for the shell window itself
22111
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
155
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
156 def __init__(self):
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
157 ColorDelegator.__init__(self)
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
158 self.LoadTagDefs()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
159
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
160 def recolorize_main(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
161 self.tag_remove("TODO", "1.0", "iomark")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
162 self.tag_add("SYNC", "1.0", "iomark")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
163 ColorDelegator.recolorize_main(self)
22111
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
164
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
165 def LoadTagDefs(self):
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
166 ColorDelegator.LoadTagDefs(self)
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
167 theme = idleConf.GetOption('main','Theme','name')
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
168 self.tagdefs.update({
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
169 "stdin": {'background':None,'foreground':None},
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
170 "stdout": idleConf.GetHighlight(theme, "stdout"),
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
171 "stderr": idleConf.GetHighlight(theme, "stderr"),
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
172 "console": idleConf.GetHighlight(theme, "console"),
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
173 "ERROR": idleConf.GetHighlight(theme, "error"),
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
174 None: idleConf.GetHighlight(theme, "normal"),
c494084dc6d8 First work on making config changes dynamic,
Steven M. Gava <elguavas@python.net>
parents: 21627
diff changeset
175 })
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
176
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
177 class ModifiedUndoDelegator(UndoDelegator):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
178
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
179 # Forbid insert/delete before the I/O mark
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
180
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
181 def insert(self, index, chars, tags=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
182 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
183 if self.delegate.compare(index, "<", "iomark"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
184 self.delegate.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
185 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
186 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
187 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
188 UndoDelegator.insert(self, index, chars, tags)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
189
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
190 def delete(self, index1, index2=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
191 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
192 if self.delegate.compare(index1, "<", "iomark"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
193 self.delegate.bell()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
194 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
195 except TclError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
196 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
197 UndoDelegator.delete(self, index1, index2)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
198
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
199 class ModifiedInterpreter(InteractiveInterpreter):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
200
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
201 def __init__(self, tkconsole):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
202 self.tkconsole = tkconsole
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
203 locals = sys.modules['__main__'].__dict__
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
204 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
205 self.save_warnings_filters = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
206
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
207 global flist
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
208 self.output = OnDemandOutputWindow(flist)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
209
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
210 rpcclt = None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
211 rpcpid = None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
212
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
213 def spawn_subprocess(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
214 port = 8833
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
215 addr = ("localhost", port)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
216 w = ['-W' + s for s in sys.warnoptions]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
217 args = [sys.executable] + w + ["-c", "__import__('run').main()",
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
218 str(port)]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
219 self.rpcpid = os.spawnv(os.P_NOWAIT, args[0], args)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
220 for i in range(5):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
221 time.sleep(i)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
222 try:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
223 self.rpcclt = rpc.RPCClient(addr)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
224 break
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
225 except socket.error, err:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
226 if i > 3:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
227 print >>sys.__stderr__, "Socket error:", err, "; retry..."
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
228 else:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
229 # XXX Make this a dialog?
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
230 print >>sys.__stderr__, "Can't spawn subprocess!"
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
231 return
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
232 self.output.stdout=PseudoFile(self.output, "stdout")
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
233 self.output.stderr=PseudoFile(self.output, "stderr")
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
234 self.rpcclt.register("stdin", self.output)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
235 self.rpcclt.register("stdout", self.output.stdout)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
236 self.rpcclt.register("stderr", self.output.stderr)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
237 self.rpcclt.register("flist", self.tkconsole.flist)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
238 self.poll_subprocess()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
239
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
240 active_seq = None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
241
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
242 def poll_subprocess(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
243 clt = self.rpcclt
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
244 if clt is None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
245 return
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
246 response = clt.pollresponse(self.active_seq)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
247 self.tkconsole.text.after(50, self.poll_subprocess)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
248 if response:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
249 self.tkconsole.resetoutput()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
250 self.active_seq = None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
251 how, what = response
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
252 file = self.tkconsole.console
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
253 if how == "OK":
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
254 if what is not None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
255 print >>file, `what`
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
256 elif how == "EXCEPTION":
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
257 mod, name, args, tb = what
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
258 print >>file, 'Traceback (most recent call last):'
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
259 while tb and tb[0][0] in ("run.py", "rpc.py"):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
260 del tb[0]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
261 while tb and tb[-1][0] in ("run.py", "rpc.py"):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
262 del tb[-1]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
263 for i in range(len(tb)):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
264 fn, ln, nm, line = tb[i]
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
265 if not line and fn.startswith("<pyshell#"):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
266 line = linecache.getline(fn, ln)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
267 tb[i] = fn, ln, nm, line
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
268 traceback.print_list(tb, file=file)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
269 if mod and mod != "exceptions":
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
270 name = mod + "." + name
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
271 print >>file, name + ":", " ".join(map(str, args))
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
272 if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
273 self.remote_stack_viewer()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
274 elif how == "ERROR":
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
275 print >>sys.__stderr__, "Oops:", how, what
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
276 print >>file, "Oops:", how, what
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
277 self.tkconsole.endexecuting()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
278
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
279 def kill_subprocess(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
280 clt = self.rpcclt
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
281 self.rpcclt = None
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
282 if clt is not None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
283 clt.close()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
284
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
285 def remote_stack_viewer(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
286 import RemoteObjectBrowser
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
287 oid = self.rpcclt.remotecall("exec", "stackviewer", ("flist",), {})
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
288 if oid is None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
289 self.tkconsole.root.bell()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
290 return
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
291 item = RemoteObjectBrowser.StubObjectTreeItem(self.rpcclt, oid)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
292 from TreeWidget import ScrolledCanvas, TreeNode
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
293 top = Toplevel(self.tkconsole.root)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
294 sc = ScrolledCanvas(top, bg="white", highlightthickness=0)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
295 sc.frame.pack(expand=1, fill="both")
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
296 node = TreeNode(sc.canvas, None, item)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
297 node.expand()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
298 # XXX Should GC the remote tree when closing the window
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
299
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
300 gid = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
301
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
302 def execsource(self, source):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
303 # Like runsource() but assumes complete exec source
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
304 filename = self.stuffsource(source)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
305 self.execfile(filename, source)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
306
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
307 def execfile(self, filename, source=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
308 # Execute an existing file
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
309 if source is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
310 source = open(filename, "r").read()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
311 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
312 code = compile(source, filename, "exec")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
313 except (OverflowError, SyntaxError):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
314 self.tkconsole.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
315 InteractiveInterpreter.showsyntaxerror(self, filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
316 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
317 self.runcode(code)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
318
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
319 def runsource(self, source):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
320 # Extend base class to stuff the source in the line cache first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
321 filename = self.stuffsource(source)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
322 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
323 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
324 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
325 try:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
326 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
327 finally:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
328 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
329 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
330 self.save_warnings_filters = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
331
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
332 def stuffsource(self, source):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
333 # Stuff source in the filename cache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
334 filename = "<pyshell#%d>" % self.gid
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
335 self.gid = self.gid + 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
336 lines = string.split(source, "\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
337 linecache.cache[filename] = len(source)+1, 0, lines, filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
338 return filename
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
339
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
340 def showsyntaxerror(self, filename=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
341 # Extend base class to color the offending position
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
342 # (instead of printing it and pointing at it with a caret)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
343 text = self.tkconsole.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
344 stuff = self.unpackerror()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
345 if not stuff:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
346 self.tkconsole.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
347 InteractiveInterpreter.showsyntaxerror(self, filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
348 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
349 msg, lineno, offset, line = stuff
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
350 if lineno == 1:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
351 pos = "iomark + %d chars" % (offset-1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
352 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
353 pos = "iomark linestart + %d lines + %d chars" % (lineno-1,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
354 offset-1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
355 text.tag_add("ERROR", pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
356 text.see(pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
357 char = text.get(pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
358 if char and char in string.letters + string.digits + "_":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
359 text.tag_add("ERROR", pos + " wordstart", pos)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
360 self.tkconsole.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
361 self.write("SyntaxError: %s\n" % str(msg))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
362
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
363 def unpackerror(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
364 type, value, tb = sys.exc_info()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
365 ok = type is SyntaxError
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
366 if ok:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
367 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
368 msg, (dummy_filename, lineno, offset, line) = value
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
369 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
370 ok = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
371 if ok:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
372 return msg, lineno, offset, line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
373 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
374 return None
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 showtraceback(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
377 # Extend base class method to reset output properly
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
378 self.tkconsole.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
379 self.checklinecache()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
380 InteractiveInterpreter.showtraceback(self)
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
381 if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
382 self.tkconsole.open_stack_viewer()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
383
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
384 def checklinecache(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
385 c = linecache.cache
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
386 for key in c.keys():
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
387 if key[:1] + key[-1:] != "<>":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
388 del c[key]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
389
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
390 debugger = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
391
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
392 def setdebugger(self, debugger):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
393 self.debugger = debugger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
394
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
395 def getdebugger(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
396 return self.debugger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
397
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
398 def runcommand(self, code):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
399 # This runs the code without invoking the debugger.
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
400 # The code better not raise an exception!
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
401 if self.tkconsole.executing:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
402 tkMessageBox.showerror(
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
403 "Already executing",
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
404 "The Python Shell window is already executing a command; "
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
405 "please wait until it is finished.",
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
406 master=self.tkconsole.text)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
407 return 0
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
408 if self.rpcclt:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
409 self.rpcclt.remotecall("exec", "runcode", (code,), {})
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
410 else:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
411 exec code in self.locals
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
412 return 1
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
413
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
414 def runcode(self, code):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
415 # Override base class method
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
416 if self.tkconsole.executing:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
417 tkMessageBox.showerror(
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
418 "Already executing",
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
419 "The Python Shell window is already executing a command; "
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
420 "please wait until it is finished.",
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
421 master=self.tkconsole.text)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
422 return
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
423
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
424 self.checklinecache()
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
425 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
426 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
427 self.save_warnings_filters = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
428 debugger = self.debugger
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
429 if not debugger and self.rpcclt is not None:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
430 self.tkconsole.beginexecuting()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
431 self.active_seq = self.rpcclt.asynccall("exec", "runcode",
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
432 (code,), {})
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
433 return
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
434
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
435 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
436 self.tkconsole.beginexecuting()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
437 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
438 if debugger:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
439 debugger.run(code, self.locals)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
440 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
441 exec code in self.locals
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
442 except SystemExit:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
443 if tkMessageBox.askyesno(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
444 "Exit?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
445 "Do you want to exit altogether?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
446 default="yes",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
447 master=self.tkconsole.text):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
448 raise
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
449 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
450 self.showtraceback()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
451 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
452 self.showtraceback()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
453
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
454 finally:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
455 self.tkconsole.endexecuting()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
456
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
457 def write(self, s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
458 # Override base class write
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
459 self.tkconsole.console.write(s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
460
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
461 class PyShell(OutputWindow):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
462
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
463 shell_title = "Python Shell"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
464
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
465 # Override classes
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
466 ColorDelegator = ModifiedColorDelegator
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
467 UndoDelegator = ModifiedUndoDelegator
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
468
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
469 # Override menu bar specs
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
470 menu_specs = PyShellEditorWindow.menu_specs[:]
21035
c4499596b1a4 back in harness on new config system
Steven M. Gava <elguavas@python.net>
parents: 20864
diff changeset
471 menu_specs.insert(len(menu_specs)-3, ("debug", "_Debug"))
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
472
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
473 # New classes
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
474 from IdleHistory import History
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
475
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
476 def __init__(self, flist=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
477 self.interp = ModifiedInterpreter(self)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
478 if flist is None:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
479 root = Tk()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
480 fixwordbreaks(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
481 root.withdraw()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
482 flist = PyShellFileList(root)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
483
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
484 OutputWindow.__init__(self, flist, None, None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
485
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
486 import __builtin__
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
487 __builtin__.quit = __builtin__.exit = "To exit, type Ctrl-D."
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
488
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
489 self.auto = self.extensions["AutoIndent"] # Required extension
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
490 self.auto.config(usetabs=1, indentwidth=8, context_use_ps1=1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
491
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
492 text = self.text
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
493 text.configure(wrap="char")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
494 text.bind("<<newline-and-indent>>", self.enter_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
495 text.bind("<<plain-newline-and-indent>>", self.linefeed_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
496 text.bind("<<interrupt-execution>>", self.cancel_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
497 text.bind("<<beginning-of-line>>", self.home_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
498 text.bind("<<end-of-file>>", self.eof_callback)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
499 text.bind("<<open-stack-viewer>>", self.open_stack_viewer)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
500 text.bind("<<toggle-debugger>>", self.toggle_debugger)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
501 text.bind("<<open-python-shell>>", self.flist.open_shell)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
502 text.bind("<<toggle-jit-stack-viewer>>", self.toggle_jit_stack_viewer)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
503
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
504 self.save_stdout = sys.stdout
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
505 self.save_stderr = sys.stderr
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
506 self.save_stdin = sys.stdin
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
507 self.stdout = PseudoFile(self, "stdout")
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
508 self.stderr = PseudoFile(self, "stderr")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
509 self.console = PseudoFile(self, "console")
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
510 if not use_subprocess:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
511 sys.stdout = self.stdout
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
512 sys.stderr = self.stderr
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
513 sys.stdin = self
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
514
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
515 self.history = self.History(self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
516
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
517 if use_subprocess:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
518 self.interp.spawn_subprocess()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
519
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
520 reading = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
521 executing = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
522 canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
523 endoffile = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
524
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
525 def toggle_debugger(self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
526 if self.executing:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
527 tkMessageBox.showerror("Don't debug now",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
528 "You can only toggle the debugger when idle",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
529 master=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
530 self.set_debugger_indicator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
531 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
532 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
533 db = self.interp.getdebugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
534 if db:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
535 self.close_debugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
536 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
537 self.open_debugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
538
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
539 def set_debugger_indicator(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
540 db = self.interp.getdebugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
541 self.setvar("<<toggle-debugger>>", not not db)
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 toggle_jit_stack_viewer( self, event=None):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
544 pass # All we need is the variable
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
545
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
546 def close_debugger(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
547 db = self.interp.getdebugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
548 if db:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
549 self.interp.setdebugger(None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
550 db.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
551 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
552 self.console.write("[DEBUG OFF]\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
553 sys.ps1 = ">>> "
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
554 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
555 self.set_debugger_indicator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
556
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
557 def open_debugger(self):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
558 if self.interp.rpcclt:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
559 return self.open_remote_debugger()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
560 import Debugger
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
561 self.interp.setdebugger(Debugger.Debugger(self))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
562 sys.ps1 = "[DEBUG ON]\n>>> "
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
563 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
564 self.set_debugger_indicator()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
565
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
566 def open_remote_debugger(self):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
567 import RemoteDebugger
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
568 gui = RemoteDebugger.start_remote_debugger(self.interp.rpcclt, self)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
569 self.interp.setdebugger(gui)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
570 sys.ps1 = "[DEBUG ON]\n>>> "
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
571 self.showprompt()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
572 self.set_debugger_indicator()
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
573
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
574 def beginexecuting(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
575 # Helper for ModifiedInterpreter
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
576 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
577 self.executing = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
578 ##self._cancel_check = self.cancel_check
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
579 ##sys.settrace(self._cancel_check)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
580
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
581 def endexecuting(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
582 # Helper for ModifiedInterpreter
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
583 ##sys.settrace(None)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
584 ##self._cancel_check = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
585 self.executing = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
586 self.canceled = 0
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
587 self.showprompt()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
588
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
589 def close(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
590 # Extend base class method
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
591 if self.executing:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
592 # XXX Need to ask a question here
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
593 if not tkMessageBox.askokcancel(
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
594 "Kill?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
595 "The program is still running; do you want to kill it?",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
596 default="ok",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
597 master=self.text):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
598 return "cancel"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
599 self.canceled = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
600 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
601 self.top.quit()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
602 return "cancel"
18586
fe44428f9774 py-cvs-2001_07_13 (Rev 1.34) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 18560
diff changeset
603 return OutputWindow.close(self)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
604
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
605 def _close(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
606 self.close_debugger()
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
607 self.interp.kill_subprocess()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
608 # Restore std streams
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
609 sys.stdout = self.save_stdout
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
610 sys.stderr = self.save_stderr
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
611 sys.stdin = self.save_stdin
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
612 # Break cycles
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
613 self.interp = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
614 self.console = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
615 self.auto = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
616 self.flist.pyshell = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
617 self.history = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
618 OutputWindow._close(self) # Really EditorWindow._close
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 ispythonsource(self, filename):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
621 # Override this so EditorWindow never removes the colorizer
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
622 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
623
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
624 def short_title(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
625 return self.shell_title
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
626
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
627 COPYRIGHT = \
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
628 '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
629
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
630 def begin(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
631 self.resetoutput()
18614
384a61fa6f5a Call out IDLE Fork in startup message.
Kurt B. Kaiser <kbk@shore.net>
parents: 18613
diff changeset
632 self.write("Python %s on %s\n%s\nIDLE Fork %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
633 (sys.version, sys.platform, self.COPYRIGHT,
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
634 idlever.IDLE_VERSION))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
635 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
636 sys.ps1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
637 except AttributeError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
638 sys.ps1 = ">>> "
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
639 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
640 import Tkinter
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
641 Tkinter._default_root = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
642
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
643 def interact(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
644 self.begin()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
645 self.top.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
646
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
647 def readline(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
648 save = self.reading
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
649 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
650 self.reading = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
651 self.top.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
652 finally:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
653 self.reading = save
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
654 line = self.text.get("iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
655 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
656 if self.canceled:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
657 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
658 raise KeyboardInterrupt
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
659 if self.endoffile:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
660 self.endoffile = 0
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 return line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
663
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
664 def isatty(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
665 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
666
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
667 def cancel_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
668 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
669 if self.text.compare("sel.first", "!=", "sel.last"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
670 return # Active selection -- always use default binding
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
671 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
672 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
673 if not (self.executing or self.reading):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
674 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
675 self.write("KeyboardInterrupt\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
676 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
677 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
678 self.endoffile = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
679 if self.reading:
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
680 self.canceled = 1
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
681 self.top.quit()
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
682 elif (self.executing and self.interp.rpcclt and
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
683 self.interp.rpcpid and hasattr(os, "kill")):
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
684 try:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
685 from signal import SIGINT
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
686 except ImportError:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
687 SIGINT = 2
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
688 os.kill(self.interp.rpcpid, SIGINT)
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
689 else:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
690 self.canceled = 1
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
691 return "break"
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 eof_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
694 if self.executing and not self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
695 return # Let the default binding (delete next char) take over
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
696 if not (self.text.compare("iomark", "==", "insert") and
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
697 self.text.compare("insert", "==", "end-1c")):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
698 return # Let the default binding (delete next char) take over
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
699 if not self.executing:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
700 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
701 self.close()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
702 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
703 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
704 self.endoffile = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
705 self.top.quit()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
706 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
707
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
708 def home_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
709 if event.state != 0 and event.keysym == "Home":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
710 return # <Modifier-Home>; fall back to class binding
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
711 if self.text.compare("iomark", "<=", "insert") and \
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
712 self.text.compare("insert linestart", "<=", "iomark"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
713 self.text.mark_set("insert", "iomark")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
714 self.text.tag_remove("sel", "1.0", "end")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
715 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
716 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
717
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
718 def linefeed_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
719 # Insert a linefeed without entering anything (still autoindented)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
720 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
721 self.text.insert("insert", "\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
722 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
723 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
724 self.auto.auto_indent(event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
725 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
726
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
727 def enter_callback(self, event):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
728 if self.executing and not self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
729 return # Let the default binding (insert '\n') take over
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
730 # If some text is selected, recall the selection
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
731 # (but only if this before the I/O mark)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
732 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
733 sel = self.text.get("sel.first", "sel.last")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
734 if sel:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
735 if self.text.compare("sel.last", "<=", "iomark"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
736 self.recall(sel)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
737 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
738 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
739 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
740 # If we're strictly before the line containing iomark, recall
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
741 # the current line, less a leading prompt, less leading or
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
742 # trailing whitespace
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
743 if self.text.compare("insert", "<", "iomark linestart"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
744 # Check if there's a relevant stdin range -- if so, use it
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
745 prev = self.text.tag_prevrange("stdin", "insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
746 if prev and self.text.compare("insert", "<", prev[1]):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
747 self.recall(self.text.get(prev[0], prev[1]))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
748 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
749 next = self.text.tag_nextrange("stdin", "insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
750 if next and self.text.compare("insert lineend", ">=", next[0]):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
751 self.recall(self.text.get(next[0], next[1]))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
752 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
753 # No stdin mark -- just get the current line
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
754 self.recall(self.text.get("insert linestart", "insert lineend"))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
755 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
756 # If we're in the current input and there's only whitespace
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
757 # beyond the cursor, erase that whitespace first
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
758 s = self.text.get("insert", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
759 if s and not string.strip(s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
760 self.text.delete("insert", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
761 # If we're in the current input before its last line,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
762 # insert a newline right at the insert point
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
763 if self.text.compare("insert", "<", "end-1c linestart"):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
764 self.auto.auto_indent(event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
765 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
766 # We're in the last line; append a newline and submit it
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
767 self.text.mark_set("insert", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
768 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
769 self.text.insert("insert", "\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
770 self.text.see("insert")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
771 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
772 self.auto.auto_indent(event)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
773 self.text.tag_add("stdin", "iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
774 self.text.update_idletasks()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
775 if self.reading:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
776 self.top.quit() # Break out of recursive mainloop() in raw_input()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
777 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
778 self.runit()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
779 return "break"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
780
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
781 def recall(self, s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
782 if self.history:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
783 self.history.recall(s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
784
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
785 def runit(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
786 line = self.text.get("iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
787 # Strip off last newline and surrounding whitespace.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
788 # (To allow you to hit return twice to end a statement.)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
789 i = len(line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
790 while i > 0 and line[i-1] in " \t":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
791 i = i-1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
792 if i > 0 and line[i-1] == "\n":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
793 i = i-1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
794 while i > 0 and line[i-1] in " \t":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
795 i = i-1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
796 line = line[:i]
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
797 more = self.interp.runsource(line)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
798 if not more:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
799 self.showprompt()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
800
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
801 def cancel_check(self, frame, what, args,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
802 dooneevent=tkinter.dooneevent,
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
803 dontwait=tkinter.DONT_WAIT):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
804 # Hack -- use the debugger hooks to be able to handle events
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
805 # and interrupt execution at any time.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
806 # This slows execution down quite a bit, so you may want to
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
807 # disable this (by not calling settrace() in runcode() above)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
808 # for full-bore (uninterruptable) speed.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
809 # XXX This should become a user option.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
810 if self.canceled:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
811 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
812 dooneevent(dontwait)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
813 if self.canceled:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
814 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
815 raise KeyboardInterrupt
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
816 return self._cancel_check
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
817
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
818 def open_stack_viewer(self, event=None):
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
819 if self.interp.rpcclt:
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
820 return self.interp.remote_stack_viewer()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
821 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
822 sys.last_traceback
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
823 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
824 tkMessageBox.showerror("No stack trace",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
825 "There is no stack trace yet.\n"
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
826 "(sys.last_traceback is not defined)",
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
827 master=self.text)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
828 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
829 from StackViewer import StackBrowser
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
830 sv = StackBrowser(self.root, self.flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
831
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
832 def showprompt(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
833 self.resetoutput()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
834 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
835 s = str(sys.ps1)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
836 except:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
837 s = ""
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
838 self.console.write(s)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
839 self.text.mark_set("insert", "end-1c")
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
840 self.set_line_and_column()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
841
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
842 def resetoutput(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
843 source = self.text.get("iomark", "end-1c")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
844 if self.history:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
845 self.history.history_store(source)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
846 if self.text.get("end-2c") != "\n":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
847 self.text.insert("end-1c", "\n")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
848 self.text.mark_set("iomark", "end-1c")
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
849 self.set_line_and_column()
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
850 sys.stdout.softspace = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
851
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
852 def write(self, s, tags=()):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
853 self.text.mark_gravity("iomark", "right")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
854 OutputWindow.write(self, s, tags, "iomark")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
855 self.text.mark_gravity("iomark", "left")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
856 if self.canceled:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
857 self.canceled = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
858 raise KeyboardInterrupt
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
859
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
860 class PseudoFile:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
861
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
862 def __init__(self, shell, tags):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
863 self.shell = shell
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
864 self.tags = tags
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
865 self.softspace = 0
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
866
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
867 def write(self, s):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
868 self.shell.write(s, self.tags)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
869
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
870 def writelines(self, l):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
871 map(self.write, l)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
872
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
873 def flush(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
874 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
875
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
876 def isatty(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
877 return 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
878
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
879 usage_msg = """\
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
880 usage: idle.py [-c command] [-d] [-i] [-r script] [-s] [-t title] [arg] ...
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
881
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
882 idle file(s) (without options) edit the file(s)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
883
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
884 -c cmd run the command in a shell
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
885 -d enable the debugger
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
886 -e edit mode; arguments are files to be edited
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
887 -i open an interactive shell
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
888 -i file(s) open a shell and also an editor window for each file
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
889 -r script use experimental remote (subprocess) execution feature
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
890 -s run $IDLESTARTUP or $PYTHONSTARTUP before anything else
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
891 -t title set title of shell window
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
892
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
893 Remaining arguments are applied to the command (-c) or script (-r).
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
894 """
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
895
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
896 class usageError:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
897 def __init__(self, string): self.string = string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
898 def __repr__(self): return self.string
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
899
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
900 class main:
18613
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
901 def __init__(self, noshell=1):
20306
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
902
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
903 global flist, root
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
904 root = Tk(className="Idle")
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
905 fixwordbreaks(root)
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
906 root.withdraw()
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
907 flist = PyShellFileList(root)
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
908
22599
194ed5e0dc8f _finally_ tracked down and eliminated a major problem
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
909 # the following causes lockups and silent failures when debugging
194ed5e0dc8f _finally_ tracked down and eliminated a major problem
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
910 # changes to EditorWindow.__init__ ; the console works fine for idle
194ed5e0dc8f _finally_ tracked down and eliminated a major problem
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
911 # debugging in any case, so disable this unnescesary stuff.
194ed5e0dc8f _finally_ tracked down and eliminated a major problem
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
912 #dbg=OnDemandOutputWindow(flist)
194ed5e0dc8f _finally_ tracked down and eliminated a major problem
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
913 #dbg.set_title('IDLE Debugging Messages')
194ed5e0dc8f _finally_ tracked down and eliminated a major problem
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
914 #sys.stdout = PseudoFile(dbg,['stdout'])
194ed5e0dc8f _finally_ tracked down and eliminated a major problem
Steven M. Gava <elguavas@python.net>
parents: 22111
diff changeset
915 #sys.stderr = PseudoFile(dbg,['stderr'])
20306
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
916
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
917 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
918 self.server = protocol.Server(connection_hook = self.address_ok)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
919 protocol.publish( 'IDLE', self.connect )
18613
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
920 self.main(sys.argv[1:], noshell)
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
921 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
922 except protocol.connectionLost:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
923 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
924 client = protocol.Client()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
925 IDLE = client.getobject('IDLE')
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
926 if IDLE:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
927 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
928 IDLE.remote( sys.argv[1:] )
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
929 except usageError, msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
930 sys.stderr.write("Error: %s\n" % str(msg))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
931 sys.stderr.write(usage_msg)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
932 return
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
933 except protocol.connectionLost:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
934 pass
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
935
20306
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
936 #maybe the following should be handled by a tkmessagebox for
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
937 #users who don't start idle from a console??
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
938 print """\
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
939 IDLE cannot run.
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
940
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
941 IDLE needs to use a specific TCP/IP port (7454) in order to execute and
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
942 debug programs. IDLE is unable to bind to this port, and so cannot
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
943 start. Here are some possible causes of this problem:
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
944
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
945 1. TCP/IP networking is not installed or not working on this computer
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
946 2. Another program is running that uses this port
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
947 3. Another copy of IDLE stopped responding but is still bound to the port
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
948 4. Personal firewall software is preventing IDLE from using this port
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
949
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
950 IDLE makes and accepts connections only with this computer, and does not
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
951 communicate over the internet in any way. It's use of port 7454 should not
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
952 be a security risk on a single-user machine.
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
953 """
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
954 dbg.owin.gotoline(1)
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
955 dbg.owin.remove_selection()
1ca228e21a98 merged port binding error message patch
Steven M. Gava <elguavas@python.net>
parents: 18649
diff changeset
956 root.mainloop() # wait for user to read message
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
957
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
958 def idle(self):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
959 spawn.kill_zombies()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
960 self.server.rpc_loop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
961 root.after(25, self.idle)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
962
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
963 # We permit connections from localhost only
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
964 def address_ok(self, addr):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
965 return addr[0] == '127.0.0.1'
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
966
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
967 def connect(self, client, addr):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
968 return self
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
969
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
970 def remote( self, argv ):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
971 # xxx Should make this behavior match the behavior in main, or redo
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
972 # command line options entirely.
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
973
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
974 try:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
975 opts, args = getopt.getopt(argv, "c:deist:")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
976 except getopt.error, msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
977 raise usageError(msg)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
978
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
979 for filename in args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
980 flist.open(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
981 if not args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
982 flist.new()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
983
18613
6238a222b7cd Add a script "idles" which opens a Python Shell window.
Kurt B. Kaiser <kbk@shore.net>
parents: 18586
diff changeset
984 def main(self, argv, noshell):
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
985 cmd = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
986 edit = 0
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
987 debug = 0
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
988 interactive = 0
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
989 script = None
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
990 startup = 0
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
991 global use_subprocess
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
992
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
993 try:
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
994 opts, args = getopt.getopt(sys.argv[1:], "c:deir:st:")
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
995 except getopt.error, msg:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
996 sys.stderr.write("Error: %s\n" % str(msg))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
997 sys.stderr.write(usage_msg)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
998 sys.exit(2)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
999
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1000 for o, a in opts:
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1001 noshell = 0 # There are options, bring up a shell
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1002 if o == '-c':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1003 cmd = a
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1004 if o == '-d':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1005 debug = 1
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
1006 if o == '-e':
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
1007 edit = 1
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1008 if o == '-i':
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1009 interactive = 1
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1010 if o == '-r':
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
1011 edit = 1
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1012 script = a
23547
b74afdd072eb GvR's rpc patch
Chui Tey <chui.tey@advdata.com.au>
parents: 22599
diff changeset
1013 use_subprocess = 1
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1014 if o == '-s':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1015 startup = 1
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1016 if o == '-t':
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1017 PyShell.shell_title = a
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1018
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1019 if noshell: edit=1
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1020 if interactive and args and args[0] != "-": edit = 1
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1021
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1022 for i in range(len(sys.path)):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1023 sys.path[i] = os.path.abspath(sys.path[i])
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1024
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1025 pathx = []
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1026 if edit:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1027 for filename in args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1028 pathx.append(os.path.dirname(filename))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1029 elif args and args[0] != "-":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1030 pathx.append(os.path.dirname(args[0]))
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1031 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1032 pathx.append(os.curdir)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1033 for dir in pathx:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1034 dir = os.path.abspath(dir)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1035 if not dir in sys.path:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1036 sys.path.insert(0, dir)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1037
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1038 if edit:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1039 for filename in args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1040 flist.open(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1041 if not args:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1042 flist.new()
18560
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
1043 else:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
1044 if cmd:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
1045 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
1046 else:
12e7ad108229 cvs-py-rel2_1 (Rev 1.29 - 1.33) merge
Kurt B. Kaiser <kbk@shore.net>
parents: 13975
diff changeset
1047 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
1048
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1049 if noshell:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1050 flist.pyshell = None
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1051 else:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1052 shell = PyShell(flist)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1053 interp = shell.interp
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1054 flist.pyshell = shell
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1055
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1056 if startup:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1057 filename = os.environ.get("IDLESTARTUP") or \
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1058 os.environ.get("PYTHONSTARTUP")
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1059 if filename and os.path.isfile(filename):
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1060 interp.execfile(filename)
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1061
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1062 if debug:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1063 shell.open_debugger()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1064 if cmd:
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1065 interp.execsource(cmd)
18649
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1066 elif script:
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1067 if os.path.isfile(script):
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1068 interp.execfile(script)
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1069 else:
8aa63aea7269 Implement idle command interface as suggested by GvR [idle-dev] 16 July
Kurt B. Kaiser <kbk@shore.net>
parents: 18614
diff changeset
1070 print "No script file: ", script
13975
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1071 shell.begin()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1072
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1073 self.idle()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1074 root.mainloop()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1075 root.destroy()
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1076
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1077
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1078 if __name__ == "__main__":
30713d5288df Initial revision
David Scherer <dscherer@cmu.edu>
parents:
diff changeset
1079 main()