From 7cdf9eeafb350574b226243ed97cd585782a1d8d Mon Sep 17 00:00:00 2001 From: Michael Xu Date: Thu, 5 Dec 2024 07:18:45 -0500 Subject: [PATCH] Open current working directory action. (#18013) ## Summary of the Pull Request Added open current directory action. ## References and Relevant Issues Need to set this: https://learn.microsoft.com/en-us/windows/terminal/tutorials/new-tab-same-directory ## Detailed Description of the Pull Request / Additional comments ## Validation Steps Performed - Ensure shell has been configured - Run "Open current working directory" action in command palette - File explorer opens the correct directory ## PR Checklist - [x] Closes #12859 - [ ] Tests added/passed - [ ] Documentation updated - If checked, please file a pull request on [our docs repo](https://github.com/MicrosoftDocs/terminal) and link it here: #xxx - [ ] Schema updated (if necessary) --- doc/cascadia/profiles.schema.json | 1 + src/cascadia/TerminalApp/AppActionHandlers.cpp | 10 ++++++++++ src/cascadia/TerminalControl/ControlCore.cpp | 6 ++++++ src/cascadia/TerminalControl/ControlCore.h | 2 ++ src/cascadia/TerminalControl/ControlCore.idl | 2 ++ src/cascadia/TerminalControl/TermControl.cpp | 5 +++++ src/cascadia/TerminalControl/TermControl.h | 1 + src/cascadia/TerminalControl/TermControl.idl | 1 + src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp | 2 ++ .../TerminalSettingsModel/AllShortcutActions.h | 3 ++- .../Resources/en-US/Resources.resw | 3 +++ src/cascadia/TerminalSettingsModel/defaults.json | 1 + 12 files changed, 36 insertions(+), 1 deletion(-) diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index 9ecee0e2c1..09be784c15 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -423,6 +423,7 @@ "newWindow", "nextTab", "openAbout", + "openCWD", "openNewTabDropdown", "openSettings", "openSystemMenu", diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 0bfbcff8ad..7b4893fef1 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -1128,6 +1128,16 @@ namespace winrt::TerminalApp::implementation } } + void TerminalPage::_HandleOpenCWD(const IInspectable& /*sender*/, + const ActionEventArgs& args) + { + if (const auto& control{ _GetActiveControl() }) + { + control.OpenCWD(); + args.Handled(true); + } + } + void TerminalPage::_HandleGlobalSummon(const IInspectable& /*sender*/, const ActionEventArgs& args) { diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index 2c7cbf3e5a..b46da5236a 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -1656,6 +1656,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation SearchMissingCommand.raise(*this, make(hstring{ missingCommand }, bufferRow)); } + void ControlCore::OpenCWD() + { + const auto workingDirectory = WorkingDirectory(); + ShellExecute(nullptr, nullptr, L"explorer", workingDirectory.c_str(), nullptr, SW_SHOW); + } + void ControlCore::ClearQuickFix() { _cachedQuickFixes = nullptr; diff --git a/src/cascadia/TerminalControl/ControlCore.h b/src/cascadia/TerminalControl/ControlCore.h index 609aed4283..4881585df4 100644 --- a/src/cascadia/TerminalControl/ControlCore.h +++ b/src/cascadia/TerminalControl/ControlCore.h @@ -157,6 +157,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation void ClearQuickFix(); + void OpenCWD(); + #pragma region ICoreState const size_t TaskbarState() const noexcept; const size_t TaskbarProgress() const noexcept; diff --git a/src/cascadia/TerminalControl/ControlCore.idl b/src/cascadia/TerminalControl/ControlCore.idl index 8a9ac03a84..528bc11458 100644 --- a/src/cascadia/TerminalControl/ControlCore.idl +++ b/src/cascadia/TerminalControl/ControlCore.idl @@ -178,6 +178,8 @@ namespace Microsoft.Terminal.Control Boolean ShouldShowSelectCommand(); Boolean ShouldShowSelectOutput(); + void OpenCWD(); + void ClearQuickFix(); // These events are called from some background thread diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index f2f30f2f60..9540c53196 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -2675,6 +2675,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation } } + void TermControl::OpenCWD() + { + _core.OpenCWD(); + } + void TermControl::Close() { if (!_IsClosing()) diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 42398b751f..507b08155a 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -69,6 +69,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation bool ExpandSelectionToWord(); void RestoreFromPath(winrt::hstring path); void PersistToPath(const winrt::hstring& path) const; + void OpenCWD(); void Close(); Windows::Foundation::Size CharacterDimensions() const; Windows::Foundation::Size MinimumSize(); diff --git a/src/cascadia/TerminalControl/TermControl.idl b/src/cascadia/TerminalControl/TermControl.idl index 8ff69f33c5..9d72977455 100644 --- a/src/cascadia/TerminalControl/TermControl.idl +++ b/src/cascadia/TerminalControl/TermControl.idl @@ -97,6 +97,7 @@ namespace Microsoft.Terminal.Control void ClearBuffer(ClearBufferType clearType); void RestoreFromPath(String path); void PersistToPath(String path); + void OpenCWD(); void Close(); Windows.Foundation.Size CharacterDimensions { get; }; Windows.Foundation.Size MinimumSize { get; }; diff --git a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp index 5d2bd48626..b8ccf1c761 100644 --- a/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionAndArgs.cpp @@ -100,6 +100,7 @@ static constexpr std::string_view ToggleBroadcastInputKey{ "toggleBroadcastInput static constexpr std::string_view OpenScratchpadKey{ "experimental.openScratchpad" }; static constexpr std::string_view OpenAboutKey{ "openAbout" }; static constexpr std::string_view QuickFixKey{ "quickFix" }; +static constexpr std::string_view OpenCWDKey{ "openCWD" }; static constexpr std::string_view ActionKey{ "action" }; @@ -437,6 +438,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { ShortcutAction::OpenScratchpad, RS_(L"OpenScratchpadKey") }, { ShortcutAction::OpenAbout, RS_(L"OpenAboutCommandKey") }, { ShortcutAction::QuickFix, RS_(L"QuickFixCommandKey") }, + { ShortcutAction::OpenCWD, RS_(L"OpenCWDCommandKey") }, }; }(); diff --git a/src/cascadia/TerminalSettingsModel/AllShortcutActions.h b/src/cascadia/TerminalSettingsModel/AllShortcutActions.h index daeb1f399b..b9855d9e30 100644 --- a/src/cascadia/TerminalSettingsModel/AllShortcutActions.h +++ b/src/cascadia/TerminalSettingsModel/AllShortcutActions.h @@ -112,7 +112,8 @@ ON_ALL_ACTIONS(ToggleBroadcastInput) \ ON_ALL_ACTIONS(OpenScratchpad) \ ON_ALL_ACTIONS(OpenAbout) \ - ON_ALL_ACTIONS(QuickFix) + ON_ALL_ACTIONS(QuickFix) \ + ON_ALL_ACTIONS(OpenCWD) #define ALL_SHORTCUT_ACTIONS_WITH_ARGS \ ON_ALL_ACTIONS_WITH_ARGS(AdjustFontSize) \ diff --git a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw index 77c98c7da0..eda7808fc8 100644 --- a/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalSettingsModel/Resources/en-US/Resources.resw @@ -734,4 +734,7 @@ Open quick fix menu + + Open current working directory + diff --git a/src/cascadia/TerminalSettingsModel/defaults.json b/src/cascadia/TerminalSettingsModel/defaults.json index 1d2b8f2c47..e64e676b5e 100644 --- a/src/cascadia/TerminalSettingsModel/defaults.json +++ b/src/cascadia/TerminalSettingsModel/defaults.json @@ -449,6 +449,7 @@ { "command": "experimental.openTasks", "id": "Terminal.OpenTasks" }, { "command": "quickFix", "id": "Terminal.QuickFix" }, { "command": { "action": "showSuggestions", "source": "all"}, "id": "Terminal.Suggestions" }, + { "command": "openCWD", "id": "Terminal.OpenCWD" }, // Tab Management // "command": "closeTab" is unbound by default.