diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 082eee61cc1..066df7b2f5e 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -1205,8 +1205,8 @@ namespace winrt::TerminalApp::implementation { if (const auto& control{ _GetActiveControl() }) { - const auto buffer = control.ReadPromptLines(); - _openTaskView(Command::HistoryToCommands(buffer, false)); + const auto context = control.ReadPromptLines(); + _openTaskView(Command::HistoryToCommands(context.History(), context.CurrentCommandline(), false)); } args.Handled(true); } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 76cc4f83ad4..ca692f9de82 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -4341,7 +4341,7 @@ namespace winrt::TerminalApp::implementation return; } - const auto buffer = control.ReadPromptLines(); + const auto buffer = control.ReadEntireBuffer(); buffer; SuggestionResults().Text(buffer); diff --git a/src/cascadia/TerminalControl/ControlCore.cpp b/src/cascadia/TerminalControl/ControlCore.cpp index fac00c6c281..2df12bc8741 100644 --- a/src/cascadia/TerminalControl/ControlCore.cpp +++ b/src/cascadia/TerminalControl/ControlCore.cpp @@ -18,6 +18,7 @@ #include "ControlCore.g.cpp" #include "SelectionColor.g.cpp" +#include "CommandHistoryContext.g.cpp" using namespace ::Microsoft::Console::Types; using namespace ::Microsoft::Console::VirtualTerminal; @@ -1797,34 +1798,38 @@ namespace winrt::Microsoft::Terminal::Control::implementation return hstring(ss.str()); } - hstring ControlCore::ReadPromptLines() const + Control::CommandHistoryContext ControlCore::ReadPromptLines() const { auto terminalLock = _terminal->LockForWriting(); + auto context = winrt::make_self(); + const auto& textBuffer = _terminal->GetTextBuffer(); - std::wstringstream ss; + // std::wstringstream ss; - auto addRowText = [&ss](auto&& row, std::wstring& rowText) { + auto addRowText = [&context](auto&& row, std::wstring& rowText) { const auto strEnd = rowText.find_last_not_of(UNICODE_SPACE); if (strEnd != std::string::npos) { rowText.erase(strEnd + 1); - ss << rowText; + context->History().Append(winrt::hstring{ rowText }); } auto wrapped = row.WasWrapForced(); - if (!wrapped) - { - ss << UNICODE_CARRIAGERETURN << UNICODE_LINEFEED; - } + // if (!wrapped) + // { + // ss << UNICODE_CARRIAGERETURN << UNICODE_LINEFEED; + // } return wrapped; }; // const auto lastRow = textBuffer.GetLastNonSpaceCharacter().Y; for (const auto& mark : _terminal->GetScrollMarks()) { - const bool markHasCommand = mark.start != mark.end; + bool markHasCommand = mark.start != mark.end; + if (!markHasCommand) + continue; auto line = markHasCommand ? mark.end.y : mark.start.y; @@ -1832,17 +1837,19 @@ namespace winrt::Microsoft::Terminal::Control::implementation auto rowText = row.GetText(markHasCommand ? mark.end.x : 0); auto wrapped = addRowText(row, rowText); - - while (wrapped) - { - line++; - const auto& newRow = textBuffer.GetRowByOffset(line); - auto newRowText = newRow.GetText(0); - wrapped = addRowText(newRow, newRowText); - } - } - - return hstring(ss.str()); + wrapped; + // TODO! dea with wrapped commandlines. + line; + // while (wrapped) + // { + // line++; + // const auto& newRow = textBuffer.GetRowByOffset(line); + // auto newRowText = newRow.GetText(0); + // wrapped = addRowText(newRow, newRowText); + // } + } + + return *context; } // Helper to check if we're on Windows 11 or not. This is used to check if diff --git a/src/cascadia/TerminalControl/ControlCore.h b/src/cascadia/TerminalControl/ControlCore.h index d9805c02e3a..99ed9b7ce82 100644 --- a/src/cascadia/TerminalControl/ControlCore.h +++ b/src/cascadia/TerminalControl/ControlCore.h @@ -17,6 +17,8 @@ #include "ControlCore.g.h" #include "SelectionColor.g.h" +#include "CommandHistoryContext.g.h" + #include "ControlSettings.h" #include "../../audio/midi/MidiAudio.hpp" #include "../../renderer/base/Renderer.hpp" @@ -50,6 +52,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation WINRT_PROPERTY(bool, IsIndex16); }; + struct CommandHistoryContext : CommandHistoryContextT + { + WINRT_PROPERTY(Windows::Foundation::Collections::IVector, History, winrt::single_threaded_vector()); + WINRT_PROPERTY(winrt::hstring, CurrentCommandline); + }; + struct ControlCore : ControlCoreT { public: @@ -195,7 +203,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation void ToggleReadOnlyMode(); hstring ReadEntireBuffer() const; - hstring ReadPromptLines() const; + Control::CommandHistoryContext ReadPromptLines() const; static bool IsVintageOpacityAvailable() noexcept; diff --git a/src/cascadia/TerminalControl/ControlCore.idl b/src/cascadia/TerminalControl/ControlCore.idl index 456568ceeb5..3264934115f 100644 --- a/src/cascadia/TerminalControl/ControlCore.idl +++ b/src/cascadia/TerminalControl/ControlCore.idl @@ -49,6 +49,12 @@ namespace Microsoft.Terminal.Control Boolean EndAtRightBoundary; }; + [default_interface] runtimeclass CommandHistoryContext + { + IVector History; + String CurrentCommandline; + }; + [default_interface] runtimeclass SelectionColor { SelectionColor(); @@ -133,7 +139,7 @@ namespace Microsoft.Terminal.Control void EnablePainting(); String ReadEntireBuffer(); - String ReadPromptLines(); + CommandHistoryContext ReadPromptLines(); void AdjustOpacity(Double Opacity, Boolean relative); void WindowVisibilityChanged(Boolean showOrHide); diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index 575272e97b8..d7836b346e3 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -3035,7 +3035,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation { return _core.ReadEntireBuffer(); } - hstring TermControl::ReadPromptLines() const + + Control::CommandHistoryContext TermControl::ReadPromptLines() const { return _core.ReadPromptLines(); } diff --git a/src/cascadia/TerminalControl/TermControl.h b/src/cascadia/TerminalControl/TermControl.h index 618f6cea010..ba68ee82795 100644 --- a/src/cascadia/TerminalControl/TermControl.h +++ b/src/cascadia/TerminalControl/TermControl.h @@ -131,7 +131,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation static Windows::UI::Xaml::Thickness ParseThicknessFromPadding(const hstring padding); hstring ReadEntireBuffer() const; - hstring ReadPromptLines() const; + Control::CommandHistoryContext ReadPromptLines() const; winrt::Microsoft::Terminal::Core::Scheme ColorScheme() const noexcept; void ColorScheme(const winrt::Microsoft::Terminal::Core::Scheme& scheme) const noexcept; diff --git a/src/cascadia/TerminalControl/TermControl.idl b/src/cascadia/TerminalControl/TermControl.idl index 3d87a1577cf..2cda744b660 100644 --- a/src/cascadia/TerminalControl/TermControl.idl +++ b/src/cascadia/TerminalControl/TermControl.idl @@ -84,7 +84,7 @@ namespace Microsoft.Terminal.Control void ToggleReadOnly(); String ReadEntireBuffer(); - String ReadPromptLines(); + CommandHistoryContext ReadPromptLines(); void AdjustOpacity(Double Opacity, Boolean relative); diff --git a/src/cascadia/TerminalSettingsModel/Command.cpp b/src/cascadia/TerminalSettingsModel/Command.cpp index 47e74c87f64..9b14b0852ad 100644 --- a/src/cascadia/TerminalSettingsModel/Command.cpp +++ b/src/cascadia/TerminalSettingsModel/Command.cpp @@ -676,7 +676,9 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation return result; } - winrt::Windows::Foundation::Collections::IVector Command::HistoryToCommands(winrt::hstring history, bool directories) + winrt::Windows::Foundation::Collections::IVector Command::HistoryToCommands(Windows::Foundation::Collections::IVector history, + winrt::hstring /*currentCommandline*/, + bool directories) { std::wstring cdText = directories ? L"cd " : L""; auto result = winrt::single_threaded_vector(); @@ -705,19 +707,23 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation // foundCommands.insert(line, true); }; - std::wstring lineBreak = L"\r\n"; - - std::wstring_view historyView{ history }; - size_t start = 0u; - auto end = historyView.find(lineBreak); - while (end != std::string::npos) + // std::wstring lineBreak = L"\r\n"; + + // std::wstring_view historyView{ history }; + // size_t start = 0u; + // auto end = historyView.find(lineBreak); + // while (end != std::string::npos) + // { + // auto line = historyView.substr(start, end - start); + // createAction(line); + // start = end + lineBreak.length(); + // end = historyView.find(lineBreak, start); + // } + // createAction(historyView.substr(start, end)); + for (const auto&& command : history) { - auto line = historyView.substr(start, end - start); - createAction(line); - start = end + lineBreak.length(); - end = historyView.find(lineBreak, start); + createAction(command); } - createAction(historyView.substr(start, end)); return result; } diff --git a/src/cascadia/TerminalSettingsModel/Command.h b/src/cascadia/TerminalSettingsModel/Command.h index 73d2c1ecc2c..5f16fa741be 100644 --- a/src/cascadia/TerminalSettingsModel/Command.h +++ b/src/cascadia/TerminalSettingsModel/Command.h @@ -68,7 +68,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation void IconPath(const hstring& val); static Windows::Foundation::Collections::IVector ParsePowerShellMenuComplete(winrt::hstring json, int32_t replaceLength); - static Windows::Foundation::Collections::IVector HistoryToCommands(winrt::hstring history, bool directories); + static Windows::Foundation::Collections::IVector HistoryToCommands(Windows::Foundation::Collections::IVector history, winrt::hstring currentCommandline, bool directories); winrt::Windows::UI::Xaml::Data::INotifyPropertyChanged::PropertyChanged_revoker propertyChangedRevoker; diff --git a/src/cascadia/TerminalSettingsModel/Command.idl b/src/cascadia/TerminalSettingsModel/Command.idl index 3ff0f6e6e00..85bc14f05f4 100644 --- a/src/cascadia/TerminalSettingsModel/Command.idl +++ b/src/cascadia/TerminalSettingsModel/Command.idl @@ -50,6 +50,6 @@ namespace Microsoft.Terminal.Settings.Model Windows.Foundation.Collections.IVector warnings); static IVector ParsePowerShellMenuComplete(String json, Int32 replaceLength); - static IVector HistoryToCommands(String commandHistory, Boolean directories); + static IVector HistoryToCommands(IVector commandHistory, String commandline, Boolean directories); } }