Skip to content

Commit 9bdd3c6

Browse files
lieryanjonathanslenders
authored andcommitted
Refactor commands/commands.py:substitute()
1 parent a272f95 commit 9bdd3c6

File tree

1 file changed

+34
-22
lines changed

1 file changed

+34
-22
lines changed

pyvim/commands/commands.py

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -710,34 +710,46 @@ def set_scroll_offset(editor, value):
710710

711711

712712
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
717731

732+
# read editor state
718733
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
722735

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
727738

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)
730742

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
738744

739-
new_text = buffer.transform_lines(line_index_iterator, transform_callback)
745+
# update text buffer
740746
buffer.document = Document(
741747
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+
)
743750
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

Comments
 (0)