@@ -259,15 +259,7 @@ def process_event(self, e):
259259 elif isinstance (e , events .PasteEvent ):
260260 self .paste_mode = True
261261 for ee in e .events :
262- if ee in ("\n " , "\r " , "PAD_ENTER" ):
263- self .on_enter ()
264- while self .fake_refresh_request :
265- self .fake_refresh_request = False
266- self .process_event (events .RefreshRequestEvent ())
267- elif isinstance (ee , events .Event ):
268- pass # ignore events in a paste
269- else :
270- self .add_normal_character (ee if len (ee ) == 1 else ee [- 1 ]) #strip control seq
262+ self .process_simple_event (ee )
271263 self .paste_mode = False
272264 self .update_completion ()
273265
@@ -331,6 +323,8 @@ def process_event(self, e):
331323 elif e in key_dispatch [self .config .external_editor_key ]:
332324 self .send_to_external_editor ()
333325 #TODO add PAD keys hack as in bpython.cli
326+ elif e in ["" ]:
327+ self .send_current_block_to_external_editor ()
334328 else :
335329 self .add_normal_character (e if len (e ) == 1 else e [- 1 ]) #strip control seq
336330 self .update_completion ()
@@ -868,6 +862,50 @@ def send_to_external_editor(self, filename=None):
868862 self ._current_line = lines [- 1 ][4 :]
869863 self .cursor_offset_in_line = len (self ._current_line )
870864
865+ def get_current_block (self ):
866+ return '\n ' .join (self .buffer + [self ._current_line ])
867+
868+ def clear_current_block (self ):
869+ self .display_buffer = []
870+ [self .history .pop () for _ in self .buffer ]
871+ self .buffer = []
872+ self .cursor_offset_in_line = 0
873+ self .saved_indent = 0
874+ self ._current_line = ''
875+ self .cursor_offset_in_line = len (self ._current_line )
876+ self .done = True
877+
878+ def send_current_block_to_external_editor (self , filename = None ):
879+ editor = os .environ .get ('VISUAL' , os .environ .get ('EDITOR' , 'vim' ))
880+ editor_args = editor .split ()
881+ text = self .get_current_block ()
882+ self .clear_current_block ()
883+ with tempfile .NamedTemporaryFile (suffix = '.py' ) as temp :
884+ temp .write (text .encode ('utf8' ))
885+ temp .flush ()
886+ subprocess .call (editor_args + [temp .name ])
887+ lines = [line for line in open (temp .name ).read ().split ('\n ' )]
888+ while not lines [- 1 ].split ():
889+ lines .pop ()
890+ events = '\n ' .join (lines + (['' ] if len (lines ) == 1 else ['' , '' ]))
891+ self .paste_mode = True
892+ for e in events :
893+ self .process_simple_event (e )
894+ self .paste_mode = False
895+ self ._current_line = ''
896+ self .cursor_offset_in_line = len (self ._current_line )
897+
898+ def process_simple_event (self , e ):
899+ if e in ("\n " , "\r " , "PAD_ENTER" ):
900+ self .on_enter ()
901+ while self .fake_refresh_request :
902+ self .fake_refresh_request = False
903+ self .process_event (events .RefreshRequestEvent ())
904+ elif isinstance (e , events .Event ):
905+ pass # ignore events
906+ else :
907+ self .add_normal_character (e if len (e ) == 1 else e [- 1 ]) #strip control seq
908+
871909def simple_repl ():
872910 refreshes = []
873911 def request_refresh ():
0 commit comments