@@ -162,7 +162,7 @@ void TriggerTree::Reconstruct(std::string_view matchesString, std::function<void
162162 {
163163 const auto & [originalTriggers, originalReplace, replaceImage, replaceCommand,
164164 isCaseSensitive, isWord, doPropagateCase, uppercaseStyle,
165- doNeedFullComposite, doKeepComposite, isKorEngInsensitive] = match;
165+ doNeedFullComposite, doKeepComposite, isKorEngInsensitive, doPasteToReplace ] = match;
166166
167167 std::vector<std::wstring> triggers;
168168 if (isKorEngInsensitive)
@@ -209,7 +209,8 @@ void TriggerTree::Reconstruct(std::string_view matchesString, std::function<void
209209 // TODO: Abstract the extra conditions of the options and warn the user if ignored
210210 .propagateCase = doPropagateCase && !isCaseSensitive && replaceType == Ending::EReplaceType::TEXT ,
211211 .uppercaseStyle = uppercaseStyle,
212- .keepComposite = doKeepComposite && is_korean (replace.back ()) && replaceType == Ending::EReplaceType::TEXT ,
212+ .keepComposite = doKeepComposite && is_korean (replace.back ()) && replaceType == Ending::EReplaceType::TEXT && !doPasteToReplace,
213+ .pasteToReplace = doPasteToReplace || replaceType == Ending::EReplaceType::IMAGE ,
213214 };
214215
215216 const EndingMetaData endingMetaDataBase{
@@ -617,7 +618,7 @@ void TriggerTree::OnInput(const InputMessage(&inputs)[MAX_INPUT_COUNT], int leng
617618void TriggerTree::replaceString (const Ending& ending, const Agent& agent, std::wstring_view stroke, const InputMessage (&inputs)[MAX_INPUT_COUNT], int inputLength, int inputIndex, bool doNeedFullComposite)
618619{
619620 const auto & [replaceStringIndex, replaceType, replaceStringLength, backspaceCount, cursorMoveCount,
620- propagateCase, uppercaseStyle, keepComposite] = ending;
621+ propagateCase, uppercaseStyle, keepComposite, pasteToReplace ] = ending;
621622
622623 const std::wstring_view originalReplaceString{ mReplaceStrings .data () + replaceStringIndex, replaceStringLength };
623624
@@ -646,10 +647,20 @@ void TriggerTree::replaceString(const Ending& ending, const Agent& agent, std::w
646647 {
647648 std::vector<FakeInput> fakeInputs{ backspaceCount, FakeInput{ FakeInput::EType::KEY , FakeInput::BACKSPACE_KEY } };
648649 const auto & [str, ret] = run_command_and_get_output (originalReplaceString);
649- fakeInputs.reserve (fakeInputs.size () + str.size ());
650- for (wchar_t c : str)
650+ if (pasteToReplace)
651651 {
652- fakeInputs.emplace_back (FakeInput::EType::LETTER , c);
652+ push_current_clipboard_state ();
653+ set_clipboard_text (str);
654+ // Popping the clipboard state is done in main.
655+ fakeInputs.emplace_back (FakeInput::EType::HOT_KEY_PASTE );
656+ }
657+ else
658+ {
659+ fakeInputs.reserve (fakeInputs.size () + str.size ());
660+ for (wchar_t c : str)
661+ {
662+ fakeInputs.emplace_back (FakeInput::EType::LETTER , c);
663+ }
653664 }
654665 send_fake_inputs (fakeInputs, false );
655666 return ;
@@ -820,6 +831,28 @@ void TriggerTree::replaceString(const Ending& ending, const Agent& agent, std::w
820831
821832 std::fill_n (std::back_inserter (fakeInputs), cursorMoveCount + additionalCursorMoveCount, FakeInput{ FakeInput::EType::KEY , FakeInput::LEFT_ARROW_KEY });
822833
834+ if (pasteToReplace)
835+ {
836+ const auto firstLetter = std::ranges::find (fakeInputs, FakeInput::EType::LETTER , &FakeInput::type);
837+ const auto end = fakeInputs.end ();
838+ if (firstLetter != end)
839+ {
840+ const auto lastLetter = std::find_if (firstLetter, end, [](const FakeInput& input) { return input.type != FakeInput::EType::LETTER ; });
841+ std::wstring str;
842+ str.reserve (std::distance (firstLetter, lastLetter));
843+ for (auto it = firstLetter; it != lastLetter; ++it)
844+ {
845+ str += it->letter ;
846+ }
847+
848+ push_current_clipboard_state ();
849+ set_clipboard_text (str);
850+ // Popping the clipboard state is done in main.
851+ *firstLetter = FakeInput{ .type = FakeInput::EType::HOT_KEY_PASTE };
852+ fakeInputs.erase (firstLetter + 1 , lastLetter);
853+ }
854+ }
855+
823856 for (FakeInput& fakeInput : fakeInputs)
824857 {
825858 if (fakeInput.type == FakeInput::EType::LETTER && fakeInput.letter == ' \n ' )
0 commit comments