diff --git a/src/Native/Linux.cs b/src/Native/Linux.cs index 036086491..f931140e3 100644 --- a/src/Native/Linux.cs +++ b/src/Native/Linux.cs @@ -49,14 +49,15 @@ public string FindTerminal(Models.ShellOrTerminal shell) public List FindExternalTools() { var finder = new Models.ExternalToolsFinder(); - finder.VSCode(() => FindExecutable("code")); - finder.VSCodeInsiders(() => FindExecutable("code-insiders")); - finder.VSCodium(() => FindExecutable("codium")); + finder.VSCode(() => FindExecutable("code", "com.visualstudio.code")); + finder.VSCodeInsiders(() => FindExecutable("code-insiders", "com.vscodium.codium-insiders")); + finder.VSCodium(() => FindExecutable("codium", "com.vscodium.codium")); finder.Cursor(() => FindExecutable("cursor")); finder.Fleet(FindJetBrainsFleet); finder.FindJetBrainsFromToolbox(() => $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}/JetBrains/Toolbox"); - finder.SublimeText(() => FindExecutable("subl")); - finder.Zed(() => FindExecutable("zeditor")); + FindJetBrainsFromFlatpak(finder); + finder.SublimeText(() => FindExecutable("subl", "com.sublimetext.three")); + finder.Zed(() => FindExecutable("zeditor", "dev.zed.Zed")); return finder.Founded; } @@ -118,7 +119,7 @@ public void OpenWithDefaultEditor(string file) } } - private string FindExecutable(string filename) + private string FindExecutable(string filename, string flatpakAppId = null) { var pathVariable = Environment.GetEnvironmentVariable("PATH") ?? string.Empty; var paths = pathVariable.Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries); @@ -129,6 +130,16 @@ private string FindExecutable(string filename) return test; } + if (flatpakAppId != null) + { + foreach (var path in new[] { "/var/lib", Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) }) + { + var test = Path.Combine(path, "flatpak/exports/bin", flatpakAppId); + if (File.Exists(test)) + return test; + } + } + return string.Empty; } @@ -137,5 +148,33 @@ private string FindJetBrainsFleet() var path = $"{Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)}/JetBrains/Toolbox/apps/fleet/bin/Fleet"; return File.Exists(path) ? path : FindExecutable("fleet"); } + + private static void FindJetBrainsFromFlatpak(Models.ExternalToolsFinder finder) + { + foreach (var basePath in new[] { "/var/lib", Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) }) + { + var binPath = Path.Combine(basePath, "flatpak/exports/bin"); + if (Directory.Exists(binPath)) + { + foreach (var file in Directory.GetFiles(binPath, "com.jetbrains.*")) + { + var fileName = Path.GetFileName(file); + var appName = fileName[14..].Replace("-", " "); + var icon = new string(Array.FindAll(fileName.ToCharArray(), char.IsUpper)); + if (icon.Length > 2) + icon = icon[..2]; + icon = icon switch + { + "DG" => "DB", // DataGrip + "GL" => "GO", // GoLand + "IJ" => "JB", // IntelliJ + "R" => "RD", // Rider + _ => icon + }; + finder.Founded.Add(new Models.ExternalTool(appName, "JetBrains/" + icon, file)); + } + } + } + } } }