Список автозаполнения RESET при наборе точки на SublimeText
Я реализовал плагин SublimeText для автозаполнения:
import sublime_plugin
import sublime
tensorflow_functions = ["tf.test","tf.AggregationMethod","tf.Assert","tf.AttrValue", (etc....)]
class TensorflowAutocomplete(sublime_plugin.EventListener):
def __init__(self):
self.tf_completions = [("%s \tTensorflow" % s, s) for s in tensorflow_functions]
def on_query_completions(self, view, prefix, locations):
if view.match_selector(locations[0], 'source.python'):
return self.tf_completions
else:
return[]
Это прекрасно работает, но проблема в том, когда я набираю "." это сбрасывает предложения завершения.
Например, я набираю "tf", он предлагает мне весь мой пользовательский список, но затем я набираю "tf". это предлагает мне список, поскольку я не печатал "tf" прежде. Я хочу, чтобы мой сценарий учитывал то, что было напечатано перед точками.
Это трудно объяснить. Ты хоть представляешь, что мне нужно делать?
РЕДАКТИРОВАТЬ:
Вот что он делает:
Вы можете видеть здесь, что "TF" не выделен.
1 ответ
Обычно Sublime Text заменяет все до последнего разделителя слов (то есть точки) и вставляет текст завершения.
Если вы хотите вставить завершение с разделителем слов, вам просто нужно удалить содержимое, которое не будет заменено. Так что вы просто смотрите на строку раньше, извлекаете текст перед последней точкой, фильтруете и удаляете свои завершения. Это мой общий шаблон, чтобы сделать это:
import re
import sublime_plugin
import sublime
tensorflow_functions = ["tf.AggregationMethod()","tf.Assert()","tf.AttrValue()","tf.AttrValue.ListValue()"]
RE_TRIGGER_BEFORE = re.compile(
r"\w*(\.[\w\.]+)"
)
class TensorflowAutocomplete(sublime_plugin.EventListener):
def __init__(self):
self.tf_completions = [("%s \tTensorflow" % s, s) for s in tensorflow_functions]
def on_query_completions(self, view, prefix, locations):
loc = locations[0]
if not view.match_selector(loc, 'source.python'):
return
completions = self.tf_completions
# get the inverted line before the location
line_before_reg = sublime.Region(view.line(loc).a, loc)
line_before = view.substr(line_before_reg)[::-1]
# check if it matches the trigger
m = RE_TRIGGER_BEFORE.match(line_before)
if m:
# get the text before the .
trigger = m.group(1)[::-1]
# filter and strip the completions
completions = [
(c[0], c[1][len(trigger):]) for c in completions
if c[1].startswith(trigger)
]
return completions