Skip to content

enhance: support tools installed via flatpak #1517

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 45 additions & 6 deletions src/Native/Linux.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,15 @@ public string FindTerminal(Models.ShellOrTerminal shell)
public List<Models.ExternalTool> 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;
}

Expand Down Expand Up @@ -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);
Expand All @@ -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;
}

Expand All @@ -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));
}
}
}
}
}
}