Remove hardcoded `--cd ~` from WSL terminal fragment profiles to support Terminal's startingDirectory (#13350)
* Initial plan * Fix WSL terminal fragment profiles to support Terminal's startingDirectory Co-authored-by: benhillis <17727402+benhillis@users.noreply.github.com> * clang format --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: benhillis <17727402+benhillis@users.noreply.github.com> Co-authored-by: Ben Hillis <benhill@ntdev.microsoft.com>
Copilot committed
Aug 11, 2025 at 14:08 UTC
17bd3716b4470bb70b74497774940f5ee42b6437
2 files changed
+13
-3
src/windows/service/exe/LxssUserSession.cpp
+9
-2
@@ -2678,13 +2678,20 @@ try
2678
std::wstring systemDirectory;
2679
THROW_IF_FAILED(wil::GetSystemDirectory(systemDirectory));
2680
2681
- e["commandline"] = WideToMultiByte(std::format(
2682
- L"{}\\{} {} {} {} {}", systemDirectory, WSL_BINARY_NAME, WSL_DISTRIBUTION_ID_ARG, distributionIdString, WSL_CHANGE_DIRECTORY_ARG, WSL_CWD_HOME));
2681
+ e["commandline"] =
2682
+ WideToMultiByte(std::format(L"{}\\{} {} {}", systemDirectory, WSL_BINARY_NAME, WSL_DISTRIBUTION_ID_ARG, distributionIdString));
2683
2684
e["name"] = WideToMultiByte(Configuration.Name);
2685
e["guid"] = WideToMultiByte(distributionProfileId);
2686
e["icon"] = WideToMultiByte(IconPath.native());
2687
2688
+ // Set default starting directory to home directory if not already specified
2689
+ // This allows Windows Terminal to override with startingDirectory setting
2690
+ if (e.find("startingDirectory") == e.end())
2691
+ {
2692
+ e["startingDirectory"] = "~";
2693
+ }
2694
+
2695
// See https://github.com/microsoft/terminal/pull/18195. Supported in terminal >= 1.23
2696
e["pathTranslationStyle"] = "wsl";
2697
test/windows/UnitTests.cpp
+4
-1
@@ -2539,9 +2539,12 @@ Error code: Wsl/InstallDistro/WSL_E_DISTRO_NOT_FOUND
2539
wil::GetSystemDirectoryW(systemDir);
2540
2541
VERIFY_ARE_EQUAL(
2542
- std::format("{}\\{} {} {} {} {}", systemDir, WSL_BINARY_NAME, WSL_DISTRIBUTION_ID_ARG, distroIdString, WSL_CHANGE_DIRECTORY_ARG, WSL_CWD_HOME),
2542
+ std::format("{}\\{} {} {}", systemDir, WSL_BINARY_NAME, WSL_DISTRIBUTION_ID_ARG, distroIdString),
2543
launchProfile["commandline"].get<std::string>());
2544
2545
+ // Verify that startingDirectory is set to home directory
2546
+ VERIFY_ARE_EQUAL(launchProfile["startingDirectory"].get<std::string>(), "~");
2547
+
2548
auto iconLocation = wsl::shared::string::MultiByteToWide(launchProfile["icon"].get<std::string>());
2549
if (defaultIcon)
2550
{