IDLE -- Restrict shell prompt manipulaton to the shell. (#4143)

Editor and output windows only see an empty last prompt line.
This simplifies the code and fixes a minor bug when newline is inserted.
Sys.ps1, if present, is read on Shell start-up, but is not set or changed.
This commit is contained in:
Terry Jan Reedy 2017-10-27 20:26:12 -04:00 committed by GitHub
parent ed6554c487
commit e86172d63a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 19 additions and 24 deletions

View File

@ -99,10 +99,6 @@ class EditorWindow(object):
self.flist = flist self.flist = flist
root = root or flist.root root = root or flist.root
self.root = root self.root = root
try:
sys.ps1
except AttributeError:
sys.ps1 = '>>> '
self.menubar = Menu(root) self.menubar = Menu(root)
self.top = top = windows.ListedToplevel(root, menu=self.menubar) self.top = top = windows.ListedToplevel(root, menu=self.menubar)
if flist: if flist:
@ -116,6 +112,8 @@ class EditorWindow(object):
self.top.instance_dict = {} self.top.instance_dict = {}
self.recent_files_path = os.path.join( self.recent_files_path = os.path.join(
idleConf.userdir, 'recent-files.lst') idleConf.userdir, 'recent-files.lst')
self.prompt_last_line = '' # Override in PyShell
self.text_frame = text_frame = Frame(top) self.text_frame = text_frame = Frame(top)
self.vbar = vbar = Scrollbar(text_frame, name='vbar') self.vbar = vbar = Scrollbar(text_frame, name='vbar')
self.width = idleConf.GetOption('main', 'EditorWindow', self.width = idleConf.GetOption('main', 'EditorWindow',
@ -1213,13 +1211,9 @@ class EditorWindow(object):
assert have > 0 assert have > 0
want = ((have - 1) // self.indentwidth) * self.indentwidth want = ((have - 1) // self.indentwidth) * self.indentwidth
# Debug prompt is multilined.... # Debug prompt is multilined....
if self.context_use_ps1:
last_line_of_prompt = sys.ps1.split('\n')[-1]
else:
last_line_of_prompt = ''
ncharsdeleted = 0 ncharsdeleted = 0
while 1: while 1:
if chars == last_line_of_prompt: if chars == self.prompt_last_line: # '' unless PyShell
break break
chars = chars[:-1] chars = chars[:-1]
ncharsdeleted = ncharsdeleted + 1 ncharsdeleted = ncharsdeleted + 1
@ -1288,8 +1282,7 @@ class EditorWindow(object):
indent = line[:i] indent = line[:i]
# strip whitespace before insert point unless it's in the prompt # strip whitespace before insert point unless it's in the prompt
i = 0 i = 0
last_line_of_prompt = sys.ps1.split('\n')[-1] while line and line[-1] in " \t" and line != self.prompt_last_line:
while line and line[-1] in " \t" and line != last_line_of_prompt:
line = line[:-1] line = line[:-1]
i = i+1 i = i+1
if i: if i:

View File

@ -857,15 +857,17 @@ class PyShell(OutputWindow):
fixwordbreaks(root) fixwordbreaks(root)
root.withdraw() root.withdraw()
flist = PyShellFileList(root) flist = PyShellFileList(root)
#
OutputWindow.__init__(self, flist, None, None) OutputWindow.__init__(self, flist, None, None)
#
## self.config(usetabs=1, indentwidth=8, context_use_ps1=1)
self.usetabs = True self.usetabs = True
# indentwidth must be 8 when using tabs. See note in EditorWindow: # indentwidth must be 8 when using tabs. See note in EditorWindow:
self.indentwidth = 8 self.indentwidth = 8
self.context_use_ps1 = True
# self.sys_ps1 = sys.ps1 if hasattr(sys, 'ps1') else '>>> '
self.prompt_last_line = self.sys_ps1.split('\n')[-1]
self.prompt = self.sys_ps1 # Changes when debug active
text = self.text text = self.text
text.configure(wrap="char") text.configure(wrap="char")
text.bind("<<newline-and-indent>>", self.enter_callback) text.bind("<<newline-and-indent>>", self.enter_callback)
@ -878,7 +880,7 @@ class PyShell(OutputWindow):
if use_subprocess: if use_subprocess:
text.bind("<<view-restart>>", self.view_restart_mark) text.bind("<<view-restart>>", self.view_restart_mark)
text.bind("<<restart-shell>>", self.restart_shell) text.bind("<<restart-shell>>", self.restart_shell)
#
self.save_stdout = sys.stdout self.save_stdout = sys.stdout
self.save_stderr = sys.stderr self.save_stderr = sys.stderr
self.save_stdin = sys.stdin self.save_stdin = sys.stdin
@ -951,7 +953,7 @@ class PyShell(OutputWindow):
debugger_r.close_remote_debugger(self.interp.rpcclt) debugger_r.close_remote_debugger(self.interp.rpcclt)
self.resetoutput() self.resetoutput()
self.console.write("[DEBUG OFF]\n") self.console.write("[DEBUG OFF]\n")
sys.ps1 = ">>> " self.prompt = self.sys_ps1
self.showprompt() self.showprompt()
self.set_debugger_indicator() self.set_debugger_indicator()
@ -963,7 +965,7 @@ class PyShell(OutputWindow):
dbg_gui = debugger.Debugger(self) dbg_gui = debugger.Debugger(self)
self.interp.setdebugger(dbg_gui) self.interp.setdebugger(dbg_gui)
dbg_gui.load_breakpoints() dbg_gui.load_breakpoints()
sys.ps1 = "[DEBUG ON]\n>>> " self.prompt = "[DEBUG ON]\n" + self.sys_ps1
self.showprompt() self.showprompt()
self.set_debugger_indicator() self.set_debugger_indicator()
@ -1248,11 +1250,7 @@ class PyShell(OutputWindow):
def showprompt(self): def showprompt(self):
self.resetoutput() self.resetoutput()
try: self.console.write(self.prompt)
s = str(sys.ps1)
except:
s = ""
self.console.write(s)
self.text.mark_set("insert", "end-1c") self.text.mark_set("insert", "end-1c")
self.set_line_and_column() self.set_line_and_column()
self.io.reset_undo() self.io.reset_undo()

View File

@ -0,0 +1,4 @@
IDLE -- Restrict shell prompt manipulaton to the shell. Editor and output
windows only see an empty last prompt line. This simplifies the code and
fixes a minor bug when newline is inserted. Sys.ps1, if present, is read on
Shell start-up, but is not set or changed.