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_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)
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)
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)
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")
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)