diff --git a/vscode_nautilus_workspaces.py b/vscode_nautilus_workspaces.py index c1aa8b5..a747a8b 100644 --- a/vscode_nautilus_workspaces.py +++ b/vscode_nautilus_workspaces.py @@ -1,7 +1,7 @@ -from gi.repository import Nautilus, GObject +from gi.repository import Nautilus, GObject, GLib import os import logging -from pathlib import Path +from urllib.parse import unquote from subprocess import call import json @@ -37,6 +37,8 @@ def launch_vscode(self, menu, files): args = "" for file in files: + if file.startswith("file://"): + file = file.replace("file://", "") safepaths += '"' + file + '" ' logging.info(f"File path: {safepaths}") @@ -48,6 +50,10 @@ def launch_vscode(self, menu, files): args = "--new-window " args = "--new-window " if NEWWINDOW else "" + + if len(files) == 1 and files[0].startswith("vscode-remote://"): + args = "--folder-uri" + command = f"{VSCODE} {args} {safepaths} &" logging.info(f"Command to execute: {command}") @@ -69,7 +75,15 @@ def _get_recent_workspaces(self): # Extract workspaces from profileAssociations workspaces = storage_data.get("profileAssociations", {}).get("workspaces", {}) - workspace_paths = [ws.replace("file://", "") for ws in workspaces.keys()] + workspace_paths = [] + for ws in workspaces.keys(): + ws = unquote(ws) + if ws.startswith("file://"): + if os.path.exists(ws.replace("file://", "")): + workspace_paths.append(ws) + else: + workspace_paths.append(ws) + workspace_paths = workspace_paths[::-1] logging.info(f"Workspace paths: {workspace_paths}") return workspace_paths @@ -77,6 +91,27 @@ def _open_workspace(self, menu, workspace_path): logging.debug(f"Opening workspace: {workspace_path}") self.launch_vscode(menu, [workspace_path]) + def _get_name(self, workspace): + if workspace.startswith("file://"): + return workspace.replace("file://", "").replace(GLib.get_home_dir(), "~") + + if workspace.startswith("vscode-remote://"): + workspace_name = workspace.replace("vscode-remote://", "") + if workspace_name.startswith("ssh-remote+"): + workspace_name = workspace_name.replace("ssh-remote+", "") + if "/" not in workspace_name: + return None + wns = workspace_name.split("/") + if len(wns) < 2: + return None + ssh_host = wns[0] + workspace_name = workspace_name.replace(ssh_host, "") + if len(wns) >= 4: + workspace_name = "~/" + "/".join(wns[3:]) + return f"[SHH: {ssh_host}] {workspace_name}" + + return workspace + def get_background_items(self, window): recent_workspaces = self._get_recent_workspaces() logging.debug(f"Recent workspaces: {recent_workspaces}") @@ -94,7 +129,9 @@ def get_background_items(self, window): menu_item.set_submenu(submenu) for workspace in recent_workspaces: - workspace_name = os.path.basename(workspace) + workspace_name = self._get_name(workspace) + if workspace_name is None: + continue item = Nautilus.MenuItem( name=f"VSCodeWorkspacesExtension::Open_{workspace_name}", label=workspace_name,