From 2bd396fc2beb873f99422ac306387aba19c96332 Mon Sep 17 00:00:00 2001 From: Lu-Jiejie Date: Fri, 11 Jul 2025 00:29:08 +0800 Subject: [PATCH 1/9] feat: add pre-configured acronyms list for program suggestions. --- SettingsTemplate.yaml | 14 ++++++++++++++ src/core/config.py | 11 ++++++++++- src/core/factory.py | 35 ++++++++++++----------------------- src/core/main.py | 9 ++++++--- 4 files changed, 42 insertions(+), 27 deletions(-) diff --git a/SettingsTemplate.yaml b/SettingsTemplate.yaml index a2840d4..42f044b 100644 --- a/SettingsTemplate.yaml +++ b/SettingsTemplate.yaml @@ -13,3 +13,17 @@ body: Each application needs both DOWNLOAD and STORAGE entries. defaultValue: "" + - type: textarea + attributes: + name: acronyms_list + label: Acronyms List + description: > + Configure the list of acronyms. + + It will be displayed when the plugin is activated. + + Each acronym should be defined on a new line. + + Keep empty to display the default program suggestions. + + diff --git a/src/core/config.py b/src/core/config.py index dbb08bd..6141f9e 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -1,6 +1,9 @@ from click import UsageError from .jsonrpc import settings +from .logger import get_logger + +logger = get_logger() class Config(dict): @@ -10,9 +13,11 @@ def __init__(self): def _parse_settings(self) -> None: """解析从 Flow Launcher 获取的配置""" - flow_settings = settings() # 直接从 jsonrpc 获取 + flow_settings = settings() if not flow_settings: return + + # 解析 program_path 配置 program_path = flow_settings.get("program_path", "") if program_path: # 解析多行配置,格式如: KEY=VALUE\nKEY2=VALUE2 @@ -21,6 +26,10 @@ def _parse_settings(self) -> None: if line and "=" in line: key, value = line.split("=", 1) self[key.strip()] = value.strip() + # 解析 acronyms_list 配置 + acronyms_list = flow_settings.get("acronyms_list", "") + if acronyms_list: + self["acronyms_list"] = [s.strip() for s in acronyms_list.split("\n") if s.strip()] def get(self, key: str) -> str: """获取配置值,如果不存在则抛出异常""" diff --git a/src/core/factory.py b/src/core/factory.py index 27b708b..90ee577 100644 --- a/src/core/factory.py +++ b/src/core/factory.py @@ -46,36 +46,25 @@ def get_application_acronyms(cls) -> Dict[str, str]: return ApplicationRegistry.get_acronyms_map() @classmethod - def get_application_message(cls) -> List[Dict[str, str]]: - """获得所有applications的消息列表 - Returns: - [ - { - "title": "VSCODE", - "subTitle": "vsc", - "icoPath": "icons/app.png", - "jsonRPCAction": { - "method": "Flow.Launcher.ChangeQuery", - "parameters": ["r vsc", False], - "dontHideAfterAction": True, - }, - "score": 0, - }, - ] + def get_application_message(cls, acronyms_list): + """ + 根据传入的 acronyms_list 生成 Flow Launcher 消息列表。 + 如果未传入,则展示所有支持的应用。 """ - application_dict = ConcreteFactory.get_application_acronyms() - keys = list(application_dict.keys()) + acronyms_dict = cls.get_application_acronyms() + if acronyms_list is None: + acronyms_list = list(acronyms_dict.keys()) return [ { - "title": application_dict[keys[i]], - "subTitle": keys[i], - "icoPath": f"icons/{keys[i]}_icon.png", + "title": acronyms_dict.get(acronyms, acronyms), + "subTitle": acronyms, + "icoPath": f"icons/{acronyms}_icon.png", "jsonRPCAction": { "method": "Flow.Launcher.ChangeQuery", - "parameters": [f"r {keys[i]}", False], + "parameters": [f"r {acronyms} ", False], "dontHideAfterAction": True, }, "score": 0, } - for i in range(len(keys)) + for acronyms in acronyms_list ] diff --git a/src/core/main.py b/src/core/main.py index 9097a75..128d156 100644 --- a/src/core/main.py +++ b/src/core/main.py @@ -23,9 +23,12 @@ def query(self, param: str) -> List[Dict[str, str]]: args = param.strip() acronyms_dict = ConcreteFactory.get_application_acronyms() - # 遍历显示 + # 如果没有输入参数,则根据 acronyms_list 展示建议列表 if len(args) == 0: - return ConcreteFactory.get_application_message() + acronyms_list = config.get("acronyms_list") if "acronyms_list" in config else None + logger.debug(f"acronyms_list: {acronyms_list}") + return ConcreteFactory.get_application_message(acronyms_list) + acronyms = args.split(" ")[0] if acronyms not in acronyms_dict.keys(): @@ -48,7 +51,7 @@ def query(self, param: str) -> List[Dict[str, str]]: "{0} app_download or app_storage is None".format(app_name) + str(e), "Please check your settings", ) - logger.debug(f"app_download: {app_download}, app_storage: {app_storage}") + # 读取recent_projects try: app = ConcreteFactory.create_app(app_name, app_download, app_storage) From d99abe3fd832a6ac9c3677de9bf6b21b99aee051 Mon Sep 17 00:00:00 2001 From: Lu-Jiejie Date: Fri, 11 Jul 2025 00:34:22 +0800 Subject: [PATCH 2/9] feat: only display applications with user-configured paths in default program suggestions --- src/core/factory.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/core/factory.py b/src/core/factory.py index 90ee577..a72245f 100644 --- a/src/core/factory.py +++ b/src/core/factory.py @@ -49,11 +49,19 @@ def get_application_acronyms(cls) -> Dict[str, str]: def get_application_message(cls, acronyms_list): """ 根据传入的 acronyms_list 生成 Flow Launcher 消息列表。 - 如果未传入,则展示所有支持的应用。 + 如果未传入,则只展示用户已配置路径的应用。 """ + from src.core.config import config + acronyms_dict = cls.get_application_acronyms() if acronyms_list is None: - acronyms_list = list(acronyms_dict.keys()) + acronyms_list = [] + # 遍历所有应用的缩写,检查用户配置 + for acr, app_name in acronyms_dict.items(): + download_key = app_name + "_DOWNLOAD" + storage_key = app_name + "_STORAGE" + if download_key in config and storage_key in config: + acronyms_list.append(acr) return [ { "title": acronyms_dict.get(acronyms, acronyms), From 124a287cc4d5298e7bb88d1a908ae2764ee9c3b1 Mon Sep 17 00:00:00 2001 From: Lu-Jiejie Date: Fri, 11 Jul 2025 00:49:59 +0800 Subject: [PATCH 3/9] feat: add configurable plugin keyword for program suggestions --- SettingsTemplate.yaml | 9 +++++++++ src/core/config.py | 8 ++++++-- src/core/factory.py | 4 ++-- src/core/main.py | 7 +++---- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/SettingsTemplate.yaml b/SettingsTemplate.yaml index 42f044b..a3d0c7b 100644 --- a/SettingsTemplate.yaml +++ b/SettingsTemplate.yaml @@ -25,5 +25,14 @@ body: Each acronym should be defined on a new line. Keep empty to display the default program suggestions. + - type: input + attributes: + name: plugin_keyword + label: Plugin Keyword + description: > + The keyword to trigger the plugin. + + If you change it, please update here as well. + defaultValue: "r" diff --git a/src/core/config.py b/src/core/config.py index 6141f9e..bb2261a 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -18,7 +18,7 @@ def _parse_settings(self) -> None: return # 解析 program_path 配置 - program_path = flow_settings.get("program_path", "") + program_path = flow_settings.get("program_path") if "program_path" in flow_settings else None if program_path: # 解析多行配置,格式如: KEY=VALUE\nKEY2=VALUE2 for line in program_path.split("\n"): @@ -27,9 +27,13 @@ def _parse_settings(self) -> None: key, value = line.split("=", 1) self[key.strip()] = value.strip() # 解析 acronyms_list 配置 - acronyms_list = flow_settings.get("acronyms_list", "") + acronyms_list = flow_settings.get("acronyms_list") if "acronyms_list" in flow_settings else None if acronyms_list: self["acronyms_list"] = [s.strip() for s in acronyms_list.split("\n") if s.strip()] + # 解析其他配置 + for key, value in flow_settings.items(): + if key not in self and key not in ("acronyms_list", "program_path"): + self[key] = value def get(self, key: str) -> str: """获取配置值,如果不存在则抛出异常""" diff --git a/src/core/factory.py b/src/core/factory.py index a72245f..bae34e2 100644 --- a/src/core/factory.py +++ b/src/core/factory.py @@ -46,7 +46,7 @@ def get_application_acronyms(cls) -> Dict[str, str]: return ApplicationRegistry.get_acronyms_map() @classmethod - def get_application_message(cls, acronyms_list): + def get_application_message(cls, plugin_keyword, acronyms_list): """ 根据传入的 acronyms_list 生成 Flow Launcher 消息列表。 如果未传入,则只展示用户已配置路径的应用。 @@ -69,7 +69,7 @@ def get_application_message(cls, acronyms_list): "icoPath": f"icons/{acronyms}_icon.png", "jsonRPCAction": { "method": "Flow.Launcher.ChangeQuery", - "parameters": [f"r {acronyms} ", False], + "parameters": [f"{plugin_keyword} {acronyms} ", False], "dontHideAfterAction": True, }, "score": 0, diff --git a/src/core/main.py b/src/core/main.py index 128d156..5804f38 100644 --- a/src/core/main.py +++ b/src/core/main.py @@ -25,10 +25,10 @@ def query(self, param: str) -> List[Dict[str, str]]: # 如果没有输入参数,则根据 acronyms_list 展示建议列表 if len(args) == 0: + plugin_keyword = config.get("plugin_keyword") if "plugin_keyword" in config else "r" acronyms_list = config.get("acronyms_list") if "acronyms_list" in config else None - logger.debug(f"acronyms_list: {acronyms_list}") - return ConcreteFactory.get_application_message(acronyms_list) - + return ConcreteFactory.get_application_message(plugin_keyword, acronyms_list) + acronyms = args.split(" ")[0] if acronyms not in acronyms_dict.keys(): @@ -38,7 +38,6 @@ def query(self, param: str) -> List[Dict[str, str]]: ) else: app_name = acronyms_dict[acronyms] - logger.debug(f"app_name: {app_name}") icon_path = "icons/{}_icon.png".format(acronyms) query = "".join(args.split(" ")[1:]) From c6e881818c6c157f8d8b9b02930b64a2855729b8 Mon Sep 17 00:00:00 2001 From: Lu-Jiejie Date: Fri, 11 Jul 2025 01:23:15 +0800 Subject: [PATCH 4/9] chore: refine README.md and rename configuration variables --- README.md | 39 +++++++++++++++++++++++++++++---------- SettingsTemplate.yaml | 14 +++++++------- src/core/config.py | 10 +++++----- src/core/factory.py | 14 +++++++------- src/core/main.py | 8 ++++---- 5 files changed, 52 insertions(+), 33 deletions(-) diff --git a/README.md b/README.md index a602da3..a6eceb6 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ A plugin that enables quick access to recent projects across various IDEs like V Download from the store -## Supported applications +## Supported programs - [x] visual studio code - [x] pycharm @@ -20,9 +20,9 @@ Download from the store - [x] vscode ssh - [x] typora -You can access different IDEs using the following format: +You can access different programs using the following acronyms: -```python +```json { "vsc": "VSCODE", "py": "PYCHARM", @@ -44,14 +44,14 @@ All configurations can be done in the Settings Panel. Change the configurations ### Program Path -- Configure application paths in the following format: +- Configure program paths in the following format: ```plaintext APP_DOWNLOAD=C:/path/to/app.exe APP_STORAGE=C:/path/to/storage/file ``` -- Each application needs both DOWNLOAD and STORAGE entries +- Each program needs both DOWNLOAD and STORAGE entries - Example configuration: ```plaintext @@ -71,6 +71,25 @@ All configurations can be done in the Settings Panel. Change the configurations TYPORA_STORAGE=C:/Users/YourUsername/AppData/Roaming/Typora/history.data ``` +### Acronyms Suggestions List + +- You can customize the acronyms suggestions list displayed when no input is provided. +- Configure acronyms suggestions list in the following format: + + ```plaintext + vsc + py + cl + # ... other acronyms + ``` + +- Keep empty to display the default acronyms suggestions list — the plugin will suggest the programs that are configured in the [Program Path](#program-path). + +### Plugin Trigger Keyword + +- Make sure to update this configuration when you change the trigger keyword of this plugin. +- It affects the usage of [Acronyms Suggestions List](#acronyms-suggestions-list). + ### Tips - **Verify Paths**: Ensure that the paths you enter are correct and that the files or executables exist at those locations @@ -81,23 +100,23 @@ All configurations can be done in the Settings Panel. Change the configurations To open a project named "MyProject" in Visual Studio Code, you would use: -r +`r` ![1752128883045](image/README/1752128883045.png) -r vsc +`r vsc` ![1733284352742](image/README/1733284352742.png) -r vsc My +`r vsc My` ![1733284374591](image/README/1733284374591.png) -r vsc 空 +`r vsc 空` ![1733284760505](image/README/1733284760505.png) -context menu +`context menu` ![1742873448581](image/README/1742873448581.png) diff --git a/SettingsTemplate.yaml b/SettingsTemplate.yaml index a3d0c7b..eac06ec 100644 --- a/SettingsTemplate.yaml +++ b/SettingsTemplate.yaml @@ -15,20 +15,20 @@ body: defaultValue: "" - type: textarea attributes: - name: acronyms_list - label: Acronyms List + name: acronyms_suggestions_list + label: Acronyms Suggestions List description: > - Configure the list of acronyms. - + Configure the list of acronyms suggestions. + It will be displayed when the plugin is activated. Each acronym should be defined on a new line. - Keep empty to display the default program suggestions. + Keep empty to display the default acronyms suggestions. - type: input attributes: - name: plugin_keyword - label: Plugin Keyword + name: plugin_trigger_keyword + label: Plugin Trigger Keyword description: > The keyword to trigger the plugin. diff --git a/src/core/config.py b/src/core/config.py index bb2261a..634a3cc 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -26,13 +26,13 @@ def _parse_settings(self) -> None: if line and "=" in line: key, value = line.split("=", 1) self[key.strip()] = value.strip() - # 解析 acronyms_list 配置 - acronyms_list = flow_settings.get("acronyms_list") if "acronyms_list" in flow_settings else None - if acronyms_list: - self["acronyms_list"] = [s.strip() for s in acronyms_list.split("\n") if s.strip()] + # 解析 acronyms_suggestions_list 配置 + acronyms_suggestions_list = flow_settings.get("acronyms_suggestions_list") if "acronyms_suggestions_list" in flow_settings else None + if acronyms_suggestions_list: + self["acronyms_suggestions_list"] = [s.strip() for s in acronyms_suggestions_list.split("\n") if s.strip()] # 解析其他配置 for key, value in flow_settings.items(): - if key not in self and key not in ("acronyms_list", "program_path"): + if key not in self and key not in ("acronyms_suggestions_list", "program_path"): self[key] = value def get(self, key: str) -> str: diff --git a/src/core/factory.py b/src/core/factory.py index bae34e2..3f4e9ec 100644 --- a/src/core/factory.py +++ b/src/core/factory.py @@ -46,22 +46,22 @@ def get_application_acronyms(cls) -> Dict[str, str]: return ApplicationRegistry.get_acronyms_map() @classmethod - def get_application_message(cls, plugin_keyword, acronyms_list): + def get_application_message(cls, plugin_trigger_keyword, acronyms_suggestions_list): """ - 根据传入的 acronyms_list 生成 Flow Launcher 消息列表。 + 根据传入的 acronyms_suggestions_list 生成 Flow Launcher 消息列表。 如果未传入,则只展示用户已配置路径的应用。 """ from src.core.config import config acronyms_dict = cls.get_application_acronyms() - if acronyms_list is None: - acronyms_list = [] + if acronyms_suggestions_list is None: + acronyms_suggestions_list = [] # 遍历所有应用的缩写,检查用户配置 for acr, app_name in acronyms_dict.items(): download_key = app_name + "_DOWNLOAD" storage_key = app_name + "_STORAGE" if download_key in config and storage_key in config: - acronyms_list.append(acr) + acronyms_suggestions_list.append(acr) return [ { "title": acronyms_dict.get(acronyms, acronyms), @@ -69,10 +69,10 @@ def get_application_message(cls, plugin_keyword, acronyms_list): "icoPath": f"icons/{acronyms}_icon.png", "jsonRPCAction": { "method": "Flow.Launcher.ChangeQuery", - "parameters": [f"{plugin_keyword} {acronyms} ", False], + "parameters": [f"{plugin_trigger_keyword} {acronyms} ", False], "dontHideAfterAction": True, }, "score": 0, } - for acronyms in acronyms_list + for acronyms in acronyms_suggestions_list ] diff --git a/src/core/main.py b/src/core/main.py index 5804f38..538d287 100644 --- a/src/core/main.py +++ b/src/core/main.py @@ -23,11 +23,11 @@ def query(self, param: str) -> List[Dict[str, str]]: args = param.strip() acronyms_dict = ConcreteFactory.get_application_acronyms() - # 如果没有输入参数,则根据 acronyms_list 展示建议列表 + # 如果没有输入参数,则根据 acronyms_suggestions_list 展示建议列表 if len(args) == 0: - plugin_keyword = config.get("plugin_keyword") if "plugin_keyword" in config else "r" - acronyms_list = config.get("acronyms_list") if "acronyms_list" in config else None - return ConcreteFactory.get_application_message(plugin_keyword, acronyms_list) + plugin_trigger_keyword = config.get("plugin_trigger_keyword") if "plugin_trigger_keyword" in config else "r" + acronyms_suggestions_list = config.get("acronyms_suggestions_list") if "acronyms_suggestions_list" in config else None + return ConcreteFactory.get_application_message(plugin_trigger_keyword, acronyms_suggestions_list) acronyms = args.split(" ")[0] From d0bd2d5522af94163f91618671f7b1a9395422ca Mon Sep 17 00:00:00 2001 From: Lu-Jiejie Date: Fri, 11 Jul 2025 02:42:16 +0800 Subject: [PATCH 5/9] feat: add configuration for custom acronyms map --- SettingsTemplate.yaml | 13 +++++++ icons/{as_icon.png => ANDROID_STUDIO.png} | Bin icons/{cl_icon.png => CLION.png} | Bin icons/{cur_icon.png => CURSOR.png} | Bin icons/{go_icon.png => GOLAND.png} | Bin icons/{idea_icon.png => INTELLIJ_IDEA.png} | Bin icons/{py_icon.png => PYCHARM.png} | Bin icons/{pdf_icon.png => SUMATRA_PDF.png} | Bin icons/{ty_icon.png => TYPORA.png} | Bin icons/{vsc_icon.png => VSCODE.png} | Bin icons/{vscs_icon.png => VSCODE_SSH.png} | Bin src/core/config.py | 27 ++++++++++---- src/core/factory.py | 40 ++++++++++++++------- src/core/main.py | 8 ++--- 14 files changed, 63 insertions(+), 25 deletions(-) rename icons/{as_icon.png => ANDROID_STUDIO.png} (100%) rename icons/{cl_icon.png => CLION.png} (100%) rename icons/{cur_icon.png => CURSOR.png} (100%) rename icons/{go_icon.png => GOLAND.png} (100%) rename icons/{idea_icon.png => INTELLIJ_IDEA.png} (100%) rename icons/{py_icon.png => PYCHARM.png} (100%) rename icons/{pdf_icon.png => SUMATRA_PDF.png} (100%) rename icons/{ty_icon.png => TYPORA.png} (100%) rename icons/{vsc_icon.png => VSCODE.png} (100%) rename icons/{vscs_icon.png => VSCODE_SSH.png} (100%) diff --git a/SettingsTemplate.yaml b/SettingsTemplate.yaml index eac06ec..378ffe6 100644 --- a/SettingsTemplate.yaml +++ b/SettingsTemplate.yaml @@ -34,5 +34,18 @@ body: If you change it, please update here as well. defaultValue: "r" + - type: textarea + attributes: + name: custom_acronyms_map + label: Custom Acronyms Map + description: > + Configure custom acronyms for your programs in the following format: + + VSCODE=vsc + + PYCHARM=py + + Each line defines a mapping from the program name to its acronyms. + defaultValue: "" diff --git a/icons/as_icon.png b/icons/ANDROID_STUDIO.png similarity index 100% rename from icons/as_icon.png rename to icons/ANDROID_STUDIO.png diff --git a/icons/cl_icon.png b/icons/CLION.png similarity index 100% rename from icons/cl_icon.png rename to icons/CLION.png diff --git a/icons/cur_icon.png b/icons/CURSOR.png similarity index 100% rename from icons/cur_icon.png rename to icons/CURSOR.png diff --git a/icons/go_icon.png b/icons/GOLAND.png similarity index 100% rename from icons/go_icon.png rename to icons/GOLAND.png diff --git a/icons/idea_icon.png b/icons/INTELLIJ_IDEA.png similarity index 100% rename from icons/idea_icon.png rename to icons/INTELLIJ_IDEA.png diff --git a/icons/py_icon.png b/icons/PYCHARM.png similarity index 100% rename from icons/py_icon.png rename to icons/PYCHARM.png diff --git a/icons/pdf_icon.png b/icons/SUMATRA_PDF.png similarity index 100% rename from icons/pdf_icon.png rename to icons/SUMATRA_PDF.png diff --git a/icons/ty_icon.png b/icons/TYPORA.png similarity index 100% rename from icons/ty_icon.png rename to icons/TYPORA.png diff --git a/icons/vsc_icon.png b/icons/VSCODE.png similarity index 100% rename from icons/vsc_icon.png rename to icons/VSCODE.png diff --git a/icons/vscs_icon.png b/icons/VSCODE_SSH.png similarity index 100% rename from icons/vscs_icon.png rename to icons/VSCODE_SSH.png diff --git a/src/core/config.py b/src/core/config.py index 634a3cc..886de8f 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -26,21 +26,34 @@ def _parse_settings(self) -> None: if line and "=" in line: key, value = line.split("=", 1) self[key.strip()] = value.strip() + # 解析 acronyms_suggestions_list 配置 acronyms_suggestions_list = flow_settings.get("acronyms_suggestions_list") if "acronyms_suggestions_list" in flow_settings else None if acronyms_suggestions_list: self["acronyms_suggestions_list"] = [s.strip() for s in acronyms_suggestions_list.split("\n") if s.strip()] + + + # 解析 acronyms_map 配置 + acronyms_map = flow_settings.get("custom_acronyms_map") if "custom_acronyms_map" in flow_settings else None + if acronyms_map: + self["custom_acronyms_map"] = {} + for line in acronyms_map.split("\n"): + line = line.strip() + if line and "=" in line: + prog, acr = line.split("=", 1) + prog = prog.strip().upper() + acr = acr.strip() + self["custom_acronyms_map"][prog] = acr + # 解析其他配置 for key, value in flow_settings.items(): - if key not in self and key not in ("acronyms_suggestions_list", "program_path"): + if key not in self and key not in ("acronyms_suggestions_list", "program_path", "custom_acronyms_map"): self[key] = value - def get(self, key: str) -> str: - """获取配置值,如果不存在则抛出异常""" - value = super().get(key) - if not value: - raise UsageError(f"Missing config key: {key}") - return value + + def get(self, key: str, default=None) -> str: + """获取配置值,支持默认值参数""" + return super().get(key, default) config = Config() diff --git a/src/core/factory.py b/src/core/factory.py index 3f4e9ec..62695e6 100644 --- a/src/core/factory.py +++ b/src/core/factory.py @@ -2,6 +2,9 @@ from typing import Dict, List from .registry import ApplicationRegistry +from .logger import get_logger + +logger = get_logger() class AbstractFactory(ABC): @@ -32,41 +35,52 @@ def get_supported_applications(cls): return list(ApplicationRegistry.get_all_applications().keys()) @classmethod - def get_application_acronyms(cls) -> Dict[str, str]: + def get_application_acronyms(cls, plugin_config) -> Dict[str, str]: """ - 获取应用的缩写字典 + 获取应用的缩写字典,优先使用用户自定义的 acronyms_map 返回格式: { "vsc": "VSCODE", "idea": "IDEA", - "pycharm": "PYCHARM" + ... } """ ApplicationRegistry.load_applications() - return ApplicationRegistry.get_acronyms_map() + default_acronyms_map = ApplicationRegistry.get_acronyms_map() + custom_acronyms_map = plugin_config.get("custom_acronyms_map", None) + if custom_acronyms_map: + # acronyms_map: {"VSCODE": "vsc"} + # 只合并支持的程序名 + supported_programs = set(default_acronyms_map.values()) + for prog, acr in custom_acronyms_map.items(): + if prog in supported_programs: + default_acronyms_map[acr] = prog + return default_acronyms_map @classmethod - def get_application_message(cls, plugin_trigger_keyword, acronyms_suggestions_list): + def get_application_message(cls, plugin_config): """ - 根据传入的 acronyms_suggestions_list 生成 Flow Launcher 消息列表。 + 根据传入的 acronyms_suggestions_list 生成 Flow Launcher 消消息列表。 如果未传入,则只展示用户已配置路径的应用。 """ - from src.core.config import config - - acronyms_dict = cls.get_application_acronyms() + custom_acronyms_map = plugin_config.get("custom_acronyms_map", None) + acronyms_suggestions_list = plugin_config.get("acronyms_suggestions_list", None) + plugin_trigger_keyword = plugin_config.get("plugin_trigger_keyword", "r") + acronyms_dict = cls.get_application_acronyms(custom_acronyms_map) + logger.debug(acronyms_suggestions_list) + # 只显示已配置的应用建议 if acronyms_suggestions_list is None: acronyms_suggestions_list = [] - # 遍历所有应用的缩写,检查用户配置 for acr, app_name in acronyms_dict.items(): download_key = app_name + "_DOWNLOAD" storage_key = app_name + "_STORAGE" - if download_key in config and storage_key in config: + if download_key in plugin_config and storage_key in plugin_config: acronyms_suggestions_list.append(acr) return [ { - "title": acronyms_dict.get(acronyms, acronyms), + "title": acronyms_dict.get(acronyms), "subTitle": acronyms, - "icoPath": f"icons/{acronyms}_icon.png", + "icoPath": f"icons/{acronyms_dict.get(acronyms)}.png", "jsonRPCAction": { "method": "Flow.Launcher.ChangeQuery", "parameters": [f"{plugin_trigger_keyword} {acronyms} ", False], diff --git a/src/core/main.py b/src/core/main.py index 538d287..f3c1b7a 100644 --- a/src/core/main.py +++ b/src/core/main.py @@ -21,13 +21,11 @@ def __init__(self): def query(self, param: str) -> List[Dict[str, str]]: args = param.strip() - acronyms_dict = ConcreteFactory.get_application_acronyms() + acronyms_dict = ConcreteFactory.get_application_acronyms(config) # 如果没有输入参数,则根据 acronyms_suggestions_list 展示建议列表 if len(args) == 0: - plugin_trigger_keyword = config.get("plugin_trigger_keyword") if "plugin_trigger_keyword" in config else "r" - acronyms_suggestions_list = config.get("acronyms_suggestions_list") if "acronyms_suggestions_list" in config else None - return ConcreteFactory.get_application_message(plugin_trigger_keyword, acronyms_suggestions_list) + return ConcreteFactory.get_application_message(config) acronyms = args.split(" ")[0] @@ -38,7 +36,7 @@ def query(self, param: str) -> List[Dict[str, str]]: ) else: app_name = acronyms_dict[acronyms] - icon_path = "icons/{}_icon.png".format(acronyms) + icon_path = f"icons/{app_name}.png" query = "".join(args.split(" ")[1:]) # 读取配置 From 0f98a1847453a0293f349ec73fcc3276fc14293e Mon Sep 17 00:00:00 2001 From: Lu-Jiejie Date: Fri, 11 Jul 2025 03:42:14 +0800 Subject: [PATCH 6/9] feat: update configuration and documentation --- README.md | 30 ++++++++++++----- SettingsTemplate.yaml | 17 ++++++---- src/core/config.py | 24 +++++++------- src/core/factory.py | 77 ++++++++++++++++++++++--------------------- src/core/main.py | 4 +-- 5 files changed, 85 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index a6eceb6..7c6f6c3 100644 --- a/README.md +++ b/README.md @@ -71,24 +71,36 @@ All configurations can be done in the Settings Panel. Change the configurations TYPORA_STORAGE=C:/Users/YourUsername/AppData/Roaming/Typora/history.data ``` -### Acronyms Suggestions List +### Suggestions List -- You can customize the acronyms suggestions list displayed when no input is provided. -- Configure acronyms suggestions list in the following format: +- You can customize the program suggestions list displayed when no input is provided. +- Configure program suggestions list in the following format: ```plaintext - vsc - py - cl - # ... other acronyms + VSCODE + PYCHARM + INTELLIJ_IDEA + # ... other programs ``` -- Keep empty to display the default acronyms suggestions list — the plugin will suggest the programs that are configured in the [Program Path](#program-path). +- Keep empty to display the default program suggestions list — the plugin will suggest the programs that are configured in the [Program Path](#program-path). ### Plugin Trigger Keyword - Make sure to update this configuration when you change the trigger keyword of this plugin. -- It affects the usage of [Acronyms Suggestions List](#acronyms-suggestions-list). +- It affects the usage of [Suggestions List](#suggestions-list). + +### Custom Acronyms Map + +- Configure custom acronyms for your programs in the following format: + + ```plaintext + VSCODE=vs + PYCHARM=pc + # ... other acronyms map + ``` + +- This allows you to use custom acronyms when the [default acronyms](#supported-programs) do not match your preferences. ### Tips diff --git a/SettingsTemplate.yaml b/SettingsTemplate.yaml index 378ffe6..0535d0f 100644 --- a/SettingsTemplate.yaml +++ b/SettingsTemplate.yaml @@ -15,16 +15,21 @@ body: defaultValue: "" - type: textarea attributes: - name: acronyms_suggestions_list - label: Acronyms Suggestions List + name: suggestions_list + label: Suggestions List description: > - Configure the list of acronyms suggestions. + Configure list of program suggestions in the following format: - It will be displayed when the plugin is activated. + VSCODE + + PYCHARM - Each acronym should be defined on a new line. + INTELLIJ_IDEA - Keep empty to display the default acronyms suggestions. + It will be displayed when the plugin is activated. + + Keep empty to display the default program suggestions. + - type: input - type: input attributes: name: plugin_trigger_keyword diff --git a/src/core/config.py b/src/core/config.py index 886de8f..a7f1269 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -27,27 +27,27 @@ def _parse_settings(self) -> None: key, value = line.split("=", 1) self[key.strip()] = value.strip() - # 解析 acronyms_suggestions_list 配置 - acronyms_suggestions_list = flow_settings.get("acronyms_suggestions_list") if "acronyms_suggestions_list" in flow_settings else None - if acronyms_suggestions_list: - self["acronyms_suggestions_list"] = [s.strip() for s in acronyms_suggestions_list.split("\n") if s.strip()] + # 解析 suggestions_list 配置(每行一个程序名称) + suggestions_list = flow_settings.get("suggestions_list") if "suggestions_list" in flow_settings else None + if suggestions_list: + self["suggestions_list"] = [s.strip().upper() for s in suggestions_list.split("\n") if s.strip()] # 解析 acronyms_map 配置 - acronyms_map = flow_settings.get("custom_acronyms_map") if "custom_acronyms_map" in flow_settings else None - if acronyms_map: + custom_acronyms_map = flow_settings.get("custom_acronyms_map") if "custom_acronyms_map" in flow_settings else None + if custom_acronyms_map: self["custom_acronyms_map"] = {} - for line in acronyms_map.split("\n"): + for line in custom_acronyms_map.split("\n"): line = line.strip() if line and "=" in line: - prog, acr = line.split("=", 1) - prog = prog.strip().upper() - acr = acr.strip() - self["custom_acronyms_map"][prog] = acr + program, acronyms = line.split("=", 1) + program = program.strip().upper() + acronyms = acronyms.strip() + self["custom_acronyms_map"][program] = acronyms # 解析其他配置 for key, value in flow_settings.items(): - if key not in self and key not in ("acronyms_suggestions_list", "program_path", "custom_acronyms_map"): + if key not in self and key not in ("suggestions_list", "program_path", "custom_acronyms_map"): self[key] = value diff --git a/src/core/factory.py b/src/core/factory.py index 62695e6..f783650 100644 --- a/src/core/factory.py +++ b/src/core/factory.py @@ -37,56 +37,57 @@ def get_supported_applications(cls): @classmethod def get_application_acronyms(cls, plugin_config) -> Dict[str, str]: """ - 获取应用的缩写字典,优先使用用户自定义的 acronyms_map + 获取应用的缩写字典,优先使用 plugin_config 中用户自定义的 custom_acronyms_map。 返回格式: { "vsc": "VSCODE", - "idea": "IDEA", + "cs": "CURSOR", ... } """ ApplicationRegistry.load_applications() - default_acronyms_map = ApplicationRegistry.get_acronyms_map() - custom_acronyms_map = plugin_config.get("custom_acronyms_map", None) - if custom_acronyms_map: - # acronyms_map: {"VSCODE": "vsc"} - # 只合并支持的程序名 - supported_programs = set(default_acronyms_map.values()) - for prog, acr in custom_acronyms_map.items(): - if prog in supported_programs: - default_acronyms_map[acr] = prog - return default_acronyms_map + default_acronyms_map = ApplicationRegistry.get_acronyms_map() + custom_acronyms_map = plugin_config.get("custom_acronyms_map", {}) + acronyms_map = {acr: prog.upper() for prog, acr in custom_acronyms_map.items()} + for acr, prog in default_acronyms_map.items(): + if prog not in acronyms_map.values(): + acronyms_map[acr] = prog + return acronyms_map @classmethod def get_application_message(cls, plugin_config): """ - 根据传入的 acronyms_suggestions_list 生成 Flow Launcher 消消息列表。 - 如果未传入,则只展示用户已配置路径的应用。 + 根据配置的 suggestions_list 生成 Flow Launcher 消息列表。 + 如果未配置,则只展示用户已配置路径的应用。 """ - custom_acronyms_map = plugin_config.get("custom_acronyms_map", None) - acronyms_suggestions_list = plugin_config.get("acronyms_suggestions_list", None) + suggestions_list = plugin_config.get("suggestions_list", None) plugin_trigger_keyword = plugin_config.get("plugin_trigger_keyword", "r") - acronyms_dict = cls.get_application_acronyms(custom_acronyms_map) - logger.debug(acronyms_suggestions_list) + acronyms_dict = cls.get_application_acronyms(plugin_config) + reverse_acronyms_dict = {v: k for k, v in acronyms_dict.items()} + # 只显示已配置的应用建议 - if acronyms_suggestions_list is None: - acronyms_suggestions_list = [] - for acr, app_name in acronyms_dict.items(): - download_key = app_name + "_DOWNLOAD" - storage_key = app_name + "_STORAGE" + if suggestions_list is None: + suggestions_list = [] + for _, program_name in acronyms_dict.items(): + download_key = program_name + "_DOWNLOAD" + storage_key = program_name + "_STORAGE" if download_key in plugin_config and storage_key in plugin_config: - acronyms_suggestions_list.append(acr) - return [ - { - "title": acronyms_dict.get(acronyms), - "subTitle": acronyms, - "icoPath": f"icons/{acronyms_dict.get(acronyms)}.png", - "jsonRPCAction": { - "method": "Flow.Launcher.ChangeQuery", - "parameters": [f"{plugin_trigger_keyword} {acronyms} ", False], - "dontHideAfterAction": True, - }, - "score": 0, - } - for acronyms in acronyms_suggestions_list - ] + suggestions_list.append(program_name) + + messages = [] + for idx, program_name in enumerate(suggestions_list): + if program_name in reverse_acronyms_dict: + acronyms = reverse_acronyms_dict[program_name] + messages.append({ + "title": program_name, + "subTitle": acronyms, + "icoPath": f"icons/{program_name}.png", + "jsonRPCAction": { + "method": "Flow.Launcher.ChangeQuery", + "parameters": [f"{plugin_trigger_keyword} {acronyms} ", False], + "dontHideAfterAction": True, + }, + # 按原始顺序排序 + "score": (100 - idx) * 10000, + }) + return messages diff --git a/src/core/main.py b/src/core/main.py index f3c1b7a..4cb5ead 100644 --- a/src/core/main.py +++ b/src/core/main.py @@ -21,13 +21,13 @@ def __init__(self): def query(self, param: str) -> List[Dict[str, str]]: args = param.strip() - acronyms_dict = ConcreteFactory.get_application_acronyms(config) - # 如果没有输入参数,则根据 acronyms_suggestions_list 展示建议列表 + # 如果没有输入参数,则根据 suggestions_list 展示建议列表 if len(args) == 0: return ConcreteFactory.get_application_message(config) acronyms = args.split(" ")[0] + acronyms_dict = ConcreteFactory.get_application_acronyms(config) if acronyms not in acronyms_dict.keys(): return MessageDTO.asWarnFlowMessage( From 2679d1e8e27f811112f298c41b7e472a0e0f271f Mon Sep 17 00:00:00 2001 From: Lu-Jiejie Date: Fri, 11 Jul 2025 03:45:08 +0800 Subject: [PATCH 7/9] chore: update icon of Typora --- icons/TYPORA.png | Bin 56839 -> 59444 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/TYPORA.png b/icons/TYPORA.png index 99ee5ca4b2649105e0ec6bd1950d8e0fbd32dc2a..dec6916d542e7c21c92f6bf5fe950fae6ec3ffff 100644 GIT binary patch literal 59444 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 EFYiNLlK=n! literal 56839 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 Tp(QK8pR=dTPG Date: Fri, 11 Jul 2025 03:55:27 +0800 Subject: [PATCH 8/9] chore: lint --- src/core/config.py | 36 +++++++++++++++++++++++++----------- src/core/factory.py | 37 +++++++++++++++++++++---------------- src/core/main.py | 2 +- 3 files changed, 47 insertions(+), 28 deletions(-) diff --git a/src/core/config.py b/src/core/config.py index a7f1269..223bf63 100644 --- a/src/core/config.py +++ b/src/core/config.py @@ -1,5 +1,3 @@ -from click import UsageError - from .jsonrpc import settings from .logger import get_logger @@ -16,9 +14,13 @@ def _parse_settings(self) -> None: flow_settings = settings() if not flow_settings: return - + # 解析 program_path 配置 - program_path = flow_settings.get("program_path") if "program_path" in flow_settings else None + program_path = ( + flow_settings.get("program_path") + if "program_path" in flow_settings + else None + ) if program_path: # 解析多行配置,格式如: KEY=VALUE\nKEY2=VALUE2 for line in program_path.split("\n"): @@ -26,15 +28,24 @@ def _parse_settings(self) -> None: if line and "=" in line: key, value = line.split("=", 1) self[key.strip()] = value.strip() - + # 解析 suggestions_list 配置(每行一个程序名称) - suggestions_list = flow_settings.get("suggestions_list") if "suggestions_list" in flow_settings else None + suggestions_list = ( + flow_settings.get("suggestions_list") + if "suggestions_list" in flow_settings + else None + ) if suggestions_list: - self["suggestions_list"] = [s.strip().upper() for s in suggestions_list.split("\n") if s.strip()] - + self["suggestions_list"] = [ + s.strip().upper() for s in suggestions_list.split("\n") if s.strip() + ] # 解析 acronyms_map 配置 - custom_acronyms_map = flow_settings.get("custom_acronyms_map") if "custom_acronyms_map" in flow_settings else None + custom_acronyms_map = ( + flow_settings.get("custom_acronyms_map") + if "custom_acronyms_map" in flow_settings + else None + ) if custom_acronyms_map: self["custom_acronyms_map"] = {} for line in custom_acronyms_map.split("\n"): @@ -47,10 +58,13 @@ def _parse_settings(self) -> None: # 解析其他配置 for key, value in flow_settings.items(): - if key not in self and key not in ("suggestions_list", "program_path", "custom_acronyms_map"): + if key not in self and key not in ( + "suggestions_list", + "program_path", + "custom_acronyms_map", + ): self[key] = value - def get(self, key: str, default=None) -> str: """获取配置值,支持默认值参数""" return super().get(key, default) diff --git a/src/core/factory.py b/src/core/factory.py index f783650..fa6cdad 100644 --- a/src/core/factory.py +++ b/src/core/factory.py @@ -1,5 +1,5 @@ from abc import ABC, abstractmethod -from typing import Dict, List +from typing import Dict from .registry import ApplicationRegistry from .logger import get_logger @@ -46,7 +46,7 @@ def get_application_acronyms(cls, plugin_config) -> Dict[str, str]: } """ ApplicationRegistry.load_applications() - default_acronyms_map = ApplicationRegistry.get_acronyms_map() + default_acronyms_map = ApplicationRegistry.get_acronyms_map() custom_acronyms_map = plugin_config.get("custom_acronyms_map", {}) acronyms_map = {acr: prog.upper() for prog, acr in custom_acronyms_map.items()} for acr, prog in default_acronyms_map.items(): @@ -64,7 +64,7 @@ def get_application_message(cls, plugin_config): plugin_trigger_keyword = plugin_config.get("plugin_trigger_keyword", "r") acronyms_dict = cls.get_application_acronyms(plugin_config) reverse_acronyms_dict = {v: k for k, v in acronyms_dict.items()} - + # 只显示已配置的应用建议 if suggestions_list is None: suggestions_list = [] @@ -73,21 +73,26 @@ def get_application_message(cls, plugin_config): storage_key = program_name + "_STORAGE" if download_key in plugin_config and storage_key in plugin_config: suggestions_list.append(program_name) - + messages = [] for idx, program_name in enumerate(suggestions_list): if program_name in reverse_acronyms_dict: acronyms = reverse_acronyms_dict[program_name] - messages.append({ - "title": program_name, - "subTitle": acronyms, - "icoPath": f"icons/{program_name}.png", - "jsonRPCAction": { - "method": "Flow.Launcher.ChangeQuery", - "parameters": [f"{plugin_trigger_keyword} {acronyms} ", False], - "dontHideAfterAction": True, - }, - # 按原始顺序排序 - "score": (100 - idx) * 10000, - }) + messages.append( + { + "title": program_name, + "subTitle": acronyms, + "icoPath": f"icons/{program_name}.png", + "jsonRPCAction": { + "method": "Flow.Launcher.ChangeQuery", + "parameters": [ + f"{plugin_trigger_keyword} {acronyms} ", + False, + ], + "dontHideAfterAction": True, + }, + # 按原始顺序排序 + "score": (100 - idx) * 10000, + } + ) return messages diff --git a/src/core/main.py b/src/core/main.py index 4cb5ead..dd89e81 100644 --- a/src/core/main.py +++ b/src/core/main.py @@ -48,7 +48,7 @@ def query(self, param: str) -> List[Dict[str, str]]: "{0} app_download or app_storage is None".format(app_name) + str(e), "Please check your settings", ) - + # 读取recent_projects try: app = ConcreteFactory.create_app(app_name, app_download, app_storage) From 39d18b50aeb6cb4a99988347923bf2daab57aed2 Mon Sep 17 00:00:00 2001 From: Lu-Jiejie Date: Fri, 11 Jul 2025 04:20:31 +0800 Subject: [PATCH 9/9] test: update config test --- test/test_config.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/test/test_config.py b/test/test_config.py index 4162b53..ce05740 100644 --- a/test/test_config.py +++ b/test/test_config.py @@ -41,13 +41,23 @@ def test_settings_parsing(self, mock_settings): @patch("src.core.config.settings") def test_empty_settings(self, mock_settings): - """测试空配置的情况""" + """测试空配置""" mock_settings.return_value = {} config = Config() - with self.assertRaises(Exception): - config.get("NONEXISTENT_KEY") + self.assertIsNone(config.get("NONEXISTENT_KEY")) + + @patch("src.core.config.settings") + def test_settings_default_value(self, mock_settings): + """测试配置默认值""" + mock_settings.return_value = {} + + config = Config() + + self.assertEqual( + config.get("NONEXISTENT_KEY", "default_value"), "default_value" + ) if __name__ == "__main__":