Moved completers to new dir; improved completers and added word completion

This commit is contained in:
2026-02-16 01:39:23 -06:00
parent 5273c58ed6
commit b922415f98
35 changed files with 669 additions and 44 deletions

View File

@@ -51,7 +51,7 @@ class ProviderResponseCacheBase:
text: str = "",
info: str = "",
completion: any = None
):
) -> dict:
if not label or not text: return
comp_item = GtkSource.CompletionItem.new()
@@ -69,19 +69,51 @@ class ProviderResponseCacheBase:
return comp_item
def get_word(self, context):
start_iter = context.get_iter()
end_iter = None
def get_all_marks(self, buffer):
marks = []
iter_ = buffer.get_start_iter()
if not isinstance(start_iter, Gtk.TextIter):
_, start_iter = context.get_iter()
end_iter = start_iter.copy()
while iter_:
marks = iter_.get_marks()
for mark in marks:
if mark and mark not in marks:
marks.append(mark)
if not iter_.forward_char():
break
return marks
def get_all_insert_marks(self, buffer):
marks = []
iter_ = buffer.get_start_iter()
while iter_:
marks = iter_.get_marks()
for mark in marks:
if mark.get_name() and "multi_insert_" in mark.get_name():
marks.append(mark)
if not iter_.forward_char():
break
return marks
def get_word(self, context) -> str:
start_iter = self.get_iter_correctly(context)
end_iter = start_iter.copy()
if not start_iter.starts_word():
start_iter.backward_word_start()
end_iter.forward_word_end()
if not end_iter.ends_word():
end_iter.forward_word_end()
buffer = start_iter.get_buffer()
return buffer.get_text(start_iter, end_iter, False)
def get_iter_correctly(self, context):
return context.get_iter()[1] if isinstance(context.get_iter(), tuple) else context.get_iter()

View File

@@ -45,10 +45,13 @@ class CompletionController(ControllerBase):
def register_completer(self, completer: GtkSource.Completion):
self._completers.append(completer)
completer.add_provider(self.words_provider)
# completer.add_provider(self.words_provider)
for provider in self._providers.values():
completer.add_provider(provider)
def unregister_completer(self, completer: GtkSource.Completion):
self._completers.remove(completer)
def register_provider(
self,
provider_name: str,

View File

@@ -34,6 +34,9 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
if not self.insert_markers: return False
buffer = file.buffer
if buffer.is_processing_completion:
self.insert_completion_text(buffer, text)
return True
# freeze buffer and insert to each mark (if any)
buffer.block_insert_after_signal()
@@ -49,6 +52,32 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
return True
def insert_completion_text(self, buffer, text):
buffer.is_processing_completion = False
# freeze buffer and insert to each mark (if any)
buffer.block_insert_after_signal()
buffer.begin_user_action()
with buffer.freeze_notify():
for mark in self.insert_markers:
end_itr = buffer.get_iter_at_mark(mark)
start_itr = end_itr.copy()
if not start_itr.starts_word():
start_itr.backward_word_start()
if not end_itr.ends_word():
end_itr.forward_word_end()
buffer.delete(start_itr, end_itr)
buffer.insert(end_itr, text, -1)
buffer.end_user_action()
buffer.unblock_insert_after_signal()
return True
def move_cursor(self, source_view, step, count, extend_selection, emit):
buffer = source_view.get_buffer()
@@ -95,7 +124,7 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
return False
is_future = key_mapper._key_release_event(eve)
if is_future: return False
if is_future: return True
command = key_mapper._key_press_event(eve)
if not command: return False
@@ -108,7 +137,7 @@ class SourceViewsMultiInsertState(MarkEventsMixin):
command = key_mapper._key_release_event(eve)
is_past = key_mapper._key_press_event(eve)
if is_past: return False
if is_past: return True
if not command: return False
source_view.command.exec(command)

View File

@@ -13,6 +13,8 @@ class SourceBuffer(GtkSource.Buffer):
def __init__(self):
super(SourceBuffer, self).__init__()
self.is_processing_completion: bool = False
self._handler_ids = []