@@ -710,34 +710,46 @@ def set_scroll_offset(editor, value):
710
710
711
711
712
712
def substitute (editor , range_start , range_end , search , replace , flags ):
713
- if editor .last_substitute_text and replace is None :
714
- replace = editor .last_substitute_text
715
- else :
716
- editor .last_substitute_text = replace
713
+ def get_line_index_iterator (cursor_position_row , range_start , range_end ):
714
+ if not range_start :
715
+ range_start = range_end = cursor_position_row
716
+ else :
717
+ range_start = int (range_start ) - 1
718
+ if not range_end :
719
+ range_end = range_start
720
+ range_end = int (range_end )
721
+ return range (range_start , range_end + 1 )
722
+
723
+ def get_transform_callback (search , replace , flags ):
724
+ SUBSTITUTE_ALL , SUBSTITUTE_ONE = 0 , 1
725
+ sub_count = SUBSTITUTE_ALL if 'g' in flags else SUBSTITUTE_ONE
726
+ return lambda s : re .sub (search , replace , s , count = sub_count )
727
+
728
+ search_state = editor .application .current_search_state
729
+ buffer = editor .current_editor_buffer .buffer
730
+ cursor_position_row = buffer .document .cursor_position_row
717
731
732
+ # read editor state
718
733
if not search :
719
- search = editor .application .current_search_state .text
720
- else :
721
- editor .application .current_search_state .text = search
734
+ search = search_state .text
722
735
723
- if flags == 'g' :
724
- transform_callback = lambda s : re .sub (search , replace , s )
725
- else :
726
- transform_callback = lambda s : re .sub (search , replace , s , count = 1 )
736
+ if editor .last_substitute_text and replace is None :
737
+ replace = editor .last_substitute_text
727
738
728
- buffer = editor .current_editor_buffer .buffer
729
- current_row = buffer .document .cursor_position_row
739
+ line_index_iterator = get_line_index_iterator (cursor_position_row , range_start , range_end )
740
+ transform_callback = get_transform_callback (search , replace , flags )
741
+ new_text = buffer .transform_lines (line_index_iterator , transform_callback )
730
742
731
- if not range_end :
732
- current_row = (int (range_start ) - 1 ) if range_start else current_row
733
- range_end = range_start
734
- if range_start and range_end :
735
- line_index_iterator = range (int (range_start ) - 1 , int (range_end ))
736
- else :
737
- line_index_iterator = range (current_row , current_row + 1 )
743
+ new_cursor_position_row = int (range_start ) - 1 if range_start and not range_end else cursor_position_row
738
744
739
- new_text = buffer . transform_lines ( line_index_iterator , transform_callback )
745
+ # update text buffer
740
746
buffer .document = Document (
741
747
new_text ,
742
- Document (new_text ).translate_row_col_to_index (current_row , 0 ))
748
+ Document (new_text ).translate_row_col_to_index (new_cursor_position_row , 0 ),
749
+ )
743
750
buffer .cursor_position += buffer .document .get_start_of_line_position (after_whitespace = True )
751
+ buffer ._search (search_state , include_current_position = True )
752
+
753
+ # update editor state
754
+ editor .last_substitute_text = replace
755
+ search_state .text = search
0 commit comments