在SublimeText上键入一个点时,自动完成列表重置

时间:2017-06-26 13:31:17

标签: sublimetext3 sublimetext sublime-text-plugin package-control sublimetext-snippet

我实现了一个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"之前。我希望我的脚本能够考虑点之前键入的内容。

很难解释。你知道我需要做什么吗?

编辑:

以下是它的作用:

enter image description here

你可以在这里看到" tf"没有突出显示。

1 个答案:

答案 0 :(得分:2)

通常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