def _goto_next_conflict_marker(view, count: int) -> None: def f(view, s): for i in range(0, count): match = view_find(view, _CONFLICT_MARKER_REGEX, s.b + 1) if not match: break s.a = s.b = match.begin() return s regions_transformer(view, f)
def _do_C(view, edit, mode, count=1, motion=None): def f(view, s): return Region(s.begin()) if motion: run_motion(view, motion) elif mode not in (VISUAL, VISUAL_LINE): return ui_bell() view.run_command('toggle_comment', {'block': True}) regions_transformer(view, f) enter_normal_mode(view, mode)
def goto_line(view, mode, line_number): line_number = line_number if line_number > 0 else 1 dest = view.text_point(line_number - 1, 0) def f(view, s): if mode == NORMAL: pt = next_non_blank(view, dest) if view.substr(pt) == EOF: pt = max(pt - 1, 0) return Region(pt) elif mode == INTERNAL_NORMAL: start_line = view.full_line(s.a) dest_line = view.full_line(dest) if start_line.a == dest_line.a: return dest_line elif start_line.a < dest_line.a: return Region(start_line.a, dest_line.b) else: return Region(start_line.b, dest_line.a) elif mode == VISUAL: dest_non_blank = next_non_blank(view, dest) if dest_non_blank < s.a and s.a < s.b: return Region(s.a + 1, dest_non_blank) elif dest_non_blank < s.a: return Region(s.a, dest_non_blank) elif dest_non_blank > s.b and s.a > s.b: return Region(s.a - 1, dest_non_blank + 1) return Region(s.a, dest_non_blank + 1) elif mode == VISUAL_LINE: if dest < s.a and s.a < s.b: return Region(view.full_line(s.a).b, dest) elif dest < s.a: return Region(s.a, dest) elif dest >= s.a and s.a > s.b: return Region(view.full_line(s.a - 1).a, view.full_line(dest).b) return Region(s.a, view.full_line(dest).b) return s jumplist_update(view) regions_transformer(view, f) jumplist_update(view) # FIXME: Bringing the selections into view will be undesirable in many cases. Maybe we # should have an optional .scroll_selections_into_view() step during command execution. view.show(view.sel()[0])
def _motion(view, edit, mode, count): def f(view, s): if mode == INTERNAL_NORMAL: end = view.text_point(row_at(view, s.b) + (count - 1), 0) begin = view.line(s.b).a row_at_end = row_at(view, end) row_at_size = row_at(view, view.size()) if ((row_at_end == row_at_size) and (view.substr(begin - 1) == '\n')): begin -= 1 return Region(begin, view.full_line(end).b) return s regions_transformer(view, f)
def goto_line(view, mode: str, line_number: int) -> None: line_number = line_number if line_number > 0 else 1 dest = view.text_point(line_number - 1, 0) def f(view, s): if mode == NORMAL: pt = next_non_blank(view, dest) if view.substr(pt) == EOF: pt = max(pt - 1, 0) return Region(pt) elif mode == INTERNAL_NORMAL: start_line = view.full_line(s.a) dest_line = view.full_line(dest) if start_line.a == dest_line.a: return dest_line elif start_line.a < dest_line.a: return Region(start_line.a, dest_line.b) else: return Region(start_line.b, dest_line.a) elif mode == VISUAL: dest_non_blank = next_non_blank(view, dest) if dest_non_blank < s.a and s.a < s.b: return Region(s.a + 1, dest_non_blank) elif dest_non_blank < s.a: return Region(s.a, dest_non_blank) elif dest_non_blank > s.b and s.a > s.b: return Region(s.a - 1, dest_non_blank + 1) return Region(s.a, dest_non_blank + 1) elif mode == VISUAL_LINE: if dest < s.a and s.a < s.b: return Region(view.full_line(s.a).b, dest) elif dest < s.a: return Region(s.a, dest) elif dest >= s.a and s.a > s.b: return Region( view.full_line(s.a - 1).a, view.full_line(dest).b) return Region(s.a, view.full_line(dest).b) return s jumplist_update(view) regions_transformer(view, f) jumplist_update(view) show_if_not_visible(view)
def goto_prev_target(view, mode, count, target): targets = { '{': ('\\{', '\\}'), '(': ('\\(', '\\)'), } brackets = targets.get(target) if not brackets or mode not in (NORMAL, VISUAL, VISUAL_LINE): ui_bell() return def f(view, s): if mode == NORMAL: start = s.b if view.substr(start) == target: start -= 1 prev_target = find_prev_lone_bracket(view, start, brackets) if prev_target is not None: return Region(prev_target.a) elif mode in (VISUAL, VISUAL_LINE): start = s.b if s.b > s.a: start -= 1 if view.substr(start) == target: start -= 1 prev_target = find_prev_lone_bracket(view, start, brackets) if prev_target: if mode == VISUAL: resolve_visual_target(s, prev_target.a) elif mode == VISUAL_LINE: resolve_visual_line_target(view, s, prev_target.a) return s regions_transformer(view, f)
def _do_c(view, edit, mode, count=1, motion=None): def f(view, s): return Region(s.begin()) if motion: run_motion(view, motion) elif mode not in (VISUAL, VISUAL_LINE): return ui_bell() view.run_command('toggle_comment', {'block': False}) regions_transformer(view, f) line = view.line(view.sel()[0].begin()) pt = line.begin() if line.size() > 0: line = view.find('^\\s*', line.begin()) pt = line.end() set_selection(view, pt) enter_normal_mode(view, mode)
def goto_next_target(view, mode, count, target): targets = { '}': ('\\{', '\\}'), ')': ('\\(', '\\)'), } brackets = targets.get(target) if not brackets or mode not in (NORMAL, VISUAL, VISUAL_LINE): ui_bell() return def f(view, s): if mode == NORMAL: start = s.b if view.substr(start) == target: start += 1 bracket = find_next_lone_bracket(view, start, brackets, count) if bracket is not None: s = Region(bracket.a) elif mode in (VISUAL, VISUAL_LINE): start = s.b if s.b <= s.a and view.substr(start) == target: start += 1 next_target = find_next_lone_bracket(view, start, brackets) if next_target: if mode == VISUAL: resolve_visual_target(s, next_target.a) elif mode == VISUAL_LINE: resolve_visual_line_target(view, s, next_target.a) return s regions_transformer(view, f)