@@ -220,11 +220,6 @@ def smarter_request_refresh():
220220 self .height = None
221221 self .start_background_tasks ()
222222
223- @property
224- def done (self ):
225- """Whether the last block is complete - which prompt to use, ps1 or ps2"""
226- return not self .buffer
227-
228223 def __enter__ (self ):
229224 self .orig_stdout = sys .stdout
230225 self .orig_stderr = sys .stderr
@@ -445,6 +440,41 @@ def only_whitespace_left_of_cursor():
445440 self .current_word = (self .matches_iter .previous ()
446441 if back else self .matches_iter .next ())
447442
443+ def process_simple_event (self , e ):
444+ if e in ("\n " , "\r " , "PAD_ENTER" ):
445+ self .on_enter ()
446+ while self .fake_refresh_requested :
447+ self .fake_refresh_requested = False
448+ self .process_event (events .RefreshRequestEvent ())
449+ elif isinstance (e , events .Event ):
450+ pass # ignore events
451+ else :
452+ self .add_normal_character (e if len (e ) == 1 else e [- 1 ]) #strip control seq
453+
454+ def send_current_block_to_external_editor (self , filename = None ):
455+ text = self .send_to_external_editor (self .get_current_block ())
456+ lines = [line for line in text .split ('\n ' )]
457+ while lines and not lines [- 1 ].split ():
458+ lines .pop ()
459+ events = '\n ' .join (lines + (['' ] if len (lines ) == 1 else ['' , '' ]))
460+ self .clear_current_block ()
461+ with self .in_paste_mode ():
462+ for e in events :
463+ self .process_simple_event (e )
464+ self ._current_line = ''
465+ self .cursor_offset_in_line = len (self ._current_line )
466+
467+ def send_session_to_external_editor (self , filename = None ):
468+ for_editor = '### current bpython session - file will be reevaluated, ### lines will not be run\n ' .encode ('utf8' )
469+ for_editor += ('\n ' .join (line [4 :] if line [:4 ] in ('... ' , '>>> ' ) else '### ' + line
470+ for line in self .getstdout ().split ('\n ' )).encode ('utf8' ))
471+ text = self .send_to_external_editor (for_editor )
472+ lines = text .split ('\n ' )
473+ self .history = [line for line in lines if line [:4 ] != '### ' ]
474+ self .reevaluate (insert_into_history = True )
475+ self ._current_line = lines [- 1 ][4 :]
476+ self .cursor_offset_in_line = len (self ._current_line )
477+
448478 ## Handler Helpers
449479 def add_normal_character (self , char ):
450480 assert len (char ) == 1 , repr (char )
@@ -566,7 +596,24 @@ def unhighlight_paren(self):
566596 self .display_buffer [lineno ] = self .display_buffer [lineno ].setslice (0 , len (new ), new )
567597
568598
599+ def clear_current_block (self ):
600+ self .display_buffer = []
601+ [self .history .pop () for _ in self .buffer ]
602+ self .buffer = []
603+ self .cursor_offset_in_line = 0
604+ self .saved_indent = 0
605+ self ._current_line = ''
606+ self .cursor_offset_in_line = len (self ._current_line )
607+
608+ def get_current_block (self ):
609+ return '\n ' .join (self .buffer + [self ._current_line ])
610+
569611 ## formatting, output
612+ @property
613+ def done (self ):
614+ """Whether the last block is complete - which prompt to use, ps1 or ps2"""
615+ return not self .buffer
616+
570617 @property
571618 def current_line_formatted (self ):
572619 if self .config .syntax :
@@ -754,6 +801,13 @@ def paint(self, about_to_exit=False, user_quit=False):
754801 logging .debug ('cursor pos: %r' , (cursor_row , cursor_column ))
755802 return arr , (cursor_row , cursor_column )
756803
804+ @contextlib .contextmanager
805+ def in_paste_mode (self ):
806+ orig_value = self .paste_mode
807+ self .paste_mode = True
808+ yield
809+ self .paste_mode = orig_value
810+
757811 ## Debugging shims
758812 def dumb_print_output (self ):
759813 arr , cpos = self .paint ()
@@ -866,60 +920,6 @@ def getstdout(self):
866920 s = '\n ' .join ([x .s if isinstance (x , FmtStr ) else x for x in lines ]
867921 ) if lines else ''
868922 return s
869- def send_session_to_external_editor (self , filename = None ):
870- for_editor = '### current bpython session - file will be reevaluated, ### lines will not be run\n ' .encode ('utf8' )
871- for_editor += ('\n ' .join (line [4 :] if line [:4 ] in ('... ' , '>>> ' ) else '### ' + line
872- for line in self .getstdout ().split ('\n ' )).encode ('utf8' ))
873- text = self .send_to_external_editor (for_editor )
874- lines = text .split ('\n ' )
875- self .history = [line for line in lines if line [:4 ] != '### ' ]
876- self .reevaluate (insert_into_history = True )
877- self ._current_line = lines [- 1 ][4 :]
878- self .cursor_offset_in_line = len (self ._current_line )
879-
880- def get_current_block (self ):
881- return '\n ' .join (self .buffer + [self ._current_line ])
882-
883- def clear_current_block (self ):
884- self .display_buffer = []
885- [self .history .pop () for _ in self .buffer ]
886- self .buffer = []
887- self .cursor_offset_in_line = 0
888- self .saved_indent = 0
889- self ._current_line = ''
890- self .cursor_offset_in_line = len (self ._current_line )
891-
892- def send_current_block_to_external_editor (self , filename = None ):
893- text = self .send_to_external_editor (self .get_current_block ())
894- lines = [line for line in text .split ('\n ' )]
895- while lines and not lines [- 1 ].split ():
896- lines .pop ()
897- events = '\n ' .join (lines + (['' ] if len (lines ) == 1 else ['' , '' ]))
898- self .clear_current_block ()
899- with self .in_paste_mode ():
900- for e in events :
901- self .process_simple_event (e )
902- self ._current_line = ''
903- self .cursor_offset_in_line = len (self ._current_line )
904-
905- def process_simple_event (self , e ):
906- if e in ("\n " , "\r " , "PAD_ENTER" ):
907- self .on_enter ()
908- while self .fake_refresh_requested :
909- self .fake_refresh_requested = False
910- self .process_event (events .RefreshRequestEvent ())
911- elif isinstance (e , events .Event ):
912- pass # ignore events
913- else :
914- self .add_normal_character (e if len (e ) == 1 else e [- 1 ]) #strip control seq
915-
916- @contextlib .contextmanager
917- def in_paste_mode (self ):
918- orig_value = self .paste_mode
919- self .paste_mode = True
920- yield
921- self .paste_mode = orig_value
922-
923923def simple_repl ():
924924 refreshes = []
925925 def request_refresh ():
0 commit comments