Example #1
0
def paredit_kill_abstract(view, edit, expression):
    def f(region):
        if not region.a == region.b:
            return shared.erase_region(view, edit, region)

        point = region.a

        (lb, rb) = shared.get_expression(view, point)
        if shared.truthy(lb, rb):
            region = sublime.Region(lb, rb)
            if shared.is_expression_empty(view.substr(region)):
                shared.erase_region(view, edit, region)
                return lb
            elif expression:
                view.erase(edit, sublime.Region(lb + 1, rb - 1))
                return lb + 1
            else:
                view.erase(edit, sublime.Region(point, rb - 1))
                return point
        else:
            line_region = view.line(point)
            a = line_region.begin()
            if not expression:
                a = point
            return shared.erase_region(view, edit,
                                       sublime.Region(a, line_region.end()))

    shared.edit_selections(view, f)
Example #2
0
def paredit_barf_sexp(view, edit, direction):
	def f(region):
		if not region.a == region.b:
			return region
		point = region.a

		(a_exp, b_exp) = shared.get_expression(view, point, direction)

		if a_exp and b_exp:
			(anext_exp, bnext_exp) = reversed(shared.get_next_expression(
				view, shared.step(b_exp, -1 if direction == "backward" else -2, direction), True, shared.opposite_direction(direction)))
			if anext_exp and bnext_exp:
				end_bracket = shared.get_char(view, shared.step(b_exp, -1, direction), direction)

				view.erase(edit, sublime.Region(shared.step(b_exp, -1, direction), b_exp))
				target_point = anext_exp
				for (i, c) in shared.walk(view, shared.step(anext_exp, -1 if direction == "forward" else -2, direction), shared.opposite_direction(direction)):
					if not c.isspace():
						target_point = shared.step(i, 1, direction)
						break

				shared.insert(view, edit, target_point, end_bracket, direction)

		return point

	shared.edit_selections(view, f)
Example #3
0
def paredit_slurp_sexp(view, edit, direction):
    def f(region):
        if not region.a == region.b:
            return region
        point = region.a

        (a_exp, b_exp) = shared.get_expression(view, point, direction)

        if shared.truthy(a_exp, b_exp):
            (anext_exp,
             bnext_exp) = shared.get_next_expression(view, b_exp, True,
                                                     direction)
            if shared.truthy(anext_exp, bnext_exp):
                end_bracket = shared.get_char(
                    view, shared.step(b_exp, -1, direction), direction)
                view.erase(
                    edit,
                    sublime.Region(shared.step(b_exp, -1, direction), b_exp))
                shared.insert(view, edit, shared.step(bnext_exp, -1,
                                                      direction), end_bracket,
                              direction)

        return point

    shared.edit_selections(view, f)
Example #4
0
def paredit_kill_abstract(view, edit, expression):
	def f(region):
		if not region.a == region.b:
			return shared.erase_region(view, edit, region)

		point = region.a

		(lb, rb) = shared.get_expression(view, point)
		if shared.truthy(lb, rb):
			region = sublime.Region(lb, rb)
			if shared.is_expression_empty(view.substr(region)):
				shared.erase_region(view, edit, region)
				return lb
			elif expression:
				view.erase(edit, sublime.Region(lb + 1, rb - 1))
				return lb + 1
			else:
				view.erase(edit, sublime.Region(point, rb - 1))
				return point
		else:
			line_region = view.line(point)
			a = line_region.begin()
			if not expression:
				a = point
			return shared.erase_region(view, edit, sublime.Region(a, line_region.end()))

	shared.edit_selections(view, f)
def paredit_backward_up(view, edit):
	def f(region):
		if not region.a == region.b:
			return region

		(a, b) = shared.get_expression(view, region.a)
		if a:
			return a

	shared.edit_selections(view, f)
def paredit_forward_down(view, edit):
	def f(region):
		if not region.a == region.b:
			return region

		(a, b) = shared.get_next_expression(view, region.a, skip_words=True)
		if a:
			return a + 1

	shared.edit_selections(view, f)
Example #7
0
def paredit_newline(view, edit):
    def f(region):
        s = region.begin()
        e = region.end()

        if not s == e: view.erase(edit, region)
        return shared.remove_spaces(view, edit, s, False)

    shared.edit_selections(view, f)
    view.run_command("lispindentinsertnewline")
Example #8
0
def paredit_newline(view, edit):
	def f(region):
		s = region.begin()
		e = region.end()

		if not s == e: view.erase(edit, region)
		return shared.remove_spaces(view, edit, s, False)

	shared.edit_selections(view, f)
	view.run_command("lispindentinsertnewline")
Example #9
0
def paredit_backward_up(view, edit):
    def f(region):
        if not region.a == region.b:
            return region

        (a, b) = shared.get_expression(view, region.a)
        if a:
            return a

    shared.edit_selections(view, f)
Example #10
0
def paredit_forward_down(view, edit):
    def f(region):
        if not region.a == region.b:
            return region

        (a, b) = shared.get_next_expression(view, region.a, skip_words=True)
        if a:
            return a + 1

    shared.edit_selections(view, f)
def paredit_backward_down(view, edit):
	def f(region):
		if not region.a == region.b:
			return region

		(a, b) = shared.get_previous_expression(view, region.a - 1, skip_words=True)
		if b:
			return b - 1

	shared.edit_selections(view, f)
Example #12
0
def paredit_backward_down(view, edit):
    def f(region):
        if not region.a == region.b:
            return region

        (a, b) = shared.get_previous_expression(view,
                                                region.a - 1,
                                                skip_words=True)
        if b:
            return b - 1

    shared.edit_selections(view, f)
Example #13
0
def paredit_delete(view, edit, is_forward):
    def f(region):
        if not region.begin() == region.end():
            if shared.is_strict_mode():
                return strict_delete_selection(view, edit, region)
            else:
                return shared.erase_region(view, edit, region)

        point = region.begin()

        if is_forward:
            direction = 1
            next_char = view.substr(point)
            skip_char_type = "lbracket"
        else:
            direction = -1
            next_char = view.substr(point - 1)
            skip_char_type = "rbracket"

        next_char_type = shared.char_type(next_char)

        if shared.is_inside_comment(view, point):
            pass  # pass to else below
        elif next_char_type == "string":
            if shared.is_inside_string(view, point):
                if ((not is_forward) and (point - 2 >= 0)
                        and view.substr(point - 2) == "\\"):
                    return shared.erase_region(
                        view, edit, sublime.Region(point, point - 2))
                else:
                    return remove_empty_expression(view, edit, point,
                                                   direction)
            else:
                return region.begin() + direction
        elif shared.is_inside_string(view, point):
            # Same purpose as is_inside_comment above
            # but has to be tested after the elif above.
            if (is_forward and (point + 2 < view.size()) and view.substr(
                    sublime.Region(point, point + 2)) == "\\\""):
                return shared.erase_region(view, edit,
                                           sublime.Region(point, point + 2))
            else:
                pass
        elif next_char_type == skip_char_type:
            return region.begin() + direction
        elif next_char_type:
            return remove_empty_expression(view, edit, point, direction)

        # else
        return standard_delete(view, edit, point, is_forward)

    shared.edit_selections(view, f)
Example #14
0
def paredit_delete(view, edit, is_forward):
	def f(region):
		if not region.begin() == region.end():
			if shared.is_strict_mode():
				return strict_delete_selection(view, edit, region)
			else:
				return shared.erase_region(view, edit, region)

		point = region.begin()

		if is_forward:
			direction = 1
			next_char = view.substr(point)
			skip_char_type = "lbracket"
		else:
			direction = -1
			next_char = view.substr(point - 1)
			skip_char_type = "rbracket"

		next_char_type = shared.char_type(next_char)

		if shared.is_inside_comment(view, point):
			pass # pass to else below
		elif next_char_type == "string":
			if shared.is_inside_string(view, point):
				if ((not is_forward) and
				    (point - 2 >= 0) and
				    view.substr(point - 2) == "\\"):
					return shared.erase_region(view, edit, sublime.Region(point, point - 2))
				else:
					return remove_empty_expression(view, edit, point, direction)
			else:
				return region.begin() + direction
		elif shared.is_inside_string(view, point):
			# Same purpose as is_inside_comment above
			# but has to be tested after the elif above.
			if (is_forward and
			    (point + 2 < view.size()) and
			    view.substr(sublime.Region(point, point + 2)) == "\\\""):
				return shared.erase_region(
					view, edit, sublime.Region(point, point + 2))
			else:
				pass
		elif next_char_type == skip_char_type: return region.begin() + direction
		elif next_char_type:
			return remove_empty_expression(view, edit, point, direction)

		# else
		return standard_delete(view, edit, point, is_forward)

	shared.edit_selections(view, f)
Example #15
0
def paredit_wrap(view, edit, lbracket, rbracket):
	def f(region):
		if not region.a == region.b:
			return insert_brackets(view, edit, lbracket, rbracket, region)

		point = region.a

		(lb, rb) = shared.get_next_expression(view, point)
		if shared.truthy(lb, rb):
			return insert_brackets(view, edit, lbracket, rbracket,
				sublime.Region(lb, rb))

		return point

	shared.edit_selections(view, f)
Example #16
0
def paredit_splice_sexp(view, edit):
	def f(region):
		if not region.a == region.b:
			return region

		point = region.a

		(lb, rb) = shared.get_expression(view, point)
		if lb and rb:
			view.erase(edit, sublime.Region(rb - 1, rb))
			view.erase(edit, sublime.Region(lb, lb + 1))
			return point - 1
		else:
			return point

	shared.edit_selections(view, f)
Example #17
0
def paredit_splice_sexp_killing_forward(view, edit):
	def f(region):
		if not region.a == region.b:
			return region

		point = region.a

		(lb, rb) = shared.get_expression(view, point)
		if shared.truthy(lb, rb):
			view.erase(edit, sublime.Region(point, rb))
			view.erase(edit, sublime.Region(lb, lb + 1))
			return point - 1
		else:
			return point

	shared.edit_selections(view, f)
Example #18
0
def paredit_kill_word(view, edit, is_forward):
	def f(region):
		if not region.a == region.b:
			return region
		point = region.a

		if is_forward:
			(lw, rw) = shared.get_next_word(view, point)
		else:
			(lw, rw) = shared.get_previous_word(view, point)

		if lw and rw:
			return shared.erase_region(view, edit, sublime.Region(lw, rw))

		return region

	shared.edit_selections(view, f)
Example #19
0
def paredit_kill_word(view, edit, is_forward):
    def f(region):
        if not region.a == region.b:
            return region
        point = region.a

        if is_forward:
            (lw, rw) = shared.get_next_word(view, point)
        else:
            (lw, rw) = shared.get_previous_word(view, point)

        if shared.truthy(lw, rw):
            return shared.erase_region(view, edit, sublime.Region(lw, rw))

        return region

    shared.edit_selections(view, f)
Example #20
0
def paredit_doublequote(view, edit):
	def f(region):
		s = region.begin()
		e = region.end()

		if s == e:
			if shared.is_inside_string(view, s):
				view.insert(edit, s, "\\\"")
				return s + 2
			else:
				view.insert(edit, s, "\"\"")
				return s + 1
		else:
			view.insert(edit, s, "\"")
			view.insert(edit, e + 1, "\"")
			return sublime.Region(s + 1, e + 1)

	shared.edit_selections(view, f)
Example #21
0
def paredit_slurp_sexp(view, edit, direction):
	def f(region):
		if not region.a == region.b:
			return region
		point = region.a

		(a_exp, b_exp) = shared.get_expression(view, point, direction)

		if a_exp and b_exp:
			(anext_exp, bnext_exp) = shared.get_next_expression(view, b_exp, True, direction)
			if anext_exp and bnext_exp:
				end_bracket = shared.get_char(view, shared.step(b_exp, -1, direction), direction)
				view.erase(edit, sublime.Region(shared.step(b_exp, -1, direction), b_exp))
				shared.insert(view, edit, shared.step(bnext_exp, -1, direction), end_bracket, direction)

		return point

	shared.edit_selections(view, f)
Example #22
0
def paredit_join_sexp(view, edit):
	def f(region):
		if not region.a == region.b:
			return region
		point = region.a

		(prev_i, prev_char) = shared.get_previous_character(view, point)
		(next_i, next_char) = shared.get_next_character(view, point)

		if (prev_char == ")" and next_char == "(" or
		    prev_char == "]" and next_char == "[" or
		    prev_char == "}" and next_char == "{"):
			return join_sexp(view, edit, prev_i, next_i)
		elif prev_char == "\"" and next_char == "\"":
			return join_sexp(view, edit, prev_i, next_i, False)
		else:
			return shared.remove_spaces(view, edit, point)

	shared.edit_selections(view, f)
Example #23
0
def paredit_join_sexp(view, edit):
    def f(region):
        if not region.a == region.b:
            return region
        point = region.a

        (prev_i, prev_char) = shared.get_previous_character(view, point)
        (next_i, next_char) = shared.get_next_character(view, point)

        if (prev_char == ")" and next_char == "("
                or prev_char == "]" and next_char == "["
                or prev_char == "}" and next_char == "{"):
            return join_sexp(view, edit, prev_i, next_i)
        elif prev_char == "\"" and next_char == "\"":
            return join_sexp(view, edit, prev_i, next_i, False)
        else:
            return shared.remove_spaces(view, edit, point)

    shared.edit_selections(view, f)
Example #24
0
def paredit_kill_abstract(view, edit, expression):
	def f(region):
		if not region.a == region.b:
			return shared.erase_region(view, edit, region)

		point = region.a

		(lb, rb) = shared.get_expression(view, point)
		if lb and rb:
			if expression:
				view.erase(edit, sublime.Region(lb + 1, rb - 1))
				return lb + 1
			else:
				view.erase(edit, sublime.Region(point, rb - 1))
				return point
		else:
			return point

	shared.edit_selections(view, f)
Example #25
0
def paredit_split_sexp(view, edit):
    def f(region):
        if not region.a == region.b:
            return region
        point = region.a

        (lb, rb) = shared.get_expression(view, point)

        if shared.truthy(lb, rb):
            lc = view.substr(lb)
            rc = view.substr(rb - 1)
            if lc == "\"":
                spaces_start = point
            else:
                spaces_start = shared.remove_spaces(view, edit, point)
            return insert_split_brackets(view, edit, lc, rc, spaces_start)

        return point

    shared.edit_selections(view, f)
Example #26
0
def paredit_doublequote(view, edit):
    def f(region):
        s = region.begin()
        e = region.end()

        if s == e:
            if view.substr(s) == "\"":
                return s + 1
            elif shared.is_inside_string(view, s):
                view.insert(edit, s, "\\\"")
                return s + 2
            else:
                view.insert(edit, s, "\"\"")
                return s + 1
        else:
            view.insert(edit, s, "\"")
            view.insert(edit, e + 1, "\"")
            return sublime.Region(s + 1, e + 1)

    shared.edit_selections(view, f)
Example #27
0
def paredit_split_sexp(view, edit):
	def f(region):
		if not region.a == region.b:
			return region
		point = region.a

		(lb, rb) = shared.get_expression(view, point)

		if shared.truthy(lb, rb):
			lc = view.substr(lb)
			rc = view.substr(rb - 1)
			if lc == "\"":
				spaces_start = point
			else:
				spaces_start = shared.remove_spaces(view, edit, point)
			return insert_split_brackets(view, edit, lc, rc, spaces_start)

		return point

	shared.edit_selections(view, f)
Example #28
0
def paredit_close(view, edit, left_bracket, right_bracket):
	def f(region):
		if not region.a == region.b:
			return region

		point = region.begin()

		if (shared.is_inside_string(view, point) or
		    shared.is_inside_comment(view, point)):
			view.insert(edit, point, right_bracket)
			return point + 1

		(lb, rb) = shared.find_enclosing_brackets(
			view, region.begin(), left_bracket, right_bracket)

		if rb:
			return paredit_close_remove_spaces(view, edit, rb)
		else:
			return region

	shared.edit_selections(view, f)
Example #29
0
def paredit_raise_sexp(view, edit):
	def f(region):
		if not region.a == region.b:
			return region

		point = region.a

		(lb, rb) = shared.get_expression(view, point)
		if shared.truthy(lb, rb):
			(lexp, rexp) = shared.get_next_expression(view, point)
			
			lexp = lexp or point
			rexp = rexp or point

			view.erase(edit, sublime.Region(rexp, rb))
			view.erase(edit, sublime.Region(lb, lexp))
			return lb
		else:
			return point

	shared.edit_selections(view, f)
Example #30
0
def paredit_open(view, edit, left_bracket, right_bracket):
    def f(region):
        begin = region.begin()
        end = region.end()

        if shared.is_strict_mode():
            text = view.substr(region)
            if not (shared.bracket_count(text, "(", ")") == 0
                    and shared.bracket_count(text, "[", "]") == 0
                    and shared.bracket_count(text, "{", "}") == 0):
                return region

        view.insert(edit, begin, left_bracket)

        if not (begin == end and (shared.is_inside_string(view, begin)
                                  or shared.is_inside_comment(view, begin))):
            view.insert(edit, end + 1, right_bracket)

        return begin + 1

    shared.edit_selections(view, f)
Example #31
0
def paredit_move(view, edit, direction):
    def f(region):
        if not region.a == region.b:
            return region

        point = region.a

        if shared.is_inside_string(view, point):
            (a, b) = shared.get_expression(view, point, direction)
            target_point = shared.step(b, -1, direction)
            if point == target_point:
                return shared.step(point, 1, direction)
            return shared.step(b, -1, direction)

        if direction == "backward":
            point -= 1

        (word_a, word_b) = shared.get_word(view, point, direction)
        if shared.truthy(word_b):
            return word_b

        (next_a, next_b) = shared.get_next_expression(view, point, False,
                                                      direction)
        if shared.truthy(next_b):
            return next_b

        expr_point = point
        if direction == "backward":
            expr_point += 1

        (a, b) = shared.get_expression(view, expr_point, direction)
        if shared.truthy(b): return b

        if direction == "forward":
            return shared.step(point, 1, direction)
        else:
            return point

    shared.edit_selections(view, f)
Example #32
0
def paredit_comment_dwim(view, edit):
    def f(region):
        if not region.a == region.b:
            return region
        point = region.a

        line = view.line(point)
        last_char_i = line.end() - 1
        if not last_char_i >= 0:
            return add_comment(view, edit, line)

        comment_region = shared.is_inside_comment(view, last_char_i)
        if not comment_region:
            return add_comment(view, edit, line)

        for (i, c) in shared.walk_right(view, comment_region.begin() + 1):
            if not c == " ":
                return i

        return comment_region.begin() + 1

    shared.edit_selections(view, f)
Example #33
0
def paredit_open(view, edit, left_bracket, right_bracket):
	def f(region):
		begin = region.begin()
		end = region.end()

		if shared.is_strict_mode():
			text = view.substr(region)
			if not (shared.bracket_count(text, "(", ")") == 0 and
			        shared.bracket_count(text, "[", "]") == 0 and
			        shared.bracket_count(text, "{", "}") == 0):
				return region

		view.insert(edit, begin, left_bracket)

		if not (begin == end and
		        (shared.is_inside_string(view, begin) or
		         shared.is_inside_comment(view, begin))):
			view.insert(edit, end + 1, right_bracket)

		return begin + 1

	shared.edit_selections(view, f)
Example #34
0
def paredit_move(view, edit, direction):
	def f(region):
		if not region.a == region.b:
			return region

		point = region.a

		if shared.is_inside_string(view, point):
			(a, b) = shared.get_expression(view, point, direction)
			target_point = shared.step(b, -1, direction)
			if point == target_point:
				return shared.step(point, 1, direction)
			return shared.step(b, -1, direction)

		if direction == "backward":
			point -= 1

		(word_a, word_b) = shared.get_word(view, point, direction)
		if word_b:
			return word_b

		(next_a, next_b) = shared.get_next_expression(view, point, False, direction)
		if next_b:
			return next_b

		expr_point = point
		if direction == "backward":
			expr_point += 1

		(a, b) = shared.get_expression(view, expr_point, direction)
		if b:
			return b

		if direction == "forward":
			return shared.step(point, 1, direction)
		else:
			return point

	shared.edit_selections(view, f)
Example #35
0
def paredit_comment_dwim(view, edit):
	def f(region):
		if not region.a == region.b:
			return region
		point = region.a

		line = view.line(point)
		last_char_i = line.end() - 1
		if not last_char_i >= 0:
			return add_comment(view, edit, line)

		comment_region = shared.is_inside_comment(view, last_char_i)
		if not comment_region:
			return add_comment(view, edit, line)

		for (i, c) in shared.walk_right(view, comment_region.begin() + 1):
			if not c == " ":
				return i

		return comment_region.begin() + 1

	shared.edit_selections(view, f)
Example #36
0
def paredit_barf_sexp(view, edit, direction):
    def f(region):
        if not region.a == region.b:
            return region
        point = region.a

        (a_exp, b_exp) = shared.get_expression(view, point, direction)

        if shared.truthy(a_exp, b_exp):
            (anext_exp, bnext_exp) = reversed(
                shared.get_next_expression(
                    view,
                    shared.step(b_exp, -1 if direction == "backward" else -2,
                                direction), True,
                    shared.opposite_direction(direction)))
            if shared.truthy(anext_exp, bnext_exp):
                end_bracket = shared.get_char(
                    view, shared.step(b_exp, -1, direction), direction)

                view.erase(
                    edit,
                    sublime.Region(shared.step(b_exp, -1, direction), b_exp))
                target_point = anext_exp
                for (i, c) in shared.walk(
                        view,
                        shared.step(anext_exp,
                                    -1 if direction == "forward" else -2,
                                    direction),
                        shared.opposite_direction(direction)):
                    if not c.isspace():
                        target_point = shared.step(i, 1, direction)
                        break

                shared.insert(view, edit, target_point, end_bracket, direction)

        return point

    shared.edit_selections(view, f)
Example #37
0
def paredit_close(view, edit, left_bracket, right_bracket):
    def f(region):
        if not region.a == region.b:
            return region

        point = region.begin()

        if (shared.is_inside_string(view, point)
                or shared.is_inside_comment(view, point)):
            view.insert(edit, point, right_bracket)
            return point + 1

        (lb, rb) = shared.find_enclosing_brackets(view, region.begin(),
                                                  left_bracket, right_bracket)

        if shared.truthy(rb):
            return paredit_close_remove_spaces(view, edit, rb)
        elif shared.truthy(lb):
            view.insert(edit, point, right_bracket)
            return point + 1
        else:
            return region

    shared.edit_selections(view, f)