Merge pull request #6213 from nyalldawson/interrupt_console

[console] Allow breaking execution of scripts via Ctrl-C
This commit is contained in:
Jürgen Fischer 2018-02-02 17:02:53 +01:00 committed by GitHub
commit ad21d371b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 2 deletions

View File

@ -39,6 +39,7 @@ class writeOut(object):
self.sO = shellOut
self.out = None
self.style = style
self.fire_keyboard_interrupt = False
def write(self, m):
if self.style == "_traceback":
@ -62,6 +63,10 @@ class writeOut(object):
if self.style != "_traceback":
QCoreApplication.processEvents()
if self.fire_keyboard_interrupt:
self.fire_keyboard_interrupt = False
raise KeyboardInterrupt
def move_cursor_to_end(self):
"""Move cursor to end of text"""
line, index = self.get_end_pos()

View File

@ -378,9 +378,16 @@ class ShellScintilla(QsciScintilla, code.InteractiveInterpreter):
if not self.is_cursor_on_edition_zone() or startLine < endLine:
# allow copying and selecting
if e.modifiers() & (Qt.ControlModifier | Qt.MetaModifier):
if e.key() in (Qt.Key_C, Qt.Key_A):
if e.key() == Qt.Key_C:
# only catch and return from Ctrl-C here if there's a selection
if self.hasSelectedText():
QsciScintilla.keyPressEvent(self, e)
return
elif e.key() == Qt.Key_A:
QsciScintilla.keyPressEvent(self, e)
return
return
else:
return
# allow selection
if e.modifiers() & Qt.ShiftModifier:
if e.key() in (Qt.Key_Left, Qt.Key_Right, Qt.Key_Home, Qt.Key_End):
@ -389,6 +396,11 @@ class ShellScintilla(QsciScintilla, code.InteractiveInterpreter):
# all other keystrokes get sent to the input line
self.move_cursor_to_end()
if e.modifiers() & (Qt.ControlModifier | Qt.MetaModifier) and e.key() == Qt.Key_C and not self.hasSelectedText():
# keyboard interrupt
sys.stdout.fire_keyboard_interrupt = True
return
line, index = self.getCursorPosition()
cmd = self.text(line)
@ -602,12 +614,14 @@ class ShellScintilla(QsciScintilla, code.InteractiveInterpreter):
sys.stderr.write(txt)
def writeCMD(self, txt):
sys.stdout.fire_keyboard_interrupt = False
if len(txt) > 0:
getCmdString = self.text()
prompt = getCmdString[0:4]
sys.stdout.write(prompt + txt + '\n')
def runsource(self, source, filename='<input>', symbol='single'):
sys.stdout.fire_keyboard_interrupt = False
hook = sys.excepthook
try:
def excepthook(etype, value, tb):