98 lines
2.6 KiB
Python
98 lines
2.6 KiB
Python
|
|
# Python imports
|
||
|
|
|
||
|
|
# Lib imports
|
||
|
|
|
||
|
|
# Application imports
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
class Autopairs:
|
||
|
|
def __init__(self):
|
||
|
|
...
|
||
|
|
|
||
|
|
def handle_word_wrap(self, buffer, char_str: str):
|
||
|
|
wrap_block = self.get_wrap_block(char_str)
|
||
|
|
if not wrap_block: return
|
||
|
|
|
||
|
|
selection = buffer.get_selection_bounds()
|
||
|
|
if not selection:
|
||
|
|
self.insert_pair(buffer, char_str, wrap_block)
|
||
|
|
return True
|
||
|
|
|
||
|
|
self.wrap_selection(buffer, char_str, wrap_block, selection)
|
||
|
|
|
||
|
|
return True
|
||
|
|
|
||
|
|
def insert_pair(
|
||
|
|
self, buffer, char_str: str, wrap_block: tuple
|
||
|
|
):
|
||
|
|
buffer.begin_user_action()
|
||
|
|
|
||
|
|
left_block, right_block = wrap_block
|
||
|
|
insert_mark = buffer.get_insert()
|
||
|
|
|
||
|
|
insert_itr = buffer.get_iter_at_mark(insert_mark)
|
||
|
|
buffer.insert(insert_itr, f"{left_block}{right_block}")
|
||
|
|
insert_itr = buffer.get_iter_at_mark( insert_mark )
|
||
|
|
insert_itr.backward_char()
|
||
|
|
|
||
|
|
buffer.place_cursor(insert_itr)
|
||
|
|
|
||
|
|
buffer.end_user_action()
|
||
|
|
|
||
|
|
def wrap_selection(
|
||
|
|
self, buffer, char_str: str, wrap_block: tuple, selection
|
||
|
|
):
|
||
|
|
left_block, \
|
||
|
|
right_block = wrap_block
|
||
|
|
start_itr, \
|
||
|
|
end_itr = selection
|
||
|
|
data = buffer.get_text(
|
||
|
|
start_itr, end_itr, include_hidden_chars = False
|
||
|
|
)
|
||
|
|
start_mark = buffer.create_mark("startclose", start_itr, False)
|
||
|
|
end_mark = buffer.create_mark("endclose", end_itr, True)
|
||
|
|
|
||
|
|
buffer.begin_user_action()
|
||
|
|
|
||
|
|
buffer.insert(start_itr, left_block)
|
||
|
|
end_itr = buffer.get_iter_at_mark(end_mark)
|
||
|
|
buffer.insert(end_itr, right_block)
|
||
|
|
|
||
|
|
start = buffer.get_iter_at_mark(start_mark)
|
||
|
|
end = buffer.get_iter_at_mark(end_mark)
|
||
|
|
|
||
|
|
buffer.select_range(start, end)
|
||
|
|
buffer.delete_mark_by_name("startclose")
|
||
|
|
buffer.delete_mark_by_name("endclose")
|
||
|
|
|
||
|
|
buffer.end_user_action()
|
||
|
|
|
||
|
|
def get_wrap_block(self, char_str) -> tuple:
|
||
|
|
left_block = ""
|
||
|
|
right_block = ""
|
||
|
|
|
||
|
|
match char_str:
|
||
|
|
case "(" | ")":
|
||
|
|
left_block = "("
|
||
|
|
right_block = ")"
|
||
|
|
case "[" | "]":
|
||
|
|
left_block = "["
|
||
|
|
right_block = "]"
|
||
|
|
case "{" | "}":
|
||
|
|
left_block = "{"
|
||
|
|
right_block = "}"
|
||
|
|
case '"':
|
||
|
|
left_block = '"'
|
||
|
|
right_block = '"'
|
||
|
|
case "'":
|
||
|
|
left_block = "'"
|
||
|
|
right_block = "'"
|
||
|
|
case "`":
|
||
|
|
left_block = "`"
|
||
|
|
right_block = "`"
|
||
|
|
case _:
|
||
|
|
return ()
|
||
|
|
|
||
|
|
return left_block, right_block
|