undo-redo

之前看坛子里有人说 28.1 不稳定,所以编译 Emacs 时一直将版本固定在 27.1,今天忍不住试了下 28.1,发现多了一个 undo-redo 了,试了下,还不错。

这个跟原来的 redo 和undo 有什么不一样吗?

就是undo一个undo,原来你只能C-g C-/来undo一个undo

简单来说就是使用 undo 的时候撤销了你的输入,如果你不想撤销了,只能使用 undo 来继续撤销你原本的撤销。这个时候会有一个问题,就是一不小心撤销撤过头了等各种乱七八糟的问题。

undo-redo 就是恢复你的撤销,恢复到头了就动不了了。相当于在原本的 undoundo 的基础上加了一些限制。

1 个赞

其实我现在用原版的还挺适应的(甚至还省了个 redo 键

怎么说呢,多了一个选择总是好事,偶尔不小心 undo 懵掉的时候用用 undo-redo 也不错。

此外,在 MS-Windows 上 Emacs 现在可以开关输入法了,不知道是因为我是 Linux 上编译的还是什么其他原因,没找到 w32-set-ime-open-status, w32-get-ime-open-status' 这两函数。这代码我没记错的话好像还是论坛里的兄弟贡献的。

之前逛邮件列表的时候,看其他人讨论,Linux 平台应该早就有相关函数了,有人知道叫什么名字吗?直接搜索 ime 没有搜索到。

你的代码使用的是 lexical 还是 dynamic scoping? 现在 mode-line 上可以直接看到了。

dynamic scoping Elisp 后面多了一个 /d 2020-06-24 15-26-02屏幕截图 lexical scoping Elisp 后面多了一个 /l 2020-06-24 15-25-35屏幕截图

2 个赞

这个挺实用~~~

有具体的 redo 函数挺好的。但我现在是 Emacs 27 ,其实是可以一直 redo 的。(不用C-g C-/一个个按)

具体就是 undo 多了,此时执行非编辑动作,(比如 C-f C-b什么的),再执行 undo 的时候就是 redo 了,而且可以一直 redo ,打断它也很简单,开始编辑就行。

参考 How do you ‘redo’ changes after ‘undo’ with Emacs?

但如果要整个很详细的 undo history(多支线分叉),只能用别的插件了。

undo-redo 很奇怪,他的行为不协调。比如你间歇性输入

aaa1 bbb2 ccc3 : 光标停在位置3

undo : 一次会跳回2,两次会跳回1。在位置1 undo-redo 时候会插入 bbb,但是光标却停留在位置1,不会跳转到位置2。

应该是primitive-undo 的问题,我把L3624行换成 (goto-char (+ pos (length string))) 可以临时纠正过来,pcase的其他情况我就改不了了。