annotate Demo/stdwin/python.py @ 1118:56636395724d legacy-trunk

Adapted to modern times. Cosmetic and comment changes.
author Guido van Rossum <guido@python.org>
date Mon, 14 Dec 1992 14:10:53 +0000
parents cb146aa987c9
children a47e0c9baad0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
1 #! /usr/local/bin/python
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
2
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
3 # :set tabsize=4:
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5 # A STDWIN-based front end for the Python interpreter.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # This is useful if you want to avoid console I/O and instead
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8 # use text windows to issue commands to the interpreter.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
10 # It supports multiple interpreter windows, each with its own context.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
11 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
12 # BUGS AND CAVEATS:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
13 #
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
14 # I wrote this about two years ago. There are now some features in
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
15 # Python that make it possible to overcome some of the bugs below,
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
16 # but I haven't the time to adapt it; it's just meant as a little
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
17 # thing to get you started...
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
18 #
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 # Although this supports multiple windows, the whole application
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 # is deaf and dumb when a command is running in one window.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 # Everything written to stdout or stderr is saved on a file which
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 # is inserted in the window at the next input request.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 # On UNIX (using X11), interrupts typed in the window will not be
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 # seen until the next input request. (On the Mac, interrupts work.)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 # Direct input from stdin should not be attempted.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 import sys
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
32 import builtin
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 import stdwin
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 from stdwinevents import *
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 import rand
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 import mainloop
753
8f7b31a8a678 Adapt it to modern times (0.9.6)
Guido van Rossum <guido@python.org>
parents: 752
diff changeset
37 import os
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 # Filename used to capture output from commands; change to suit your taste
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 OUTFILE = '@python.stdout.tmp'
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 # Stack of windows waiting for [raw_]input().
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46 # Element [0] is the top.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47 # If there are multiple windows waiting for input, only the
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 # one on top of the stack can accept input, because the way
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49 # raw_input() is implemented (using recursive mainloop() calls).
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 inputwindows = []
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 # Exception raised when input is available.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 InputAvailable = 'input available for raw_input (not an error)'
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 # Main program. Create the window and call the mainloop.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 def main():
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 # Hack so 'import python' won't load another copy
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 # of this if we were loaded though 'python python.py'.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 # (Should really look at sys.argv[0]...)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 if 'inputwindows' in dir(sys.modules['__main__']) and \
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 sys.modules['__main__'].inputwindows is inputwindows:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
67 sys.modules['python'] = sys.modules['__main__']
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 win = makewindow()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 mainloop.mainloop()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 # Create a new window.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 def makewindow():
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 # stdwin.setdefscrollbars(0, 1) # Not in Python 0.9.1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 # stdwin.setfont('monaco') # Not on UNIX! and not Python 0.9.1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 # stdwin.setdefwinsize(stdwin.textwidth('in')*40, stdwin.lineheight() * 24)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 win = stdwin.open('Python interpreter ready')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 win.editor = win.textcreate((0,0), win.getwinsize())
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 win.outfile = OUTFILE + `rand.rand()`
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 win.globals = {} # Dictionary for user's global variables
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 win.command = '' # Partially read command
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 win.busy = 0 # Ready to accept a command
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 win.auto = 1 # [CR] executes command
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 win.insertOutput = 1 # Insert output at focus.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 win.insertError = 1 # Insert error output at focus.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 win.setwincursor('ibeam')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 win.filename = '' # Empty if no file associated with this window
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 makefilemenu(win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 makeeditmenu(win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 win.dispatch = pdispatch # Event dispatch function
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 mainloop.register(win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 return win
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 # Make a 'File' menu
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 def makefilemenu(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 win.filemenu = mp = win.menucreate('File')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 mp.callback = []
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 additem(mp, 'New', 'N', do_new)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 additem(mp, 'Open...', 'O', do_open)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 additem(mp, '', '', None)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 additem(mp, 'Close', 'W', do_close)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 additem(mp, 'Save', 'S', do_save)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 additem(mp, 'Save as...', '', do_saveas)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 additem(mp, '', '', None)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 additem(mp, 'Quit', 'Q', do_quit)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 # Make an 'Edit' menu
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 def makeeditmenu(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 win.editmenu = mp = win.menucreate('Edit')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 mp.callback = []
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117 additem(mp, 'Cut', 'X', do_cut)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118 additem(mp, 'Copy', 'C', do_copy)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 additem(mp, 'Paste', 'V', do_paste)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 additem(mp, 'Clear', '', do_clear)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
121 additem(mp, '', '', None)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
122 win.iauto = len(mp.callback)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 additem(mp, 'Autoexecute', '', do_auto)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
124 mp.check(win.iauto, win.auto)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 win.insertOutputNum = len(mp.callback)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
126 additem(mp, 'Insert Output', '', do_insertOutputOption)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 win.insertErrorNum = len(mp.callback)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
128 additem(mp, 'Insert Error', '', do_insertErrorOption)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
129 additem(mp, 'Exec', '\r', do_exec)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
130
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
131
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 # Helper to add a menu item and callback function
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 def additem(mp, text, shortcut, handler):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 if shortcut:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 mp.additem(text, shortcut)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
137 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 mp.additem(text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 mp.callback.append(handler)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
141
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 # Dispatch a single event to the interpreter.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
143 # Resize events cause a resize of the editor.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
144 # Other events are directly sent to the editor.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
145 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
146 # Exception: WE_COMMAND/WC_RETURN causes the current selection
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
147 # (if not empty) or current line (if empty) to be sent to the
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
148 # interpreter. (In the future, there should be a way to insert
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 # newlines in the text; or perhaps Enter or Meta-RETURN should be
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 # used to trigger execution, like in MPW, though personally I prefer
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 # using a plain Return to trigger execution, as this is what I want
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152 # in the majority of cases.)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
153 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 # Also, WE_COMMAND/WC_CANCEL cancels any command in progress.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 def pdispatch(event):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 type, win, detail = event
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 if type == WE_CLOSE:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 do_close(win)
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
160 return
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 elif type == WE_SIZE:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 win.editor.move((0, 0), win.getwinsize())
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 elif type == WE_COMMAND and detail == WC_RETURN:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 if win.auto:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 do_exec(win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 void = win.editor.event(event)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 elif type == WE_COMMAND and detail == WC_CANCEL:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 if win.busy:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
170 raise InputAvailable, (EOFError, None)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 win.command = ''
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 settitle(win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 elif type == WE_MENU:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 mp, item = detail
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 mp.callback[item](win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 void = win.editor.event(event)
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
179 if win in mainloop.windows:
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 # May have been deleted by close...
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 win.setdocsize(0, win.editor.getrect()[1][1])
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 if type in (WE_CHAR, WE_COMMAND):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 win.editor.setfocus(win.editor.getfocus())
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 # Helper to set the title of the window.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 def settitle(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 if win.filename == '':
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 win.settitle('Python interpreter ready')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192 win.settitle(win.filename)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195 # Helper to replace the text of the focus.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 def replace(win, text):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 win.editor.replace(text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 # Resize the window to display the text
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 win.setdocsize(0, win.editor.getrect()[1][1]) # update the size before..
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
201 win.editor.setfocus(win.editor.getfocus()) # move focus to the change
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 # File menu handlers
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
205 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 def do_new(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
207 win = makewindow()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
209 def do_open(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 try:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 filename = stdwin.askfile('Open file', '', 0)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 win = makewindow()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 win.filename = filename
753
8f7b31a8a678 Adapt it to modern times (0.9.6)
Guido van Rossum <guido@python.org>
parents: 752
diff changeset
214 win.editor.replace(open(filename, 'r').read())
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 win.editor.setfocus(0, 0)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 win.settitle(win.filename)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 except KeyboardInterrupt:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 pass # Don't give an error on cancel.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 def do_save(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 try:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 if win.filename == '':
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 win.filename = stdwin.askfile('Open file', '', 1)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 f = open(win.filename, 'w')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 f.write(win.editor.gettext())
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 except KeyboardInterrupt:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 pass # Don't give an error on cancel.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 def do_saveas(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 currentFilename = win.filename
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 win.filename = ''
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 do_save(win) # Use do_save with empty filename
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 if win.filename == '': # Restore the name if do_save did not set it.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236 win.filename = currentFilename
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 def do_close(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
239 if win.busy:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
240 stdwin.message('Can\'t close busy window')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
241 return # need to fail if quitting??
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
242 win.editor = None # Break circular reference
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
243 #del win.editmenu # What about the filemenu??
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
244 try:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
245 os.unlink(win.outfile)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
246 except os.error:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
247 pass
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
248 mainloop.unregister(win)
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
249 win.close()
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
250 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
251 def do_quit(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
252 # Call win.dispatch instead of do_close because there
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
253 # may be 'alien' windows in the list.
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
254 for win in mainloop.windows[:]:
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
255 mainloop.dispatch((WE_CLOSE, win, None)) # need to catch failed close
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
256
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
257
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
258 # Edit menu handlers
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
259 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
260 def do_cut(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
261 text = win.editor.getfocustext()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
262 if not text:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
263 stdwin.fleep()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
264 return
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
265 stdwin.setcutbuffer(0, text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
266 replace(win, '')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
267 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
268 def do_copy(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
269 text = win.editor.getfocustext()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
270 if not text:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
271 stdwin.fleep()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
272 return
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
273 stdwin.setcutbuffer(0, text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
274 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
275 def do_paste(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
276 text = stdwin.getcutbuffer(0)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
277 if not text:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
278 stdwin.fleep()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
279 return
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
280 replace(win, text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
281 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
282 def do_clear(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
283 replace(win, '')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
284
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
285 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
286 # These would be better in a preferences dialog:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
287 def do_auto(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
288 win.auto = (not win.auto)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
289 win.editmenu.check(win.iauto, win.auto)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
290 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
291 def do_insertOutputOption(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
292 win.insertOutput = (not win.insertOutput)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
293 title = ['Append Output', 'Insert Output'][win.insertOutput]
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
294 win.editmenu.setitem(win.insertOutputNum, title)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
295 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
296 def do_insertErrorOption(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
297 win.insertError = (not win.insertError)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
298 title = ['Error Dialog', 'Insert Error'][win.insertError]
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
299 win.editmenu.setitem(win.insertErrorNum, title)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
300
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
301
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
302 # Extract a command from the editor and execute it, or pass input to
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
303 # an interpreter waiting for it.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
304 # Incomplete commands are merely placed in the window's command buffer.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
305 # All exceptions occurring during the execution are caught and reported.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
306 # (Tracebacks are currently not possible, as the interpreter does not
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
307 # save the traceback pointer until it reaches its outermost level.)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
308 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
309 def do_exec(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
310 if win.busy:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
311 if win not in inputwindows:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
312 stdwin.message('Can\'t run recursive commands')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
313 return
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
314 if win <> inputwindows[0]:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
315 stdwin.message( \
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
316 'Please complete recursive input first')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
317 return
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
318 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
319 # Set text to the string to execute.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
320 a, b = win.editor.getfocus()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
321 alltext = win.editor.gettext()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
322 n = len(alltext)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
323 if a == b:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
324 # There is no selected text, just an insert point;
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
325 # so execute the current line.
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
326 while 0 < a and alltext[a-1] <> '\n': a = a-1 # Find beginning of line.
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
327 while b < n and alltext[b] <> '\n': # Find end of line after b.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
328 b = b+1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
329 text = alltext[a:b] + '\n'
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
330 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
331 # Execute exactly the selected text.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
332 text = win.editor.getfocustext()
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
333 if text[-1:] <> '\n': # Make sure text ends with \n.
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
334 text = text + '\n'
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
335 while b < n and alltext[b] <> '\n': # Find end of line after b.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
336 b = b+1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
337 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
338 # Set the focus to expect the output, since there is always something.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
339 # Output will be inserted at end of line after current focus,
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
340 # or appended to the end of the text.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
341 b = [n, b][win.insertOutput]
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
342 win.editor.setfocus(b, b)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
343 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
344 # Make sure there is a preceeding newline.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
345 if alltext[b-1:b] <> '\n':
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
346 win.editor.replace('\n')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
347 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
348 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
349 if win.busy:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
350 # Send it to raw_input() below
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
351 raise InputAvailable, (None, text)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
352 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
353 # Like the real Python interpreter, we want to execute
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
354 # single-line commands immediately, but save multi-line
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
355 # commands until they are terminated by a blank line.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
356 # Unlike the real Python interpreter, we don't do any syntax
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
357 # checking while saving up parts of a multi-line command.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
358 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
359 # The current heuristic to determine whether a command is
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
360 # the first line of a multi-line command simply checks whether
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 # the command ends in a colon (followed by a newline).
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
362 # This is not very robust (comments and continuations will
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 # confuse it), but it is usable, and simple to implement.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
364 # (It even has the advantage that single-line loops etc.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
365 # don't need te be terminated by a blank line.)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
366 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
367 if win.command:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
368 # Already continuing
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
369 win.command = win.command + text
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
370 if win.command[-2:] <> '\n\n':
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
371 win.settitle('Unfinished command...')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
372 return # Need more...
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
373 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
374 # New command
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
375 win.command = text
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
376 if text[-2:] == ':\n':
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
377 win.settitle('Unfinished command...')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
378 return
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
379 command = win.command
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
380 win.command = ''
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
381 win.settitle('Executing command...')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
382 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
383 # Some hacks: sys.stdout is temporarily redirected to a file,
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
384 # so we can intercept the command's output and insert it
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
385 # in the editor window; the built-in function raw_input
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
386 # and input() are replaced by out versions;
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
387 # and a second, undocumented argument
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
388 # to exec() is used to specify the directory holding the
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 # user's global variables. (If this wasn't done, the
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
390 # exec would be executed in the current local environment,
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 # and the user's assignments to globals would be lost...)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
392 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 save_input = builtin.input
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
394 save_raw_input = builtin.raw_input
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
395 save_stdout = sys.stdout
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
396 save_stderr = sys.stderr
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
397 iwin = Input().init(win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
398 try:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
399 builtin.input = iwin.input
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
400 builtin.raw_input = iwin.raw_input
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
401 sys.stdout = sys.stderr = open(win.outfile, 'w')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
402 win.busy = 1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
403 try:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
404 exec(command, win.globals)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
405 except KeyboardInterrupt:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
406 pass # Don't give an error.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
407 except:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
408 msg = sys.exc_type
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
409 if sys.exc_value <> None:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
410 msg = msg + ': ' + `sys.exc_value`
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
411 if win.insertError:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
412 stdwin.fleep()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
413 replace(win, msg + '\n')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
414 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
415 win.settitle('Unhandled exception')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
416 stdwin.message(msg)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
417 finally:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
418 # Restore redirected I/O in *all* cases
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
419 win.busy = 0
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
420 sys.stderr = save_stderr
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
421 sys.stdout = save_stdout
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
422 builtin.raw_input = save_raw_input
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 builtin.input = save_input
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
424 settitle(win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
425 getoutput(win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
426
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
427
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
428 # Read any output the command may have produced back from the file
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
429 # and show it. Optionally insert it after the focus, like MPW does,
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
430 # or always append at the end.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
431 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
432 def getoutput(win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
433 filename = win.outfile
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
434 try:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
435 fp = open(filename, 'r')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
436 except:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
437 stdwin.message('Can\'t read output from ' + filename)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
438 return
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
439 #out = fp.read() # Not in Python 0.9.1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
440 out = fp.read(10000) # For Python 0.9.1
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
441 del fp # Close it
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
442 if out or win.insertOutput:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
443 replace(win, out)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
444
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
445
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
446 # Implementation of input() and raw_input().
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
447 # This uses a class only because we must support calls
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
448 # with and without arguments; this can't be done normally in Python,
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
449 # but the extra, implicit argument for instance methods does the trick.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
450 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
451 class Input:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
452 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
453 def init(self, win):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
454 self.win = win
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
455 return self
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
456 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
457 def input(args):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
458 # Hack around call with or without argument:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
459 if type(args) == type(()):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
460 self, prompt = args
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
461 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
462 self, prompt = args, ''
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
463 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
464 return eval(self.raw_input(prompt), self.win.globals)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
465 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
466 def raw_input(args):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
467 # Hack around call with or without argument:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
468 if type(args) == type(()):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
469 self, prompt = args
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
470 else:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
471 self, prompt = args, ''
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
473 print prompt # Need to terminate with newline.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 sys.stdout.close()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
475 sys.stdout = sys.stderr = None
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
476 getoutput(self.win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
477 sys.stdout = sys.stderr = open(self.win.outfile, 'w')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
478 save_title = self.win.gettitle()
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
479 n = len(inputwindows)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
480 title = n*'(' + 'Requesting input...' + ')'*n
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
481 self.win.settitle(title)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
482 inputwindows.insert(0, self.win)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
483 try:
867
cb146aa987c9 Make it at least legal grammar!
Guido van Rossum <guido@python.org>
parents: 753
diff changeset
484 try:
cb146aa987c9 Make it at least legal grammar!
Guido van Rossum <guido@python.org>
parents: 753
diff changeset
485 mainloop.mainloop()
cb146aa987c9 Make it at least legal grammar!
Guido van Rossum <guido@python.org>
parents: 753
diff changeset
486 except InputAvailable, (exc, val): # See do_exec above.
cb146aa987c9 Make it at least legal grammar!
Guido van Rossum <guido@python.org>
parents: 753
diff changeset
487 if exc:
cb146aa987c9 Make it at least legal grammar!
Guido van Rossum <guido@python.org>
parents: 753
diff changeset
488 raise exc, val
cb146aa987c9 Make it at least legal grammar!
Guido van Rossum <guido@python.org>
parents: 753
diff changeset
489 if val[-1:] == '\n':
cb146aa987c9 Make it at least legal grammar!
Guido van Rossum <guido@python.org>
parents: 753
diff changeset
490 val = val[:-1]
cb146aa987c9 Make it at least legal grammar!
Guido van Rossum <guido@python.org>
parents: 753
diff changeset
491 return val
752
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
492 finally:
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
493 del inputwindows[0]
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
494 self.win.settitle(save_title)
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
495 # If we don't catch InputAvailable, something's wrong...
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
496 raise EOFError
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
497 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
498
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
499
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
500 # Currently unused function to test a command's syntax without executing it
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
501 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
502 def testsyntax(s):
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
503 import string
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
504 lines = string.splitfields(s, '\n')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
505 for i in range(len(lines)): lines[i] = '\t' + lines[i]
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
506 lines.insert(0, 'if 0:')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
507 lines.append('')
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
508 exec(string.joinfields(lines, '\n'))
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
509
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
510
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
511 # Call the main program.
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
512 #
8bd2194ad6f9 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
513 main()
1118
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
514
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
515
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
516 # This was originally coded on a Mac, so...
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
517 # Local variables:
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
518 # py-indent-offset: 4
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
519 # tab-width: 4
56636395724d Adapted to modern times. Cosmetic and comment changes.
Guido van Rossum <guido@python.org>
parents: 867
diff changeset
520 # end: