def cleanup_completion(view, post_remove): expression = Context.get_context(view) # remove path query completely final_path = Completion.get_final_path(expression["needle"], post_remove) log("post cleanup path:'", expression.get("needle"), "' ~~> '", final_path, "'") # replace current query with final path view.run_command("ffp_replace_region", { "a": expression["region"].a, "b": expression["region"].b, "string": final_path })
def on_query_completions(self, view, prefix, locations): if config["DISABLE_AUTOCOMPLETION"] and not Query.by_command(): return False if self.is_project_file: completions = query_completions(view, self.project_folder, self.current_folder) if completions: # st2 - update current path self.post_remove = Context.get_context(view)["needle"] return completions else: verbose("disabled or not a project", self.is_project_file) return False
def on_modified(self, view): if not Completion.is_active(): return False # completions given and not yet inserted command = view.command_history(0) command_name = str(command[0]) # stop completion if command_name == "hide_auto_complete": Completion.stop() # keep tracking current needle elif command_name == "insert": self.post_remove = Context.get_context(view)["needle"] # print("tracking...") elif not command_name or command_name in config["TRIGGER_ACTION"] or command_name in config["INSERT_ACTION"]: # on post text command # check if a completion is inserted and trigger on_post_insert_completion cleanup_completion(view, self.post_remove) Completion.stop()
def query_completions(view, project_folder, current_folder): global Context, Selection current_scope = Selection.get_scope(view) if not Query.by_command(): triggers = get_matching_autotriggers(current_scope, config["TRIGGER"]) else: triggers = config["TRIGGER"] if not bool(triggers): log("abort query, no valid scope-regex for current context") return False # parse current context, may contain 'is_valid: False' expression = Context.get_context(view) # check if there is a trigger for the current expression trigger = Context.find_trigger(expression, current_scope, triggers) # expression | trigger | force | ACTION | CURRENT # -----------|----------|-------|-------------------|-------- # invalid | False | False | abort | abort # invalid | False | True | query needle | abort # invalid | True | False | query | # invalid | True | True | query +override | # valid | False | False | abort | abort # valid | False | True | query needle | abort # valid | True | False | query | # valid | True | True | query +override | # currently trigger is required in Query.build if trigger is False: log("abort completion, no trigger found") return False if not expression["valid_needle"]: word = Selection.get_word(view) expression["needle"] = re.sub("[^\.A-Za-z0-9\-\_$]", "", word) log("changed invalid needle to {0}".format(expression["needle"])) else: log("context evaluation {0}".format(expression)) if Query.build(expression.get("needle"), trigger, current_folder, project_folder) is False: # query is valid, but may not be triggered: not forced, no auto-options log("abort valid query: auto trigger disabled") return False if Query.base_path: Query.base_path = str(Query.base_path) completions = project_files.search_completions(Query.needle, project_folder, Query.extensions, Query.base_path) if completions and len(completions[0]) > 0: Completion.start(Query.replace_on_insert) view.run_command('_enter_insert_mode') # vintageous log("=> {0} completions found".format(len(completions))) else: sublime.status_message("FFP no filepaths found for '" + Query.needle + "'") Completion.stop() log("=> no valid files found for needle: {0}".format(Query.needle)) log("") Query.reset() return completions