From 4674d11f17272e5c11eac661b82f946072a1ef58 Mon Sep 17 00:00:00 2001 From: hanff Date: Fri, 20 Oct 2023 15:59:22 +0800 Subject: [PATCH] [vscode_projects] version_1.0 --- .gitignore | 3 +- vscode_projects/__init__.py | 126 ++++++++++++++++++++++++++++++++++++ vscode_projects/vscode.png | Bin 0 -> 6869 bytes 3 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 vscode_projects/__init__.py create mode 100644 vscode_projects/vscode.png diff --git a/.gitignore b/.gitignore index 1d4436e8..e1e16d36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ __pycache__ /.idea /.vscode -/.venv \ No newline at end of file +/.venv +/site-packages \ No newline at end of file diff --git a/vscode_projects/__init__.py b/vscode_projects/__init__.py new file mode 100644 index 00000000..76d10284 --- /dev/null +++ b/vscode_projects/__init__.py @@ -0,0 +1,126 @@ +""" +vscode projects +""" + +from dataclasses import dataclass +import json +import os +from pathlib import Path +from shutil import which +from sys import platform +from typing import Union +from albert import * + +md_iid = '2.0' +md_version = "1.0" +md_name = "VSCode projects" +md_description = "Open your VSCode projects" +md_license = "GPL-3" +md_url = "https://github.com/albertlauncher/python/" +md_maintainers = ["@hanff"] + +@dataclass +class Project: + name: str + path: str + # last_opened: int + + +@dataclass +class Editor: + name: str + icon: Path + # config_dir_prefix: str + binary: str + + def __init__(self, name: str, icon: Path, binaries: list[str]): + self.name = name + self.icon = icon + # self.config_dir_prefix = config_dir_prefix + self.binary = self._find_binary(binaries) + + def _find_binary(self, binaries: list[str]) -> Union[str, None]: + for binary in binaries: + if which(binary): + return binary + return None + + def list_projects(self) -> list[Project]: + vscode_settings_path = os.path.expanduser("~/.config/Code/User") + workspace_storage_path = os.path.join(vscode_settings_path, "workspaceStorage") + recent_projects = [] + if os.path.exists(workspace_storage_path): + for root, dirs, files in os.walk(workspace_storage_path): + for file in files: + if file == ("workspace.json"): + project_info_path = os.path.join(root, file) + with open(project_info_path, "r",encoding='utf8') as f: + project_data = json.load(f) + recent_projects.append(project_data["folder"]) + print(recent_projects) + return self._parse_recent_projects(recent_projects) + + + def _parse_recent_projects(self, recent_projects_file: list) -> list[Project]: + projects = [] + + for recent_file_path in recent_projects_file: + target_path = recent_file_path[7:] + projects.append( + Project( + name=Path(target_path).name, + path=target_path + ) + ) + return projects + + +class Plugin(PluginInstance, TriggerQueryHandler): + def __init__(self): + TriggerQueryHandler.__init__( + self, + id=md_id, + name=md_name, + description=md_description, + synopsis='project name', + defaultTrigger='vsc ', + ) + PluginInstance.__init__(self, extensions=[self]) + + plugin_dir = Path(__file__).parent + editors=[ + Editor( + name="VS Code", + icon=plugin_dir/"vscode.png", + binaries=["code"] + ) + ] + self.editors = [e for e in editors if e.binary is not None] + + def handleTriggerQuery(self, query: TriggerQuery): + editor_project_pairs=[] + for editor in self.editors: + projects = editor.list_projects() + projects = [p for p in projects if Path(p.path).exists()] + projects = [p for p in projects if query.string.lower() in p.name.lower()] + editor_project_pairs.extend([(editor, p) for p in projects]) + query.add([self._make_item(editor, project, query) for editor, project in editor_project_pairs]) + + def _make_item(self, editor: Editor, project: Project, query: TriggerQuery) -> Item: + return StandardItem( + id="%s-%s" % (editor.binary, project.path), + text=project.name, + subtext=project.path, + inputActionText=query.trigger + project.name, + iconUrls=["file:" + str(editor.icon)], + actions=[ + Action( + "Open", + "Open in %s" % editor.name, + lambda selected_project=project.path: runDetachedProcess( + [editor.binary, selected_project] + ), + ) + ], + ) + diff --git a/vscode_projects/vscode.png b/vscode_projects/vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..0888683c778806c8064c7fc090b4a3aceccf3dd1 GIT binary patch literal 6869 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 literal 0 HcmV?d00001