示例#1
0
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)
示例#2
0
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)
示例#3
0
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])
示例#4
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)
示例#5
0
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)
示例#6
0
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)
示例#8
0
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)