我如何在 roblox lua 中复制 'undo' (ctrl + z) 函数?

How would i replicate an 'undo' (ctrl + z) function in roblox lua?

我一直在尝试制作文本编辑器和程序中通常具有的 'undo' 功能。我已经做了某种 'undo' 函数,但它一次只删除 1 个字母,这不是我的目标。我想要一次删除整个单词的东西。

我在 TextBox 上使用了 GetPropertyChangedSignal,我将文本输入其中并将字符串存储在其中,然后每当玩家按下 ctrl + z 时,我首先将文本框的文本设置为table,然后删除最后一个值。

这是我使用的代码(不完全一样,变量当然不同):

local Tab = {};

Box:GetPropertyChangedSignal("Text"):Connect(function()
    Tab[#Tab + 1] = Box.Text;
end);

game:service'Players'.LocalPlayer:GetMouse().KeyDown:Connect(function(key)
    if key == "z" then -- i will add a ctrl check later.
        Box.Text = #Tab > 0 and Tab[#Tab] or "";
        Tab[#Tab] = nil;
    end;
end);

正如我之前提到的,我希望它一次删除整个单词。 我正在考虑使用模式匹配(string.gsubstring.match%s+%w+)一次删除整个单词。

就我所知。将不胜感激。

存储操作列表。为了撤消,恢复最后的动作,重做重复它们。 如果您只想在单词级别撤消,请随意合并形成单词的操作。

H -> append "H"
He -> append "e"
Hel -> append "l"
Helli -> append "i"
Hell -> removeLast "i"
Hello -> append " "
Hello -> append "o"
Hello W -> append "W"

如果可以移动光标,您将需要插入操作,您还必须在其中存储位置。

另一个解决方案是将任何新单词存储在 table.

{"H"}
{"He"}
{"Hel"}
{"Hell"}
{"Hello"}
{"Hello", " "}
{"Hello", " ", "w"}
{"Hello", " ", "wo"}
{"Hello", " ", "wol"}
{"Hello", " ", "wo"}
{"Hello", " ", "wor"}
{"Hello", " ", "worl"}
{"Hello", " ", "world"}

Start/add 空白字符和非空白字符之间的每次切换都会产生一个新项目。要撤消输入的最后一个单词,请将其从列表中删除。 如果你想撤消删除,你必须保留第二个副本以恢复。

你也可以实现链表之类的。这可以变得任意复杂。