Skip to content

Instantly share code, notes, and snippets.

@gamefreak
Created April 11, 2013 19:31
Show Gist options
  • Save gamefreak/5366475 to your computer and use it in GitHub Desktop.
Save gamefreak/5366475 to your computer and use it in GitHub Desktop.
import sublime, sublime_plugin
import glob, re, json, difflib
import heapq
def pdir(obj):
print(dir(obj))
def pdirl(obj):
ll = dir(obj)
print(repr(obj),'= [')
for key in dir(obj):
print("\t%s," % key)
print(']')
def ppobj(obj):
if isinstance(obj, (type, type(re))):
base = obj.__dict__
else:
base = obj.__class__.__dict__
print("%s = {" % (repr(obj)))
for key in base:
print("\t%s:" % key)
print("\t\t%.200s," % repr(base[key]))
print("}")
comp_list_ext="sublime-completion-list"
completion_table = {}
def plugin_loaded():
print("Loaded BetterCompletions")
reload_completions()
def reload_completions():
completion_table = {}
files=sublime.find_resources("*.sublime-completion-list")
print(files)
print(completion_table)
for filename in files:
print("Loading: ", filename)
load_file(filename)
def load_file(filename):
file = sublime.load_resource(filename)
blob = json.loads(file)
for group in blob:
scope_name = group["scope"]
if scope_name in completion_table:
scope = completion_table[scope_name]
else:
scope = set()
completion_table[scope_name] = scope
for entry in group["completions"]:
scope.update(decode_entry(entry))
def decode_entry(entry):
trigger,content,label = None,None,None
if type(entry) is str:
trigger = content = entry
elif type(entry) is list:
if len(entry) == 2:
trigger, content = entry
else:
trigger,content,label,*_ = entry
else:
trigger = entry["trigger"]
content = entry["contents"]
if "desc" in entry:
label = entry["desc"]
return [(trig,content,label) for trig in trigger.split('|')]
class BetterCompletions(sublime_plugin.EventListener):
def on_post_save(self, view):
print("Detected save: ",view.file_name())
if re.match(r".*\."+comp_list_ext, view.file_name()):
reload_completions()
def on_query_completions(self, view, prefix, locations):
matcher = difflib.SequenceMatcher()
matcher.set_seq2(prefix)
entries = []
keys = (key for key in completion_table.keys() if view.score_selector(locations[0], key))
for key in keys:
for entry in completion_table[key]:
matcher.set_seq1(entry[0])
ratio = matcher.ratio()
if ratio > 0:
entries.append((ratio,entry))
matches = heapq.nlargest(40, entries)
result = [((trigger+"\t"+desc if desc is not None else trigger), repl) for (w,(trigger,repl,desc)) in matches]
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment