Список автодополнения 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» не выделено.


person Baptiste Arnaud    schedule 26.06.2017    source источник
comment
Вы можете попробовать удалить . из настройки word_separators и посмотреть, к чему это приведет. Если это поможет, вы можете сделать это в настройках, специфичных для синтаксиса, чтобы это не вызывало непредвиденных последствий в другом месте,   -  person OdatNurd    schedule 26.06.2017


Ответы (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
person r-stein    schedule 26.06.2017
comment
Спасибо за Ваш ответ. К сожалению, это не работает! Поскольку я действительно не понимаю, что происходит, я не могу отладить это. Любая идея, где может быть ошибка? - person Baptiste Arnaud; 26.06.2017
comment
Если я создам новый плагин и скопирую туда весь код, он добавит автодополнение к файлам python, а также будет работать с дополнениями с префиксом tf.. Что именно не работает? Есть ли у вас вывод в консоль ST ctrl+` ? - person r-stein; 26.06.2017
comment
вывод консоли: текущее имя триггера: 'python-calltip-call-signature' текущее имя триггера: 'python-complete-local-symbols' текущее имя триггера: 'python-complete-object-members'. Нет ошибок. я отредактировал свой вопрос - person Baptiste Arnaud; 26.06.2017
comment
Да не подсвечивается, а фильтруется и вставляется правильно? Вы не можете выделить его, только отделите его от видимого текста. - person r-stein; 26.06.2017
comment
Текст в представлении перед последним . извлекается и сохраняется в trigger (например, tf. или tf.contrib.). После этого этот триггер удаляется из завершений (c[1][len(trigger):]), а список завершений фильтруется, чтобы начать с этого триггера (if c[1].startswith(trigger)). - person r-stein; 27.06.2017