diff --git a/core/handler/completion_workspace_symbol.py b/core/handler/completion_workspace_symbol.py index 14a875d52b..656442fdf6 100644 --- a/core/handler/completion_workspace_symbol.py +++ b/core/handler/completion_workspace_symbol.py @@ -1,5 +1,6 @@ from core.handler import Handler from core.utils import * +from functools import cmp_to_key class CompletionWorkspaceSymbol(Handler): @@ -8,11 +9,24 @@ class CompletionWorkspaceSymbol(Handler): provider = "workspace_symbol_provider" def process_request(self, lsp_server, query) -> dict: + self.prefix = query self.lsp_server = lsp_server self.lsp_server_name = self.lsp_server.server_info["name"] query = ''.join(query.split()) return dict(query=query) + def compare_candidates(self, x, y): + prefix = self.prefix.lower() + x_label, y_label = x["label"].lower(), y["label"].lower() + x_include_prefix, y_include_prefix = x_label.startswith(prefix), y_label.startswith(prefix) + + # Sort by prefix. + if x_include_prefix != y_include_prefix: + return -1 if x_include_prefix else 1 + + # Sort by length. + return -1 if len(x_label) < len(y_label) else (1 if len(x_label) > len(y_label) else 0) + def process_response(self, response: dict) -> None: if response is not None: completion_symbols = [] @@ -32,6 +46,8 @@ def process_response(self, response: dict) -> None: completion_symbols.append(symbol) + completion_symbols = sorted(completion_symbols, key=cmp_to_key(self.compare_candidates)) + if len(completion_symbols) > 0: eval_in_emacs("lsp-bridge-completion-workspace-symbol--record-items", self.file_action.filepath,