问题标签 [undo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
design-patterns - “撤消”功能的最佳设计模式
可能重复:
撤消引擎的设计模式
一般来说,您如何处理在您的应用程序中支持“撤消”功能?我曾开发过类似的 Web 应用程序和桌面应用程序,但我从未真正对自己制作的任何“撤消”系统感到满意。
air - Adobe AIR 默认浏览器操作
我正在开发基于 html/javascript 支持的空中项目。我在javascript类上创建了撤消/重做系统,但它受到浏览器(webkit)自己的撤消(ctr+z)操作的干扰(它专注于最后修改的输入元素)。我可以关闭浏览器默认行为吗?
java - 如何在文本编辑器中设计撤消和重做?
我项目的一部分是编写一个文本编辑器,用于输入一些规则、编译我的应用程序并运行它。编写编译器已结束并发布测试版。在最终版本中,我们必须在文本编辑器中添加撤消和重做。我使用一个文件并定期保存它以供文本编辑器使用。如何为我的文本编辑器设计撤消和重做?文件持久化的结构有什么变化?
git - 有没有办法撤销“git revert head”的影响?
我不小心对存储库中的错误分支运行了命令 - 有没有办法撤消此更改?
algorithm - 内存有限时位图编辑器的快速撤消/重做?
我正在尝试为移动设备(即有限版本的 Photoshop)编写位图编辑器。用户的文档由大约 4 个位图组成,每个位图大小约为 1000x500。
我想要一个尽可能简单的强大且高效的撤消/重做系统。我的目标是大约 0.2 秒来撤消或重做编辑。我正在寻找一些关于我当前预期方法的反馈或一些我可以使用的新想法。我认为我所拥有的太复杂了,所以我对继续进行持谨慎态度,所以只要知道这是我能做的最好的事情就很好了。
我已经为我的撤消/重做系统尝试了使用命令模式和备忘录模式的组合。到目前为止,我得出的一些结论是:
我没有足够的内存,并且我无法将内存写入磁盘的速度足够快,无法在许多情况下使用备忘录来支持对上一个命令的“未执行”操作,例如,如果用户非常快速地完成了几个单独的笔画,我不会能够存储代表用户绘制内容的位图,而无需让用户等待它们被保存。
如果我将文档恢复到其初始状态并重播除最后一个执行撤消的命令之外的所有命令,即使是适度数量的命令(例如重播 10 次油漆笔划或 5 次涂抹笔划也需要约 1 秒),这也太慢了迟缓。
我可以通过定期将整个文档在后台保存到磁盘并在播放命令之前恢复到此检查点来绕过前一点。要撤消比上一个检查点更远的位置,我们在此之前重新加载检查点并重播命令。
方法 2 和 3 可以正常工作,除了随着添加更多图层而保存整个文档变得越来越慢,并且使用 4 个位图(约 5 - 10 秒等待)已经很慢了。因此,我需要修改 3,以便只保存自上次以来更改的内容。
由于许多命令仅在一层上运行,因此仅保存自上一个检查点以来已修改的层是有意义的。例如,如果我有 3 个初始层,我已经指出了可能保存检查点的位置,那么我的命令堆栈可能看起来像这样。
在编辑过程中,我会跟踪自上一个检查点以来哪些图层已被修改。当我恢复检查点时,我只恢复已更改的层,例如在修改第 2 层和第 3 层后恢复 Checkpoint4,我从磁盘重新加载第 2 层和第 3 层的备份。添加检查点时,我只保存到目前为止已修改的图层。我可以使所有这些大部分自动化,除非我的界面中需要用户被迫等待检查点被保存的地方,因为我一次只能在内存中保留大约 1 个图层的临时副本。
你怎么看?它比我希望的要复杂得多,但我看不到任何其他方式。还有其他有用的模式可以让我的生活更轻松吗?
command - 撤消绘画程序
我正在研究如何编写一个支持撤消的绘制程序,并看到很可能命令模式是我想要的。不过,有些事情仍然让我无法理解,我希望有人可以提供一个简单的答案或确认。
基本上,如果我要体现撤消命令的能力,例如在屏幕上标记一个实心圆圈,这是否意味着我需要将圆圈覆盖到内存中的帧缓冲区复制到这个命令对象中?我看不出有任何其他方法可以撤消可能发生的事情,例如,在一堆随机像素颜色上加盖印章。
我听说一种方法只是跟踪前向操作,当执行撤消时,您只需从第 1 步开始并向前拉到撤消前的步骤,但如果您要支持大型操作,这似乎不可行撤消堆栈。
也许解决方案介于您保留每 15-20 个动作的位图并从最后一个“保存”转发开始之间。
有人可以提供有关在这种情况下典型接受的方法是什么的任何见解,或者在命令中保存缓冲区矩形,重做每个动作,或者我完全错过了什么?
更新:很多很好的回应。谢谢大家。我正在从我正在阅读的内容中考虑,我将通过每 N 个操作保存缓冲区来解决此问题,并且当用户发出撤消命令时,从最近保存的缓冲区中重做所有命令。我可以将 N 调整到尽可能高的值,不会明显影响需要响应式撤消的用户体验(以最大限度地减少内存使用),但我怀疑在这一点上没有真正确定,我应该是能够在一帧中执行相当多的动作,这还不算太糟糕。希望这种方法能让我快速确定是否转向另一个方向,而是为需要它的操作保存先前状态的位图矩形。
c# - 如何在程序没有重大变化的情况下实现撤消/重做操作
嗨,我即将向我目前正在编写的应用程序添加新功能。我需要编写撤消/重做功能。但是,我们 90% 的应用程序已经准备好,我不知道在没有已经创建的影响(太多)代码的情况下实现此功能的最佳方法是什么。
version-control - 如何中止mercurial中的合并?
我搞砸了一个合并。我想恢复然后再试一次。
有没有办法在提交之前恢复合并?
hg revert
不做我想做的事,它只会恢复文件的文本。Mercurial 中止了我的第二次合并尝试,并抱怨原始合并仍未提交。
Is there a way to undo a merge after an hg merge
command but before it's committed?
git - Git pull into wrong branch
Myself and one other developer had been merging and pushing our work to a non-master branch called toolwork. That way, we didn't impact the rest of the team. My topic branch was called DPM-93 and my git workflow was this.
That was mostly working fine until I accidently issued these git commands
At that point, a bunch of new stuff showed up in branch toolwork and I'm not sure how to get rid of it short of deleting my workspace and re-cloning from the repo.
Is there any way to back this out to the state before the pull?
emacs - 如何撤消 emacs 中的 call-last-kbd-macro
在 emacs 中,我有时会错误地调用 call-last-kbd-macro。撤消时,我希望撤消以原子方式撤消键盘宏的整个效果,但这不会发生。相反,我发现自己必须一次撤消宏的每一步。如何让emacs在执行宏之前返回到缓冲区状态?