在 Sublime Text 上键入点时自动完成列表重置
Autocompletion list RESET when typing a dot on 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" 未突出显示。
通常 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
我实现了一个 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" 未突出显示。
通常 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