@@ -279,15 +279,7 @@ def process_event(self, e):
279279 elif isinstance (e , events .PasteEvent ):
280280 self .paste_mode = True
281281 for ee in e .events :
282- if ee in ("\n " , "\r " , "PAD_ENTER" ):
283- self .on_enter ()
284- while self .fake_refresh_request :
285- self .fake_refresh_request = False
286- self .process_event (events .RefreshRequestEvent ())
287- elif isinstance (ee , events .Event ):
288- pass # ignore events in a paste
289- else :
290- self .add_normal_character (ee if len (ee ) == 1 else ee [- 1 ]) #strip control seq
282+ self .process_simple_event (ee )
291283 self .paste_mode = False
292284 self .update_completion ()
293285
@@ -348,6 +340,8 @@ def process_event(self, e):
348340 elif e in key_dispatch [self .config .external_editor_key ]:
349341 self .send_to_external_editor ()
350342 #TODO add PAD keys hack as in bpython.cli
343+ elif e in ["\x18 " ]:
344+ self .send_current_block_to_external_editor ()
351345 else :
352346 self .add_normal_character (e if len (e ) == 1 else e [- 1 ]) #strip control seq
353347 self .update_completion ()
@@ -884,6 +878,50 @@ def send_to_external_editor(self, filename=None):
884878 self ._current_line = lines [- 1 ][4 :]
885879 self .cursor_offset_in_line = len (self ._current_line )
886880
881+ def get_current_block (self ):
882+ return '\n ' .join (self .buffer + [self ._current_line ])
883+
884+ def clear_current_block (self ):
885+ self .display_buffer = []
886+ [self .history .pop () for _ in self .buffer ]
887+ self .buffer = []
888+ self .cursor_offset_in_line = 0
889+ self .saved_indent = 0
890+ self ._current_line = ''
891+ self .cursor_offset_in_line = len (self ._current_line )
892+ self .done = True
893+
894+ def send_current_block_to_external_editor (self , filename = None ):
895+ editor = os .environ .get ('VISUAL' , os .environ .get ('EDITOR' , 'vim' ))
896+ editor_args = editor .split ()
897+ text = self .get_current_block ()
898+ self .clear_current_block ()
899+ with tempfile .NamedTemporaryFile (suffix = '.py' ) as temp :
900+ temp .write (text .encode ('utf8' ))
901+ temp .flush ()
902+ subprocess .call (editor_args + [temp .name ])
903+ lines = [line for line in open (temp .name ).read ().split ('\n ' )]
904+ while not lines [- 1 ].split ():
905+ lines .pop ()
906+ events = '\n ' .join (lines + (['' ] if len (lines ) == 1 else ['' , '' ]))
907+ self .paste_mode = True
908+ for e in events :
909+ self .process_simple_event (e )
910+ self .paste_mode = False
911+ self ._current_line = ''
912+ self .cursor_offset_in_line = len (self ._current_line )
913+
914+ def process_simple_event (self , e ):
915+ if e in ("\n " , "\r " , "PAD_ENTER" ):
916+ self .on_enter ()
917+ while self .fake_refresh_request :
918+ self .fake_refresh_request = False
919+ self .process_event (events .RefreshRequestEvent ())
920+ elif isinstance (e , events .Event ):
921+ pass # ignore events
922+ else :
923+ self .add_normal_character (e if len (e ) == 1 else e [- 1 ]) #strip control seq
924+
887925def simple_repl ():
888926 refreshes = []
889927 def request_refresh ():
0 commit comments