PyShell.py revision bf3f69ee85d3c497bfdeae3ac3338c1409ca454c
17aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer#! /usr/bin/env python 27aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 37aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport os 46e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiserimport os.path 57aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport sys 67aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport string 77aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport getopt 87aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport re 95d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyimport socket 105d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyimport time 11003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiserimport threading 125d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyimport traceback 13628339807e76d075a610aa6dd963e702ef25afc8Kurt B. Kaiserimport types 1419302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussorenimport macosxSupport 157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport linecache 177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom code import InteractiveInterpreter 187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 192303b1c19abd79c94da327d630cbac6f4e83a05cKurt B. Kaisertry: 206634bf2919d855ccd821e878b8cc00c7209f1cbeGeorg Brandl from Tkinter import * 212303b1c19abd79c94da327d630cbac6f4e83a05cKurt B. Kaiserexcept ImportError: 226634bf2919d855ccd821e878b8cc00c7209f1cbeGeorg Brandl print>>sys.__stderr__, "** IDLE can't import Tkinter. " \ 232303b1c19abd79c94da327d630cbac6f4e83a05cKurt B. Kaiser "Your Python may not be configured for Tk. **" 242303b1c19abd79c94da327d630cbac6f4e83a05cKurt B. Kaiser sys.exit(1) 256634bf2919d855ccd821e878b8cc00c7209f1cbeGeorg Brandlimport tkMessageBox 267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom EditorWindow import EditorWindow, fixwordbreaks 287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom FileList import FileList 297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom ColorDelegator import ColorDelegator 307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererfrom UndoDelegator import UndoDelegator 31969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiserfrom OutputWindow import OutputWindow 329930061ce28b1fc60d267ae3474c74a41e655cd5Steven M. Gavafrom configHandler import idleConf 337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererimport idlever 347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 355d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyimport rpc 367f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiserimport Debugger 37ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiserimport RemoteDebugger 385d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 39b97641994617115321719d4ecf797a461e2d5cf2Kurt B. KaiserIDENTCHARS = string.ascii_letters + string.digits + "_" 4024d7e0cbb8b978738f223d4bb6cb184054d72e18Kurt B. KaiserLOCALHOST = '127.0.0.1' 41b97641994617115321719d4ecf797a461e2d5cf2Kurt B. Kaiser 42a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaisertry: 43a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser from signal import SIGTERM 44a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiserexcept ImportError: 45a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser SIGTERM = 15 46a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser 4749a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser# Override warnings module to write to warning_stream. Initialize to send IDLE 4849a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser# internal warnings to the console. ScriptBinding.check_syntax() will 4949a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser# temporarily redirect the stream to the shell window to display warnings when 5049a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser# checking user's code. 5149a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiserglobal warning_stream 5249a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiserwarning_stream = sys.__stderr__ 535d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teytry: 545d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey import warnings 555d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyexcept ImportError: 565d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey pass 575d2af63cc36ca1141e1ec7412fc33866f3908408Chui Teyelse: 58b76444b2fa39a99984ffa4bcfa9806fbb091594aBenjamin Peterson def idle_showwarning(message, category, filename, lineno, 59b76444b2fa39a99984ffa4bcfa9806fbb091594aBenjamin Peterson file=None, line=None): 6049a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser file = warning_stream 6149a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser try: 62b76444b2fa39a99984ffa4bcfa9806fbb091594aBenjamin Peterson file.write(warnings.formatwarning(message, category, filename,\ 63b76444b2fa39a99984ffa4bcfa9806fbb091594aBenjamin Peterson lineno, file=file, line=line)) 6449a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser except IOError: 6549a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser pass ## file (probably __stderr__) is invalid, warning dropped. 665d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey warnings.showwarning = idle_showwarning 67b76444b2fa39a99984ffa4bcfa9806fbb091594aBenjamin Peterson def idle_formatwarning(message, category, filename, lineno, 68b76444b2fa39a99984ffa4bcfa9806fbb091594aBenjamin Peterson file=None, line=None): 6949a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser """Format warnings the IDLE way""" 7049a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser s = "\nWarning (from warnings module):\n" 7149a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser s += ' File \"%s\", line %s\n' % (filename, lineno) 72b76444b2fa39a99984ffa4bcfa9806fbb091594aBenjamin Peterson line = linecache.getline(filename, lineno).strip() \ 73b76444b2fa39a99984ffa4bcfa9806fbb091594aBenjamin Peterson if line is None else line 7449a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser if line: 7549a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser s += " %s\n" % line 7649a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser s += "%s: %s\n>>> " % (category.__name__, message) 7749a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser return s 7849a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser warnings.formatwarning = idle_formatwarning 795d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 80f7a8899f33fb0a1efe6cb57fc1b712fa1059d0a6Kurt B. Kaiserdef extended_linecache_checkcache(filename=None, 81f7a8899f33fb0a1efe6cb57fc1b712fa1059d0a6Kurt B. Kaiser orig_checkcache=linecache.checkcache): 8245186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser """Extend linecache.checkcache to preserve the <pyshell#...> entries 8345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 84f7a8899f33fb0a1efe6cb57fc1b712fa1059d0a6Kurt B. Kaiser Rather than repeating the linecache code, patch it to save the 85f7a8899f33fb0a1efe6cb57fc1b712fa1059d0a6Kurt B. Kaiser <pyshell#...> entries, call the original linecache.checkcache() 86f7a8899f33fb0a1efe6cb57fc1b712fa1059d0a6Kurt B. Kaiser (which destroys them), and then restore the saved entries. 87f7a8899f33fb0a1efe6cb57fc1b712fa1059d0a6Kurt B. Kaiser 88f7a8899f33fb0a1efe6cb57fc1b712fa1059d0a6Kurt B. Kaiser orig_checkcache is bound at definition time to the original 89f7a8899f33fb0a1efe6cb57fc1b712fa1059d0a6Kurt B. Kaiser method, allowing it to be patched. 9045186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 9145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser """ 927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer cache = linecache.cache 937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer save = {} 947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer for filename in cache.keys(): 957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if filename[:1] + filename[-1:] == '<>': 967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer save[filename] = cache[filename] 977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer orig_checkcache() 987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer cache.update(save) 996655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser 100818855939ac016492cb59d1fc2fea94cc0764855Kurt B. Kaiser# Patch linecache.checkcache(): 101818855939ac016492cb59d1fc2fea94cc0764855Kurt B. Kaiserlinecache.checkcache = extended_linecache_checkcache 1027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 10345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 1047aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass PyShellEditorWindow(EditorWindow): 105183403a271977a26c0b77dbcf62e19395c007288Kurt B. Kaiser "Regular text edit window in IDLE, supports breakpoints" 10645186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 1077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def __init__(self, *args): 10845186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser self.breakpoints = [] 109931237e2e66975c54e2ac6c5e503ee2992a22bcfRaymond Hettinger EditorWindow.__init__(self, *args) 1107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.bind("<<set-breakpoint-here>>", self.set_breakpoint_here) 11145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser self.text.bind("<<clear-breakpoint-here>>", self.clear_breakpoint_here) 1127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.bind("<<open-python-shell>>", self.flist.open_shell) 1137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 114bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser self.breakpointPath = os.path.join(idleConf.GetUserCfgDir(), 115bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser 'breakpoints.lst') 116a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey # whenever a file is changed, restore breakpoints 117a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey if self.io.filename: self.restore_file_breaks() 118bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser def filename_changed_hook(old_hook=self.io.filename_change_hook, 119bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser self=self): 120a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey self.restore_file_breaks() 121a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey old_hook() 122a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey self.io.set_filename_change_hook(filename_changed_hook) 123a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey 12445186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser rmenu_specs = [("Set Breakpoint", "<<set-breakpoint-here>>"), 12545186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser ("Clear Breakpoint", "<<clear-breakpoint-here>>")] 1267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 127a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey def set_breakpoint(self, lineno): 12845186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser text = self.text 12945186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser filename = self.io.filename 130a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey text.tag_add("BREAK", "%d.0" % lineno, "%d.0" % (lineno+1)) 13145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser try: 13245186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser i = self.breakpoints.index(lineno) 133a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey except ValueError: # only add if missing, i.e. do once 13445186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser self.breakpoints.append(lineno) 13545186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser try: # update the subprocess debugger 13645186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debug = self.flist.pyshell.interp.debugger 13745186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debug.set_breakpoint_here(filename, lineno) 13845186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser except: # but debugger may not be active right now.... 13945186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser pass 1407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 141a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey def set_breakpoint_here(self, event=None): 142a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey text = self.text 143a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey filename = self.io.filename 144a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey if not filename: 145a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey text.bell() 146a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey return 147a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey lineno = int(float(text.index("insert"))) 148a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey self.set_breakpoint(lineno) 149a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey 150669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser def clear_breakpoint_here(self, event=None): 15145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser text = self.text 15245186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser filename = self.io.filename 15345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser if not filename: 15445186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser text.bell() 155669f4c3850eaaf4e00a79032ef960a79e6ca6ad7Kurt B. Kaiser return 15645186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser lineno = int(float(text.index("insert"))) 15745186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser try: 15845186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser self.breakpoints.remove(lineno) 15945186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser except: 16045186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser pass 16145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser text.tag_remove("BREAK", "insert linestart",\ 16245186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser "insert lineend +1char") 16345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser try: 16445186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debug = self.flist.pyshell.interp.debugger 16545186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debug.clear_breakpoint_here(filename, lineno) 16645186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser except: 16745186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser pass 16845186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 16945186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser def clear_file_breaks(self): 17045186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser if self.breakpoints: 17145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser text = self.text 17245186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser filename = self.io.filename 17345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser if not filename: 17445186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser text.bell() 17545186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser return 17645186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser self.breakpoints = [] 17745186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser text.tag_remove("BREAK", "1.0", END) 17845186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser try: 17945186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debug = self.flist.pyshell.interp.debugger 18045186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debug.clear_file_breaks(filename) 18145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser except: 18245186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser pass 18345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 184a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey def store_file_breaks(self): 185bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser "Save breakpoints when file is saved" 186bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # XXX 13 Dec 2002 KBK Currently the file must be saved before it can 187bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # be run. The breaks are saved at that time. If we introduce 188bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # a temporary file save feature the save breaks functionality 189bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # needs to be re-verified, since the breaks at the time the 190bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # temp file is created may differ from the breaks at the last 1917f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser # permanent save of the file. Currently, a break introduced 1927f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser # after a save will be effective, but not persistent. 1937f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser # This is necessary to keep the saved breaks synched with the 1947f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser # saved file. 195bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # 196bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # Breakpoints are set as tagged ranges in the text. Certain 197bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # kinds of edits cause these ranges to be deleted: Inserting 198bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # or deleting a line just before a breakpoint, and certain 199bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # deletions prior to a breakpoint. These issues need to be 200bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # investigated and understood. It's not clear if they are 201bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # Tk issues or IDLE issues, or whether they can actually 202bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # be fixed. Since a modified file has to be saved before it is 203bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # run, and since self.breakpoints (from which the subprocess 204bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # debugger is loaded) is updated during the save, the visible 205bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # breaks stay synched with the subprocess even if one of these 206bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser # unexpected breakpoint deletions occurs. 207bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser breaks = self.breakpoints 208bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser filename = self.io.filename 209a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey try: 210bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser lines = open(self.breakpointPath,"r").readlines() 211a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey except IOError: 212bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser lines = [] 213bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser new_file = open(self.breakpointPath,"w") 214a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey for line in lines: 215bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser if not line.startswith(filename + '='): 216a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey new_file.write(line) 217bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser self.update_breakpoints() 218bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser breaks = self.breakpoints 219bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser if breaks: 220bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser new_file.write(filename + '=' + str(breaks) + '\n') 221a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey new_file.close() 222a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey 223a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey def restore_file_breaks(self): 224a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey self.text.update() # this enables setting "BREAK" tags to be visible 225bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser filename = self.io.filename 226bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser if filename is None: 227bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser return 22869371d6530cf6a14742e3d907dcbe03de06f8406Chui Tey if os.path.isfile(self.breakpointPath): 229bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser lines = open(self.breakpointPath,"r").readlines() 23069371d6530cf6a14742e3d907dcbe03de06f8406Chui Tey for line in lines: 231bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser if line.startswith(filename + '='): 2326655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser breakpoint_linenumbers = eval(line[len(filename)+1:]) 23369371d6530cf6a14742e3d907dcbe03de06f8406Chui Tey for breakpoint_linenumber in breakpoint_linenumbers: 23469371d6530cf6a14742e3d907dcbe03de06f8406Chui Tey self.set_breakpoint(breakpoint_linenumber) 235a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey 236bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser def update_breakpoints(self): 237bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser "Retrieves all the breakpoints in the current window" 238a2adb0f6d99124101adbeac017b2d5623ad864baChui Tey text = self.text 239bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser ranges = text.tag_ranges("BREAK") 240bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser linenumber_list = self.ranges_to_linenumbers(ranges) 241bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser self.breakpoints = linenumber_list 242bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser 243bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser def ranges_to_linenumbers(self, ranges): 244bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser lines = [] 245bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser for index in range(0, len(ranges), 2): 246bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser lineno = int(float(ranges[index])) 247bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser end = int(float(ranges[index+1])) 248bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser while lineno < end: 249bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser lines.append(lineno) 250bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser lineno += 1 251bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser return lines 252bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser 25311220fad1d7eee24f1d9809c6d5023875099cb37Kurt B. Kaiser# XXX 13 Dec 2002 KBK Not used currently 254bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser# def saved_change_hook(self): 255bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser# "Extend base method - clear breaks if module is modified" 256bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser# if not self.get_saved(): 257bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser# self.clear_file_breaks() 258bfed346259b27a51153b1f1bf5e4f062247e6246Kurt B. Kaiser# EditorWindow.saved_change_hook(self) 25945186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 26045186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser def _close(self): 26145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser "Extend base method - clear breaks when module is closed" 26245186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser self.clear_file_breaks() 26345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser EditorWindow._close(self) 2646655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser 2657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 2667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass PyShellFileList(FileList): 267183403a271977a26c0b77dbcf62e19395c007288Kurt B. Kaiser "Extend base class: IDLE supports a shell and breakpoints" 2687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 269183403a271977a26c0b77dbcf62e19395c007288Kurt B. Kaiser # override FileList's class variable, instances return PyShellEditorWindow 270183403a271977a26c0b77dbcf62e19395c007288Kurt B. Kaiser # instead of EditorWindow when new edit windows are created. 2717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer EditorWindow = PyShellEditorWindow 2727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 2737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pyshell = None 2747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 2757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def open_shell(self, event=None): 2767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.pyshell: 277183403a271977a26c0b77dbcf62e19395c007288Kurt B. Kaiser self.pyshell.top.wakeup() 2787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 2797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.pyshell = PyShell(self) 280af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser if self.pyshell: 281af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser if not self.pyshell.begin(): 282af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser return None 2837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return self.pyshell 2847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 2857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 2867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass ModifiedColorDelegator(ColorDelegator): 28783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class: colorizer for the shell window itself" 2886655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser 289b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava def __init__(self): 290b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava ColorDelegator.__init__(self) 291b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava self.LoadTagDefs() 2927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 2937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def recolorize_main(self): 2947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tag_remove("TODO", "1.0", "iomark") 2957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tag_add("SYNC", "1.0", "iomark") 2967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ColorDelegator.recolorize_main(self) 2976655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser 298b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava def LoadTagDefs(self): 299b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava ColorDelegator.LoadTagDefs(self) 300b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava theme = idleConf.GetOption('main','Theme','name') 301b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava self.tagdefs.update({ 302b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "stdin": {'background':None,'foreground':None}, 303b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "stdout": idleConf.GetHighlight(theme, "stdout"), 304b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "stderr": idleConf.GetHighlight(theme, "stderr"), 305b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava "console": idleConf.GetHighlight(theme, "console"), 306b77d343bc846c2049a4cffb1dfd65eb49d1728b4Steven M. Gava }) 3077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass ModifiedUndoDelegator(UndoDelegator): 30983118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class: forbid insert/delete before the I/O mark" 3107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def insert(self, index, chars, tags=None): 3127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 3137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.delegate.compare(index, "<", "iomark"): 3147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.delegate.bell() 3157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 3167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except TclError: 3177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 3187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer UndoDelegator.insert(self, index, chars, tags) 3197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def delete(self, index1, index2=None): 3217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 3227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.delegate.compare(index1, "<", "iomark"): 3237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.delegate.bell() 3247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 3257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except TclError: 3267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 3277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer UndoDelegator.delete(self, index1, index2) 3287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 32967fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser 33067fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiserclass MyRPCClient(rpc.RPCClient): 33167fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser 33267fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser def handle_EOF(self): 33367fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser "Override the base class - just re-raise EOFError" 33467fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser raise EOFError 33567fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser 3368d1f11b0ef7ec31db75a4e640e9dfd75fc4ee08dKurt B. Kaiser 3377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass ModifiedInterpreter(InteractiveInterpreter): 3387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 3397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def __init__(self, tkconsole): 3407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole = tkconsole 3417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer locals = sys.modules['__main__'].__dict__ 3427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer InteractiveInterpreter.__init__(self, locals=locals) 34394bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser self.save_warnings_filters = None 3446f805942290b8d83f0e229de98c8d0d7a2a7c3e8Kurt B. Kaiser self.restarting = False 34562df0448850000739edd1df8b4c0e702119d476eKurt B. Kaiser self.subprocess_arglist = self.build_subprocess_arglist() 3467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 34763857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser port = 8833 3485d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey rpcclt = None 3495d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey rpcpid = None 3505d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 3516655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser def spawn_subprocess(self): 35262df0448850000739edd1df8b4c0e702119d476eKurt B. Kaiser args = self.subprocess_arglist 353b785518d051dab322feafaed0fc79d7218ce6cb0Kurt B. Kaiser self.rpcpid = os.spawnv(os.P_NOWAIT, sys.executable, args) 35463857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser 355f53dec2e4e8a017641db4de73456a2724a75e64bTony Lownds def build_subprocess_arglist(self): 3562398d578a367aa0f9155afb7275a5aec4e5caef9Tony Lownds w = ['-W' + s for s in sys.warnoptions] 357d076153ee8a9e4e2e7ecd3ff77fdb3b7aaf7ef77Georg Brandl if 1/2 > 0: # account for new division 358d076153ee8a9e4e2e7ecd3ff77fdb3b7aaf7ef77Georg Brandl w.append('-Qnew') 3592398d578a367aa0f9155afb7275a5aec4e5caef9Tony Lownds # Maybe IDLE is installed and is being accessed via sys.path, 3602398d578a367aa0f9155afb7275a5aec4e5caef9Tony Lownds # or maybe it's not installed and the idle.py script is being 3612398d578a367aa0f9155afb7275a5aec4e5caef9Tony Lownds # run from the IDLE source directory. 36262df0448850000739edd1df8b4c0e702119d476eKurt B. Kaiser del_exitf = idleConf.GetOption('main', 'General', 'delete-exitfunc', 36362df0448850000739edd1df8b4c0e702119d476eKurt B. Kaiser default=False, type='bool') 3642398d578a367aa0f9155afb7275a5aec4e5caef9Tony Lownds if __name__ == 'idlelib.PyShell': 36570a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald command = "__import__('idlelib.run').run.main(%r)" % (del_exitf,) 366f2324b9e8964a7aef964ae6168827ad300f920d6Tony Lownds else: 36770a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald command = "__import__('run').main(%r)" % (del_exitf,) 368b785518d051dab322feafaed0fc79d7218ce6cb0Kurt B. Kaiser if sys.platform[:3] == 'win' and ' ' in sys.executable: 369b785518d051dab322feafaed0fc79d7218ce6cb0Kurt B. Kaiser # handle embedded space in path by quoting the argument 370b785518d051dab322feafaed0fc79d7218ce6cb0Kurt B. Kaiser decorated_exec = '"%s"' % sys.executable 371b785518d051dab322feafaed0fc79d7218ce6cb0Kurt B. Kaiser else: 372b785518d051dab322feafaed0fc79d7218ce6cb0Kurt B. Kaiser decorated_exec = sys.executable 373b785518d051dab322feafaed0fc79d7218ce6cb0Kurt B. Kaiser return [decorated_exec] + w + ["-c", command, str(self.port)] 374f2324b9e8964a7aef964ae6168827ad300f920d6Tony Lownds 37563857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser def start_subprocess(self): 376af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser # spawning first avoids passing a listening socket to the subprocess 377af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.spawn_subprocess() 378af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser #time.sleep(20) # test to simulate GUI not accepting connection 37924d7e0cbb8b978738f223d4bb6cb184054d72e18Kurt B. Kaiser addr = (LOCALHOST, self.port) 3808dcdb77132563c734c228e815498c47e487f95cfKurt B. Kaiser # Idle starts listening for connection on localhost 3815db4843c5e7d2b420b9ca9189b9e30669b62e55eKurt B. Kaiser for i in range(3): 3825d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey time.sleep(i) 3835d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey try: 38467fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser self.rpcclt = MyRPCClient(addr) 3855d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey break 3865d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey except socket.error, err: 387af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser pass 3885d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey else: 389af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.display_port_binding_error() 390af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser return None 391b417936d4080004b6a7811fb411c6f77db4cc262Kurt B. Kaiser # Accept the connection from the Python execution server 392af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.rpcclt.listening_sock.settimeout(10) 393af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser try: 394af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.rpcclt.accept() 395af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser except socket.timeout, err: 396af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.display_no_subprocess_error() 397af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser return None 398969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser self.rpcclt.register("stdin", self.tkconsole) 399969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser self.rpcclt.register("stdout", self.tkconsole.stdout) 400969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser self.rpcclt.register("stderr", self.tkconsole.stderr) 4015d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.rpcclt.register("flist", self.tkconsole.flist) 4028cd0def10dc028e3522a04bd136c67f92f90da04Kurt B. Kaiser self.rpcclt.register("linecache", linecache) 4039f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser self.rpcclt.register("interp", self) 404f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser self.transfer_path() 4055d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.poll_subprocess() 406af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser return self.rpcclt 4075d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 40863857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser def restart_subprocess(self): 4096f805942290b8d83f0e229de98c8d0d7a2a7c3e8Kurt B. Kaiser if self.restarting: 410af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser return self.rpcclt 4116f805942290b8d83f0e229de98c8d0d7a2a7c3e8Kurt B. Kaiser self.restarting = True 41263857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser # close only the subprocess debugger 41345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debug = self.getdebugger() 41445186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser if debug: 415003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser try: 4169ec454ec00088e051195e80363499a14cafc131aKurt B. Kaiser # Only close subprocess debugger, don't unregister gui_adap! 417003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser RemoteDebugger.close_subprocess_debugger(self.rpcclt) 418003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser except: 419003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser pass 420003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser # Kill subprocess, spawn a new one, accept connection. 421a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser self.rpcclt.close() 422a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser self.unix_terminate() 4237f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser console = self.tkconsole 4246f805942290b8d83f0e229de98c8d0d7a2a7c3e8Kurt B. Kaiser was_executing = console.executing 4257f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser console.executing = False 42663857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser self.spawn_subprocess() 427af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser try: 428af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.rpcclt.accept() 429af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser except socket.timeout, err: 430af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.display_no_subprocess_error() 431af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser return None 432f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser self.transfer_path() 4331061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser # annotate restart in shell window and mark it 4344cc5ef5dbe12cbc9dc1a00c7583ffd0117f4c31eKurt B. Kaiser console.text.delete("iomark", "end-1c") 4356f805942290b8d83f0e229de98c8d0d7a2a7c3e8Kurt B. Kaiser if was_executing: 4366f805942290b8d83f0e229de98c8d0d7a2a7c3e8Kurt B. Kaiser console.write('\n') 4376f805942290b8d83f0e229de98c8d0d7a2a7c3e8Kurt B. Kaiser console.showprompt() 4381061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser halfbar = ((int(console.width) - 16) // 2) * '=' 4391061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser console.write(halfbar + ' RESTART ' + halfbar) 4401061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser console.text.mark_set("restart", "end-1c") 4411061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser console.text.mark_gravity("restart", "left") 4427f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser console.showprompt() 443003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser # restart subprocess debugger 44445186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser if debug: 4459ec454ec00088e051195e80363499a14cafc131aKurt B. Kaiser # Restarted debugger connects to current instance of debug GUI 44663857a454d85fda475264575b7c1a031970219a0Kurt B. Kaiser gui = RemoteDebugger.restart_subprocess_debugger(self.rpcclt) 44745186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser # reload remote debugger breakpoints for all PyShellEditWindows 44845186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debug.load_breakpoints() 4496f805942290b8d83f0e229de98c8d0d7a2a7c3e8Kurt B. Kaiser self.restarting = False 450af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser return self.rpcclt 45145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 452003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser def __request_interrupt(self): 453a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser self.rpcclt.remotecall("exec", "interrupt_the_server", (), {}) 454003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser 455003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser def interrupt_subprocess(self): 456a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser threading.Thread(target=self.__request_interrupt).start() 457003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser 458a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser def kill_subprocess(self): 459af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser try: 460af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.rpcclt.close() 461af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser except AttributeError: # no socket 462af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser pass 463a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser self.unix_terminate() 464a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser self.tkconsole.executing = False 465a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser self.rpcclt = None 46611c53e2ea7f7d2a2969c98e81c1489c4e72254c4Kurt B. Kaiser 467a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser def unix_terminate(self): 468a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser "UNIX: make sure subprocess is terminated and collect status" 469a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser if hasattr(os, 'kill'): 470a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser try: 471a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser os.kill(self.rpcpid, SIGTERM) 472a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser except OSError: 473a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser # process already terminated: 474a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser return 475a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser else: 476a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser try: 477a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser os.waitpid(self.rpcpid, 0) 478a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser except OSError: 479a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser return 48011c53e2ea7f7d2a2969c98e81c1489c4e72254c4Kurt B. Kaiser 481f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser def transfer_path(self): 482f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser self.runcommand("""if 1: 483f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser import sys as _sys 48470a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald _sys.path = %r 485f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser del _sys 48670a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald \n""" % (sys.path,)) 487f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 4885d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey active_seq = None 4895d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 4905d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def poll_subprocess(self): 4915d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey clt = self.rpcclt 4925d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if clt is None: 4935d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 494003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser try: 495a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser response = clt.pollresponse(self.active_seq, wait=0.05) 496a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser except (EOFError, IOError, KeyboardInterrupt): 497a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser # lost connection or subprocess terminated itself, restart 498a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser # [the KBI is from rpc.SocketIO.handle_EOF()] 49967fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser if self.tkconsole.closing: 50067fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser return 501003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser response = None 502003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser self.restart_subprocess() 5035d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if response: 5045d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.resetoutput() 5055d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.active_seq = None 5065d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey how, what = response 507bc2861313cc53711d837a0e8a5bf303bf5291bf3Kurt B. Kaiser console = self.tkconsole.console 5085d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if how == "OK": 5095d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if what is not None: 51070a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald print >>console, repr(what) 5115d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey elif how == "EXCEPTION": 5125d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"): 5135d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.remote_stack_viewer() 5145d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey elif how == "ERROR": 5150930c43e43f79617a33a6c3be32afbe184780307Kurt B. Kaiser errmsg = "PyShell.ModifiedInterpreter: Subprocess ERROR:\n" 5160930c43e43f79617a33a6c3be32afbe184780307Kurt B. Kaiser print >>sys.__stderr__, errmsg, what 517bc2861313cc53711d837a0e8a5bf303bf5291bf3Kurt B. Kaiser print >>console, errmsg, what 518bc2861313cc53711d837a0e8a5bf303bf5291bf3Kurt B. Kaiser # we received a response to the currently active seq number: 519d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser try: 520d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser self.tkconsole.endexecuting() 521d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser except AttributeError: # shell may have closed 522d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser pass 52388957d8d0d9bf6d45603171927aa82d921bf9697Kurt B. Kaiser # Reschedule myself 52488957d8d0d9bf6d45603171927aa82d921bf9697Kurt B. Kaiser if not self.tkconsole.closing: 52588957d8d0d9bf6d45603171927aa82d921bf9697Kurt B. Kaiser self.tkconsole.text.after(self.tkconsole.pollinterval, 52688957d8d0d9bf6d45603171927aa82d921bf9697Kurt B. Kaiser self.poll_subprocess) 5275d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 52845186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser debugger = None 52945186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 53045186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser def setdebugger(self, debugger): 53145186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser self.debugger = debugger 53245186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 53345186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser def getdebugger(self): 53445186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser return self.debugger 53545186c4ce08093d5f0d2f141f6e557e9726aedb4Kurt B. Kaiser 5369f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser def open_remote_stack_viewer(self): 5379f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser """Initiate the remote stack viewer from a separate thread. 5389f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser 5399f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser This method is called from the subprocess, and by returning from this 5409f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser method we allow the subprocess to unblock. After a bit the shell 5419f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser requests the subprocess to open the remote stack viewer which returns a 5429f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser static object looking at the last exceptiopn. It is queried through 5439f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser the RPC mechanism. 5449f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser 5459f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser """ 5469f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser self.tkconsole.text.after(300, self.remote_stack_viewer) 5479f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser return 5489f3660972003dddcc1cced41934488513e277220Kurt B. Kaiser 5495d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def remote_stack_viewer(self): 5505d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey import RemoteObjectBrowser 551a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser oid = self.rpcclt.remotequeue("exec", "stackviewer", ("flist",), {}) 5525d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if oid is None: 5535d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.root.bell() 5545d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 5555d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey item = RemoteObjectBrowser.StubObjectTreeItem(self.rpcclt, oid) 5565d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey from TreeWidget import ScrolledCanvas, TreeNode 5575d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey top = Toplevel(self.tkconsole.root) 55873360a3e61274ffcc4c9fc3d09746bd6603e92a5Kurt B. Kaiser theme = idleConf.GetOption('main','Theme','name') 55973360a3e61274ffcc4c9fc3d09746bd6603e92a5Kurt B. Kaiser background = idleConf.GetHighlight(theme, 'normal')['background'] 56073360a3e61274ffcc4c9fc3d09746bd6603e92a5Kurt B. Kaiser sc = ScrolledCanvas(top, bg=background, highlightthickness=0) 5615d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sc.frame.pack(expand=1, fill="both") 5625d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey node = TreeNode(sc.canvas, None, item) 5635d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey node.expand() 5645d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey # XXX Should GC the remote tree when closing the window 5655d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 5667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer gid = 0 5677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def execsource(self, source): 56983118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Like runsource() but assumes complete exec source" 5707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer filename = self.stuffsource(source) 5717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.execfile(filename, source) 5727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def execfile(self, filename, source=None): 57483118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Execute an existing file" 5757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if source is None: 5767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer source = open(filename, "r").read() 5777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 5787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer code = compile(source, filename, "exec") 5797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except (OverflowError, SyntaxError): 5807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.resetoutput() 5817f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser tkerr = self.tkconsole.stderr 5827f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser print>>tkerr, '*** Error in script or command!\n' 5837f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser print>>tkerr, 'Traceback (most recent call last):' 5847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer InteractiveInterpreter.showsyntaxerror(self, filename) 5856e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser self.tkconsole.showprompt() 5867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 5877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.runcode(code) 5887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 5897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def runsource(self, source): 59083118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class method: Stuff the source in the line cache first" 5917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer filename = self.stuffsource(source) 5927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.more = 0 59394bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser self.save_warnings_filters = warnings.filters[:] 59494bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser warnings.filterwarnings(action="error", category=SyntaxWarning) 595837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser if isinstance(source, types.UnicodeType): 596837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser import IOBinding 597837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser try: 598837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser source = source.encode(IOBinding.encoding) 599837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser except UnicodeError: 600837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser self.tkconsole.resetoutput() 601cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser self.write("Unsupported characters in input\n") 602837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser return 60394bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser try: 604935ea9a0b291b2ce42a5cf02d9f2f2955e21a6aaKurt B. Kaiser # InteractiveInterpreter.runsource() calls its runcode() method, 605935ea9a0b291b2ce42a5cf02d9f2f2955e21a6aaKurt B. Kaiser # which is overridden (see below) 60694bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser return InteractiveInterpreter.runsource(self, source, filename) 60794bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser finally: 60894bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser if self.save_warnings_filters is not None: 60994bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser warnings.filters[:] = self.save_warnings_filters 61094bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser self.save_warnings_filters = None 6117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def stuffsource(self, source): 61383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Stuff source in the filename cache" 6147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer filename = "<pyshell#%d>" % self.gid 6157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.gid = self.gid + 1 616837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser lines = source.split("\n") 6177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer linecache.cache[filename] = len(source)+1, 0, lines, filename 6187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return filename 6196655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser 62011659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser def prepend_syspath(self, filename): 62111659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser "Prepend sys.path with file's directory if not already included" 62211659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser self.runcommand("""if 1: 62370a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald _filename = %r 62411659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser import sys as _sys 62511659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser from os.path import dirname as _dirname 62611659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser _dir = _dirname(_filename) 62711659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser if not _dir in _sys.path: 62811659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser _sys.path.insert(0, _dir) 62911659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser del _filename, _sys, _dirname, _dir 63070a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald \n""" % (filename,)) 63111659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser 6327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def showsyntaxerror(self, filename=None): 63383118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser """Extend base class method: Add Colorizing 63483118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser 63583118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser Color the offending position instead of printing it and pointing at it 63683118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser with a caret. 63783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser 63883118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser """ 6397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text = self.tkconsole.text 6407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer stuff = self.unpackerror() 6416e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser if stuff: 6426e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser msg, lineno, offset, line = stuff 6436e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser if lineno == 1: 6446e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser pos = "iomark + %d chars" % (offset-1) 6456e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser else: 6466e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser pos = "iomark linestart + %d lines + %d chars" % \ 6476e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser (lineno-1, offset-1) 6486e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser text.tag_add("ERROR", pos) 6496e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser text.see(pos) 6506e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser char = text.get(pos) 6516e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser if char and char in IDENTCHARS: 6526e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser text.tag_add("ERROR", pos + " wordstart", pos) 6537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.resetoutput() 6546e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser self.write("SyntaxError: %s\n" % str(msg)) 6557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 6566e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser self.tkconsole.resetoutput() 6576e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser InteractiveInterpreter.showsyntaxerror(self, filename) 6586e44cc236900c8f85164e543d0d3e7f429a1f1c8Kurt B. Kaiser self.tkconsole.showprompt() 6597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def unpackerror(self): 6617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer type, value, tb = sys.exc_info() 6627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ok = type is SyntaxError 6637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if ok: 6647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 6657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer msg, (dummy_filename, lineno, offset, line) = value 666bea57c6c355ba98cd9019d13e5adf7d715377edfKurt B. Kaiser if not offset: 667bea57c6c355ba98cd9019d13e5adf7d715377edfKurt B. Kaiser offset = 0 6687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 6697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ok = 0 6707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if ok: 6717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return msg, lineno, offset, line 6727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 6737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return None 6747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def showtraceback(self): 67683118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend base class method to reset output properly" 6777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tkconsole.resetoutput() 6787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.checklinecache() 6797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer InteractiveInterpreter.showtraceback(self) 6805d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.tkconsole.getvar("<<toggle-jit-stack-viewer>>"): 6815d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.tkconsole.open_stack_viewer() 6827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def checklinecache(self): 6847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer c = linecache.cache 6857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer for key in c.keys(): 6867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if key[:1] + key[-1:] != "<>": 6877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer del c[key] 6887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 6895d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey def runcommand(self, code): 69083118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Run the code without invoking the debugger" 6915d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey # The code better not raise an exception! 6925d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.tkconsole.executing: 693f4c4f115d80a26eb83d90593c24a1580f236c443Neal Norwitz self.display_executing_dialog() 6945d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 0 6955d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.rpcclt: 696a00050f209acf2201b2382f9d534a2595bacf5c3Kurt B. Kaiser self.rpcclt.remotequeue("exec", "runcode", (code,), {}) 6975d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey else: 6985d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey exec code in self.locals 6995d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return 1 7005d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 7017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def runcode(self, code): 70283118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Override base class method" 7035d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.tkconsole.executing: 704003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser self.interp.restart_subprocess() 7055d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.checklinecache() 70694bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser if self.save_warnings_filters is not None: 70794bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser warnings.filters[:] = self.save_warnings_filters 70894bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser self.save_warnings_filters = None 7097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer debugger = self.debugger 7107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 7117f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser self.tkconsole.beginexecuting() 712dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser if not debugger and self.rpcclt is not None: 713dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser self.active_seq = self.rpcclt.asyncqueue("exec", "runcode", 714dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser (code,), {}) 715dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser elif debugger: 716dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser debugger.run(code, self.locals) 717dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser else: 718dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser exec code in self.locals 719dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser except SystemExit: 720dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser if not self.tkconsole.closing: 721dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser if tkMessageBox.askyesno( 722dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser "Exit?", 723dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser "Do you want to exit altogether?", 724dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser default="yes", 725dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser master=self.tkconsole.text): 726f137e1df2c02f5782c5b0f18a2b3b649f255f63aKurt B. Kaiser raise 727dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser else: 728dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser self.showtraceback() 729dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser else: 730dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser raise 731dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser except: 732dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser if use_subprocess: 733dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser print >>self.tkconsole.stderr, \ 734dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser "IDLE internal error in runcode()" 7357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showtraceback() 736dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser self.tkconsole.endexecuting() 737dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser else: 738dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser if self.tkconsole.canceled: 739dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser self.tkconsole.canceled = False 740dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser print >>self.tkconsole.stderr, "KeyboardInterrupt" 741dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser else: 742dddeb0eec4dcb1ba3c408a54ad01e1a1ea4d5670Kurt B. Kaiser self.showtraceback() 7437f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser finally: 7447f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser if not use_subprocess: 745d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser try: 746d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser self.tkconsole.endexecuting() 747d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser except AttributeError: # shell may have closed 748d112bc7958151fa17c4ccb27413c43e45b8476fbKurt B. Kaiser pass 7497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 7507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def write(self, s): 75183118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Override base class method" 7527f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser self.tkconsole.stderr.write(s) 7537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 754af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser def display_port_binding_error(self): 755af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser tkMessageBox.showerror( 756af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "Port Binding Error", 757af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "IDLE can't bind TCP/IP port 8833, which is necessary to " 758af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "communicate with its Python execution server. Either " 759af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "no networking is installed on this computer or another " 760af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "process (another IDLE?) is using the port. Run IDLE with the -n " 761af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "command line switch to start without a subprocess and refer to " 762af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "Help/IDLE Help 'Running without a subprocess' for further " 763af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "details.", 764af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser master=self.tkconsole.text) 765af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser 766af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser def display_no_subprocess_error(self): 767af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser tkMessageBox.showerror( 768af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "Subprocess Startup Error", 769af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "IDLE's subprocess didn't make connection. Either IDLE can't " 770af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "start a subprocess or personal firewall software is blocking " 771af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "the connection.", 772af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser master=self.tkconsole.text) 773af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser 774af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser def display_executing_dialog(self): 775af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser tkMessageBox.showerror( 776af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "Already executing", 777af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "The Python Shell window is already executing a command; " 778af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser "please wait until it is finished.", 779af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser master=self.tkconsole.text) 780af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser 781af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser 7827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererclass PyShell(OutputWindow): 7837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 7847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer shell_title = "Python Shell" 7857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 7867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Override classes 7877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer ColorDelegator = ModifiedColorDelegator 7887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer UndoDelegator = ModifiedUndoDelegator 7897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 790f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser # Override menus 791dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser menu_specs = [ 792dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("file", "_File"), 793dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("edit", "_Edit"), 7944cc5ef5dbe12cbc9dc1a00c7583ffd0117f4c31eKurt B. Kaiser ("debug", "_Debug"), 7951061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser ("options", "_Options"), 796dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("windows", "_Windows"), 797dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ("help", "_Help"), 798dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser ] 7997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 80019302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren if macosxSupport.runningAsOSXApp(): 80119302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren del menu_specs[-3] 80219302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren menu_specs[-2] = ("windows", "_Window") 80319302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren 80419302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren 8057aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # New classes 8067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer from IdleHistory import History 8077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def __init__(self, flist=None): 8098f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser if use_subprocess: 81067fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser ms = self.menu_specs 81167fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser if ms[2][0] != "shell": 8127ae354846fff616746eeba6d27ccd5c175591caeKurt B. Kaiser ms.insert(2, ("shell", "She_ll")) 8137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.interp = ModifiedInterpreter(self) 8147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if flist is None: 8157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer root = Tk() 8167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer fixwordbreaks(root) 8177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer root.withdraw() 8187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer flist = PyShellFileList(root) 8195afa1dfb72311b8360904363cc3ebb7cbfc8b6e4Kurt B. Kaiser # 8207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer OutputWindow.__init__(self, flist, None, None) 8215afa1dfb72311b8360904363cc3ebb7cbfc8b6e4Kurt B. Kaiser # 8226af44986029c84c4c5df62a64c60a6ed978a3693Kurt B. Kaiser## self.config(usetabs=1, indentwidth=8, context_use_ps1=1) 8236af44986029c84c4c5df62a64c60a6ed978a3693Kurt B. Kaiser self.usetabs = True 8246af44986029c84c4c5df62a64c60a6ed978a3693Kurt B. Kaiser # indentwidth must be 8 when using tabs. See note in EditorWindow: 8256af44986029c84c4c5df62a64c60a6ed978a3693Kurt B. Kaiser self.indentwidth = 8 8266af44986029c84c4c5df62a64c60a6ed978a3693Kurt B. Kaiser self.context_use_ps1 = True 8275afa1dfb72311b8360904363cc3ebb7cbfc8b6e4Kurt B. Kaiser # 8287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text = self.text 8297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.configure(wrap="char") 8307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<newline-and-indent>>", self.enter_callback) 8317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<plain-newline-and-indent>>", self.linefeed_callback) 8327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<interrupt-execution>>", self.cancel_callback) 8337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<end-of-file>>", self.eof_callback) 8347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<open-stack-viewer>>", self.open_stack_viewer) 83557bfe5dc5a4873026679fb911939beb69e35a9e8Kurt B. Kaiser text.bind("<<toggle-debugger>>", self.toggle_debugger) 8367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer text.bind("<<toggle-jit-stack-viewer>>", self.toggle_jit_stack_viewer) 8378f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser if use_subprocess: 8388f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser text.bind("<<view-restart>>", self.view_restart_mark) 8398f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser text.bind("<<restart-shell>>", self.restart_shell) 8405afa1dfb72311b8360904363cc3ebb7cbfc8b6e4Kurt B. Kaiser # 8417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.save_stdout = sys.stdout 8427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.save_stderr = sys.stderr 8437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.save_stdin = sys.stdin 844bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis import IOBinding 845bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis self.stdout = PseudoFile(self, "stdout", IOBinding.encoding) 846bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis self.stderr = PseudoFile(self, "stderr", IOBinding.encoding) 847bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis self.console = PseudoFile(self, "console", IOBinding.encoding) 8485d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if not use_subprocess: 8495d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sys.stdout = self.stdout 8505d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sys.stderr = self.stderr 8515d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sys.stdin = self 8525afa1dfb72311b8360904363cc3ebb7cbfc8b6e4Kurt B. Kaiser # 8537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.history = self.History(self.text) 8545afa1dfb72311b8360904363cc3ebb7cbfc8b6e4Kurt B. Kaiser # 85588957d8d0d9bf6d45603171927aa82d921bf9697Kurt B. Kaiser self.pollinterval = 50 # millisec 8565d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 8574d5bc6031ca883201f87e0e3c94e5746f9f91439Kurt B. Kaiser def get_standard_extension_names(self): 8584d5bc6031ca883201f87e0e3c94e5746f9f91439Kurt B. Kaiser return idleConf.GetExtensions(shell_only=True) 8594d5bc6031ca883201f87e0e3c94e5746f9f91439Kurt B. Kaiser 860003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser reading = False 861003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser executing = False 862003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser canceled = False 863003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser endoffile = False 864003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser closing = False 8657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 86649a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser def set_warning_stream(self, stream): 867d91614234375621f3b78cb9c8c5a58b77c961fe8Skip Montanaro global warning_stream 868d91614234375621f3b78cb9c8c5a58b77c961fe8Skip Montanaro warning_stream = stream 86949a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser 87049a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser def get_warning_stream(self): 87149a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser return warning_stream 87249a5fe107fceb0239d87119842b20a7421043b5aKurt B. Kaiser 8737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def toggle_debugger(self, event=None): 8747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.executing: 8757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer tkMessageBox.showerror("Don't debug now", 8767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "You can only toggle the debugger when idle", 8777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer master=self.text) 8787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.set_debugger_indicator() 8797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 8807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 8817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer db = self.interp.getdebugger() 8827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if db: 8837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.close_debugger() 8847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 8857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.open_debugger() 8867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def set_debugger_indicator(self): 8887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer db = self.interp.getdebugger() 8897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.setvar("<<toggle-debugger>>", not not db) 8907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8911061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser def toggle_jit_stack_viewer(self, event=None): 8927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass # All we need is the variable 8937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 8947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def close_debugger(self): 8957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer db = self.interp.getdebugger() 8967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if db: 8977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.interp.setdebugger(None) 8987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer db.close() 899ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiser if self.interp.rpcclt: 900ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiser RemoteDebugger.close_remote_debugger(self.interp.rpcclt) 9017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 9027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.console.write("[DEBUG OFF]\n") 9037aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.ps1 = ">>> " 9047aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showprompt() 9057aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.set_debugger_indicator() 9067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 9077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def open_debugger(self): 9085d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.interp.rpcclt: 9097f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser dbg_gui = RemoteDebugger.start_remote_debugger(self.interp.rpcclt, 9107f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser self) 9117f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser else: 9127f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser dbg_gui = Debugger.Debugger(self) 9137f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser self.interp.setdebugger(dbg_gui) 9147f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser dbg_gui.load_breakpoints() 9155d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey sys.ps1 = "[DEBUG ON]\n>>> " 9165d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.showprompt() 9175d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.set_debugger_indicator() 9185d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey 9197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def beginexecuting(self): 920ffd3a4217a557bad4984621c22f5ae312d708169Kurt B. Kaiser "Helper for ModifiedInterpreter" 9217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 9227aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.executing = 1 9237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 9247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def endexecuting(self): 92583118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Helper for ModifiedInterpreter" 9267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.executing = 0 9277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 9285d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.showprompt() 9297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 9307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def close(self): 93183118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend EditorWindow.close()" 9327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.executing: 933003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser response = tkMessageBox.askokcancel( 9347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "Kill?", 935003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser "The program is still running!\n Do you want to kill it?", 9367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer default="ok", 9377f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser parent=self.text) 9385b63acd31e0e40c1a9a9e9762905b0054ff37994Benjamin Peterson if response is False: 9397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "cancel" 9405c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser if self.reading: 9415c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser self.top.quit() 9425c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser self.canceled = True 94367fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser self.closing = True 94467fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser # Wait for poll_subprocess() rescheduling to stop 94567fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser self.text.after(2 * self.pollinterval, self.close2) 94688957d8d0d9bf6d45603171927aa82d921bf9697Kurt B. Kaiser 94788957d8d0d9bf6d45603171927aa82d921bf9697Kurt B. Kaiser def close2(self): 94888957d8d0d9bf6d45603171927aa82d921bf9697Kurt B. Kaiser return EditorWindow.close(self) 9497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 9507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def _close(self): 95183118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Extend EditorWindow._close(), shut down debugger and execution server" 9527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.close_debugger() 9537f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser if use_subprocess: 9547f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser self.interp.kill_subprocess() 9557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Restore std streams 9567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.stdout = self.save_stdout 9577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.stderr = self.save_stderr 9587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.stdin = self.save_stdin 9597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Break cycles 9607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.interp = None 9617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.console = None 9627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.flist.pyshell = None 9637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.history = None 96483118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser EditorWindow._close(self) 9657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 9667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def ispythonsource(self, filename): 96783118c6cb36cf9a424bec1b9a2ef8c8760bae8f5Kurt B. Kaiser "Override EditorWindow method: never remove the colorizer" 968837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser return True 9697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 9707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def short_title(self): 9717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return self.shell_title 9727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 97394bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser COPYRIGHT = \ 9748f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser 'Type "copyright", "credits" or "license()" for more information.' 97594bd77415fc44ada4ceba856a81fe029c12bf313Kurt B. Kaiser 9767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def begin(self): 9777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 9787f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser if use_subprocess: 9797f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser nosub = '' 980af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser client = self.interp.start_subprocess() 981af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser if not client: 982af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser self.close() 9837663729ec72f5ffe44b8e7f76bdb56d8663c5e6eKurt B. Kaiser return False 9847f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser else: 9857f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser nosub = "==== No Subprocess ====" 986bf3f69ee85d3c497bfdeae3ac3338c1409ca454cRaymond Hettinger self.write("Python %s on %s\n%s\n%s" % 987bf3f69ee85d3c497bfdeae3ac3338c1409ca454cRaymond Hettinger (sys.version, sys.platform, self.COPYRIGHT, nosub)) 9887aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showprompt() 9896634bf2919d855ccd821e878b8cc00c7209f1cbeGeorg Brandl import Tkinter 9906634bf2919d855ccd821e878b8cc00c7209f1cbeGeorg Brandl Tkinter._default_root = None # 03Jan04 KBK What's this? 9917663729ec72f5ffe44b8e7f76bdb56d8663c5e6eKurt B. Kaiser return True 9927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 9937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def readline(self): 9947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer save = self.reading 9957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 9967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.reading = 1 9975c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser self.top.mainloop() # nested mainloop() 9987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer finally: 9997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.reading = save 10007aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer line = self.text.get("iomark", "end-1c") 10015c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser if len(line) == 0: # may be EOF if we quit our mainloop with Ctrl-C 10025c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser line = "\n" 1003bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis if isinstance(line, unicode): 1004bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis import IOBinding 1005bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis try: 1006bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis line = line.encode(IOBinding.encoding) 1007bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis except UnicodeError: 1008bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis pass 10097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 10107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.canceled: 10117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 10125c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser if not use_subprocess: 10135c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser raise KeyboardInterrupt 10147aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.endoffile: 10157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.endoffile = 0 10165c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser line = "" 10177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return line 10187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 10197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def isatty(self): 1020837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser return True 10217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1022003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser def cancel_callback(self, event=None): 10237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 10247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("sel.first", "!=", "sel.last"): 10257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # Active selection -- always use default binding 10267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 10277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 10287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not (self.executing or self.reading): 10297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 10307f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser self.interp.write("KeyboardInterrupt\n") 10317aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.showprompt() 10327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 10337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.endoffile = 0 1034003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser self.canceled = 1 10355c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser if (self.executing and self.interp.rpcclt): 103667fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser if self.interp.getdebugger(): 103767fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser self.interp.restart_subprocess() 103867fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser else: 103967fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser self.interp.interrupt_subprocess() 10405c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser if self.reading: 10415c3df35b6b1f48cb48c91b0c7a8754590a694171Kurt B. Kaiser self.top.quit() # exit the nested mainloop() in readline() 10427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 10437aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 10447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def eof_callback(self, event): 10457aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.executing and not self.reading: 10467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # Let the default binding (delete next char) take over 10477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not (self.text.compare("iomark", "==", "insert") and 10487aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.compare("insert", "==", "end-1c")): 10497aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # Let the default binding (delete next char) take over 10507aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if not self.executing: 10517aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 10527aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.close() 10537aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 10547aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 10557aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.endoffile = 1 10567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.top.quit() 10577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 10587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 10597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def linefeed_callback(self, event): 10607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Insert a linefeed without entering anything (still autoindented) 10617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.reading: 10627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.insert("insert", "\n") 10637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.see("insert") 10647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 1065822a77fcc761b3c9992950ddf48b3f0bec917b4dKurt B. Kaiser self.newline_and_indent_event(event) 10667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 10677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 10687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def enter_callback(self, event): 10697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.executing and not self.reading: 10707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return # Let the default binding (insert '\n') take over 10717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # If some text is selected, recall the selection 10727aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # (but only if this before the I/O mark) 10737aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 10747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sel = self.text.get("sel.first", "sel.last") 10757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if sel: 10767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("sel.last", "<=", "iomark"): 1077a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser self.recall(sel, event) 10787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 10797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 10807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 10817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # If we're strictly before the line containing iomark, recall 10827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # the current line, less a leading prompt, less leading or 10837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # trailing whitespace 10847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("insert", "<", "iomark linestart"): 10857aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Check if there's a relevant stdin range -- if so, use it 10867aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer prev = self.text.tag_prevrange("stdin", "insert") 10877aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if prev and self.text.compare("insert", "<", prev[1]): 1088a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser self.recall(self.text.get(prev[0], prev[1]), event) 10897aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 10907aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer next = self.text.tag_nextrange("stdin", "insert") 10917aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if next and self.text.compare("insert lineend", ">=", next[0]): 1092a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser self.recall(self.text.get(next[0], next[1]), event) 10937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 10944ada7ad3bc9ab269189ed20e57943d9721664debKurt B. Kaiser # No stdin mark -- just get the current line, less any prompt 1095b17544551fc8dfd1304d5679c6e444cad4d34d97Kurt B. Kaiser indices = self.text.tag_nextrange("console", "insert linestart") 1096b17544551fc8dfd1304d5679c6e444cad4d34d97Kurt B. Kaiser if indices and \ 1097b17544551fc8dfd1304d5679c6e444cad4d34d97Kurt B. Kaiser self.text.compare(indices[0], "<=", "insert linestart"): 1098b17544551fc8dfd1304d5679c6e444cad4d34d97Kurt B. Kaiser self.recall(self.text.get(indices[1], "insert lineend"), event) 1099b17544551fc8dfd1304d5679c6e444cad4d34d97Kurt B. Kaiser else: 1100b17544551fc8dfd1304d5679c6e444cad4d34d97Kurt B. Kaiser self.recall(self.text.get("insert linestart", "insert lineend"), event) 11017aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 1102822a77fcc761b3c9992950ddf48b3f0bec917b4dKurt B. Kaiser # If we're between the beginning of the line and the iomark, i.e. 11034ada7ad3bc9ab269189ed20e57943d9721664debKurt B. Kaiser # in the prompt area, move to the end of the prompt 1104822a77fcc761b3c9992950ddf48b3f0bec917b4dKurt B. Kaiser if self.text.compare("insert", "<", "iomark"): 11054ada7ad3bc9ab269189ed20e57943d9721664debKurt B. Kaiser self.text.mark_set("insert", "iomark") 11067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # If we're in the current input and there's only whitespace 11077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # beyond the cursor, erase that whitespace first 11087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer s = self.text.get("insert", "end-1c") 1109837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser if s and not s.strip(): 11107aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.delete("insert", "end-1c") 11117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # If we're in the current input before its last line, 11127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # insert a newline right at the insert point 11137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.compare("insert", "<", "end-1c linestart"): 1114822a77fcc761b3c9992950ddf48b3f0bec917b4dKurt B. Kaiser self.newline_and_indent_event(event) 11157aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 11167aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # We're in the last line; append a newline and submit it 11177aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_set("insert", "end-1c") 11187aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.reading: 11197aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.insert("insert", "\n") 11207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.see("insert") 11217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 1122822a77fcc761b3c9992950ddf48b3f0bec917b4dKurt B. Kaiser self.newline_and_indent_event(event) 11237aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.tag_add("stdin", "iomark", "end-1c") 11247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.update_idletasks() 11257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.reading: 11267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.top.quit() # Break out of recursive mainloop() in raw_input() 11277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer else: 11287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.runit() 11297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return "break" 11307aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1131a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser def recall(self, s, event): 1132cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser # remove leading and trailing empty or whitespace lines 1133cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser s = re.sub(r'^\s*\n', '' , s) 1134cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser s = re.sub(r'\n\s*$', '', s) 1135cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser lines = s.split('\n') 1136a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser self.text.undo_block_start() 1137a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser try: 1138a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser self.text.tag_remove("sel", "1.0", "end") 1139a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser self.text.mark_set("insert", "end-1c") 1140cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser prefix = self.text.get("insert linestart", "insert") 1141cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser if prefix.rstrip().endswith(':'): 11428fa7eb563bb9a14651bcdc8ee60c5e45302c2f59Kurt B. Kaiser self.newline_and_indent_event(event) 1143cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser prefix = self.text.get("insert linestart", "insert") 1144cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser self.text.insert("insert", lines[0].strip()) 11458fa7eb563bb9a14651bcdc8ee60c5e45302c2f59Kurt B. Kaiser if len(lines) > 1: 1146cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser orig_base_indent = re.search(r'^([ \t]*)', lines[0]).group(0) 1147cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser new_base_indent = re.search(r'^([ \t]*)', prefix).group(0) 11488fa7eb563bb9a14651bcdc8ee60c5e45302c2f59Kurt B. Kaiser for line in lines[1:]: 1149cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser if line.startswith(orig_base_indent): 1150cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser # replace orig base indentation with new indentation 1151cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser line = new_base_indent + line[len(orig_base_indent):] 1152cd3d8bee022cda55c43c2130122d092f5059d115Kurt B. Kaiser self.text.insert('insert', '\n'+line.rstrip()) 1153a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser finally: 1154a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser self.text.see("insert") 1155a7daba6866136d1c554ba6bf278e9ddaf52ecac6Kurt B. Kaiser self.text.undo_block_stop() 11567aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 11577aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def runit(self): 11587aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer line = self.text.get("iomark", "end-1c") 11597aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # Strip off last newline and surrounding whitespace. 11607aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer # (To allow you to hit return twice to end a statement.) 11617aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer i = len(line) 11627aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer while i > 0 and line[i-1] in " \t": 11637aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer i = i-1 11647aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if i > 0 and line[i-1] == "\n": 11657aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer i = i-1 11667aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer while i > 0 and line[i-1] in " \t": 11677aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer i = i-1 11687aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer line = line[:i] 11697aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer more = self.interp.runsource(line) 11707aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 11717aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def open_stack_viewer(self, event=None): 11725d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey if self.interp.rpcclt: 11735d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey return self.interp.remote_stack_viewer() 11747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 11757aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.last_traceback 11767aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 11777aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer tkMessageBox.showerror("No stack trace", 11787aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "There is no stack trace yet.\n" 11797aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer "(sys.last_traceback is not defined)", 11807aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer master=self.text) 11817aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer return 11827aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer from StackViewer import StackBrowser 11837aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sv = StackBrowser(self.root, self.flist) 11847aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 11851061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser def view_restart_mark(self, event=None): 11861061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser self.text.see("iomark") 11871061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser self.text.see("restart") 11881061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser 11891061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser def restart_shell(self, event=None): 119067fd0ea46d187ccab90ed574207bc88503bde3eaKurt B. Kaiser self.interp.restart_subprocess() 11911061e7270b13a0e632c5a28791a46e38b48a39a0Kurt B. Kaiser 11927aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def showprompt(self): 11937aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.resetoutput() 11947aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer try: 11957aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer s = str(sys.ps1) 11967aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer except: 11977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer s = "" 11987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.console.write(s) 11997aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_set("insert", "end-1c") 12005d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.set_line_and_column() 1201dc1e70987f49aa23bf1d07f32c476edeba0cec30Kurt B. Kaiser self.io.reset_undo() 12027aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 12037aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def resetoutput(self): 12047aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer source = self.text.get("iomark", "end-1c") 12057aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.history: 12067aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.history.history_store(source) 12077aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.text.get("end-2c") != "\n": 12087aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.insert("end-1c", "\n") 12097aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.text.mark_set("iomark", "end-1c") 12105d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.set_line_and_column() 12117aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer sys.stdout.softspace = 0 12127aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 12137aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def write(self, s, tags=()): 1214003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser try: 1215003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser self.text.mark_gravity("iomark", "right") 1216003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser OutputWindow.write(self, s, tags, "iomark") 1217003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser self.text.mark_gravity("iomark", "left") 1218003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser except: 1219003091cd51c5278e3ef76b6db01bd719b8b1c416Kurt B. Kaiser pass 12207aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer if self.canceled: 12217aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.canceled = 0 12227f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser if not use_subprocess: 12237f38ec0849fd2b19e660350c59d42b8b5cfae2d1Kurt B. Kaiser raise KeyboardInterrupt 12247aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1225dcba6622f52efafa28104a07db9d5ba2b1a8d628Kurt B. Kaiserclass PseudoFile(object): 12267aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1227bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis def __init__(self, shell, tags, encoding=None): 12287aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.shell = shell 12297aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.tags = tags 12305d2af63cc36ca1141e1ec7412fc33866f3908408Chui Tey self.softspace = 0 1231bcc651a1f954bad7a14d93d41e95728072e48ea0Martin v. Löwis self.encoding = encoding 12327aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 12337aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def write(self, s): 12347aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer self.shell.write(s, self.tags) 12357aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 12367aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def writelines(self, l): 12377aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer map(self.write, l) 12387aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 12397aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def flush(self): 12407aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer pass 12417aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 12427aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer def isatty(self): 1243837d15c5b5deee769079faa94117d8a83adb53ecKurt B. Kaiser return True 12447aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1245969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 12467aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererusage_msg = """\ 12477aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 124811659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. KaiserUSAGE: idle [-deins] [-t title] [file]* 124911659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser idle [-dns] [-t title] (-c cmd | -r file) [arg]* 125011659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser idle [-dns] [-t title] - [arg]* 12516655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser 1252f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser -h print this help message and exit 12538f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser -n run IDLE without a subprocess (see Help/IDLE Help for details) 1254f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1255f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. KaiserThe following options will override the IDLE 'settings' configuration: 1256f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1257f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser -e open an edit window 1258f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser -i open a shell window 1259f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1260f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. KaiserThe following options imply -i and will open a shell: 1261f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1262f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser -c cmd run the command in a shell, or 1263f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser -r file run script from file 1264f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1265f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser -d enable the debugger 1266f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser -s run $IDLESTARTUP or $PYTHONSTARTUP before anything else 1267f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser -t title set title of shell window 1268f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1269f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. KaiserA default edit window will be bypassed when -c, -r, or - are used. 1270f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1271f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser[arg]* are passed to the command (-c) or script (-r) in sys.argv[1:]. 1272f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1273f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. KaiserExamples: 12747aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1275f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiseridle 1276f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser Open an edit window or shell depending on IDLE's configuration. 127796d88422373ffb32aef75157647e0575a0471c03Kurt B. Kaiser 1278f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiseridle foo.py foobar.py 1279f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser Edit the files, also open a shell if configured to start with shell. 1280f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1281f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiseridle -est "Baz" foo.py 1282f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser Run $IDLESTARTUP or $PYTHONSTARTUP, edit foo.py, and open a shell 1283f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser window with the title "Baz". 1284f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1285f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiseridle -c "import sys; print sys.argv" "foo" 1286f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser Open a shell window and run the command, passing "-c" in sys.argv[0] 1287f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser and "foo" in sys.argv[1]. 1288f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1289f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiseridle -d -s -r foo.py "Hello World" 1290f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser Open a shell window, run a startup script, enable the debugger, and 1291f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser run foo.py, passing "foo.py" in sys.argv[0] and "Hello World" in 1292f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser sys.argv[1]. 1293f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 1294f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiserecho "import sys; print sys.argv" | idle - "foobar" 1295f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser Open a shell window, run the script piped in, passing '' in sys.argv[0] 1296f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser and "foobar" in sys.argv[1]. 12977aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer""" 12987aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer 1299969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiserdef main(): 1300f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser global flist, root, use_subprocess 1301f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser 13028f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser use_subprocess = True 1303f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_shell = False 1304f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_edit = False 1305f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser debug = False 1306969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser cmd = None 1307969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser script = None 1308f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser startup = False 1309969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser try: 13108f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser opts, args = getopt.getopt(sys.argv[1:], "c:deihnr:st:") 1311969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser except getopt.error, msg: 1312969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.stderr.write("Error: %s\n" % str(msg)) 1313969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.stderr.write(usage_msg) 1314969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.exit(2) 1315969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser for o, a in opts: 1316969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-c': 1317969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser cmd = a 1318f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_shell = True 1319969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-d': 1320f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser debug = True 1321f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_shell = True 1322969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-e': 1323f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_edit = True 1324f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if o == '-h': 1325f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser sys.stdout.write(usage_msg) 1326f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser sys.exit() 1327f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if o == '-i': 1328f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_shell = True 13298f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser if o == '-n': 13308f570a768fcefef5e8c9f9cf1facc4f8cdc3ef3fKurt B. Kaiser use_subprocess = False 1331969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-r': 1332969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser script = a 1333f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if os.path.isfile(script): 1334f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser pass 1335f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser else: 1336f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser print "No script file: ", script 1337f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser sys.exit() 1338f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_shell = True 1339969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-s': 1340f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser startup = True 1341f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_shell = True 1342969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if o == '-t': 1343969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser PyShell.shell_title = a 1344f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_shell = True 1345f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if args and args[0] == '-': 1346f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser cmd = sys.stdin.read() 1347f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_shell = True 1348f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser # process sys.argv and sys.path: 1349969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser for i in range(len(sys.path)): 1350969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser sys.path[i] = os.path.abspath(sys.path[i]) 1351f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if args and args[0] == '-': 1352f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser sys.argv = [''] + args[1:] 1353f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser elif cmd: 1354f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser sys.argv = ['-c'] + args 1355f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser elif script: 1356f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser sys.argv = [script] + args 1357f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser elif args: 1358f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_edit = True 1359f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser pathx = [] 1360969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser for filename in args: 1361969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser pathx.append(os.path.dirname(filename)) 1362f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser for dir in pathx: 1363f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser dir = os.path.abspath(dir) 1364f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if not dir in sys.path: 1365f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser sys.path.insert(0, dir) 1366ff002b93057d1ba8662caed8f9bcbb643fe66c8aKurt B. Kaiser else: 1367ff002b93057d1ba8662caed8f9bcbb643fe66c8aKurt B. Kaiser dir = os.getcwd() 1368ff002b93057d1ba8662caed8f9bcbb643fe66c8aKurt B. Kaiser if not dir in sys.path: 1369ff002b93057d1ba8662caed8f9bcbb643fe66c8aKurt B. Kaiser sys.path.insert(0, dir) 1370f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser # check the IDLE settings configuration (but command line overrides) 1371f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser edit_start = idleConf.GetOption('main', 'General', 13726655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser 'editor-on-startup', type='bool') 1373f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser enable_edit = enable_edit or edit_start 13746655e4bc2752f1114a2e1f9a63ffd4191fa50d0dKurt B. Kaiser enable_shell = enable_shell or not edit_start 1375f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser # start editor and/or shell windows: 1376969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser root = Tk(className="Idle") 137719302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren 1378969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser fixwordbreaks(root) 1379969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser root.withdraw() 1380969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser flist = PyShellFileList(root) 138119302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren macosxSupport.setupApp(root, flist) 138219302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren 1383f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if enable_edit: 1384f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if not (cmd or script): 1385f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser for filename in args: 1386f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser flist.open(filename) 1387f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if not args: 1388f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser flist.new() 1389af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser if enable_shell: 139019302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren shell = flist.open_shell() 139119302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren if not shell: 1392af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser return # couldn't open shell 139319302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren 139419302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren if macosxSupport.runningAsOSXApp() and flist.dict: 139519302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren # On OSX: when the user has double-clicked on a file that causes 13964f96f1f2b5068b8e8bd8d0f83f856b6e2883a3abTim Peters # IDLE to be launched the shell window will open just in front of 13974f96f1f2b5068b8e8bd8d0f83f856b6e2883a3abTim Peters # the file she wants to see. Lower the interpreter window when 139819302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren # there are open files. 139919302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren shell.top.lower() 140019302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren 1401f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser shell = flist.pyshell 1402f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser # handle remaining options: 1403f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if debug: 1404f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser shell.open_debugger() 1405969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if startup: 1406969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser filename = os.environ.get("IDLESTARTUP") or \ 1407969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser os.environ.get("PYTHONSTARTUP") 1408969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser if filename and os.path.isfile(filename): 1409f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser shell.interp.execfile(filename) 1410af3eb878027954fa578f43ba490599d13215eb3aKurt B. Kaiser if shell and cmd or script: 1411f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser shell.interp.runcommand("""if 1: 1412f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser import sys as _sys 141370a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald _sys.argv = %r 1414f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser del _sys 141570a6b49821a3226f55e9716f32d802d06640cb89Walter Dörwald \n""" % (sys.argv,)) 1416f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser if cmd: 1417f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser shell.interp.execsource(cmd) 1418f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser elif script: 141911659ade1e63095ac6217b4e190c14b494ddcf82Kurt B. Kaiser shell.interp.prepend_syspath(script) 1420f06eed08a899e941c1e6db9b1b5fb126f9e33b85Kurt B. Kaiser shell.interp.execfile(script) 142119302d927e6688e02553df16177e4867e2d0e3b3Ronald Oussoren 1422969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser root.mainloop() 1423969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser root.destroy() 1424969de458aa12e831942637bbcd9994b29dc86252Kurt B. Kaiser 14257aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Schererif __name__ == "__main__": 14269e8b828f07d0a55676e987b4ca70c247853f5695Kurt B. Kaiser sys.modules['PyShell'] = sys.modules['__main__'] 14277aced17437a6b05bc4b0b5ff93aa6a5d3a374d68David Scherer main() 1428