Table of Contents
─────────────────
1 插件
2 标准操作
3 比较详细的解释
.. 3.1 Emacs中所有命令均可undo
.. 3.2 Emacs中撤销操作序列的表示方式
.. 3.3 引入插件undo-tree来"改变"Emacs中的undo模式:
4 官方文档
5 总结
简单说来,撤销是取消上次的操作,重做是对撤销的撤销,重复是对上次命令进行
重做。下面重点对撤销和重做进行叙述。
“Emacs中只有撤销,没有重做” 或许是初学者的迷惑,也或许让Emacs蒙受了"很
烂的编辑器,怪不得很多人不愿意用"的评价。其实,真正的答案很简单: `撤销是
取消上次的操作,重做是对撤销的撤销' 对这简单的两句话若能真正理解,你或许
便能知晓真正的答案。当知晓真正的答案之时,你或许会感觉到,Emacs如峰回路转
般,让你不得不收回对它以前的无知评论,重新对它产生新的认识。不光是这个小
小的功能,其实在整个Emacs的前进过程中,如果能坚持下去,你会遇到很多类似的
境况,也许,这也是为什么Emacs的学习曲线不同于其它,是“螺旋”的吧。
这里给出众多Emacs学修中的一员,在经历众多Emacs道路中的困难之一,对其现象
做一个简单的重现,希望能让没有使用过Emacs的朋友,能体会到一点使用它的感觉。
1 插件
══════
通过undo-tree插件选择需要恢复的操作
┌────
│ C-x u 进入 undo-tree-visualizer-mode , p n 上下移动,在分支之前 b f 左右切换,t 显示时间戳,选定需要的状态后, q 退出。这是主要的操作,其它的自己摸索好了……
└────
参考:[] 和 [emacs 新手必
看: undo-tree]
[emacs 新手必看: undo-tree]
2 标准操作
══════════
对撤销的撤销便是重做(或者向前撤销)
┌────
│ 第一,执行 C-x u 向后撤销
│ 第二,执行 C-g 然后 C-x u 就是向前撤销了。
└────
参考:[Emacs中的撤销]
[Emacs中的撤销]
http://www.cnblogs.com/chaolong/archive/2013/07/11/3183241.html
3 比较详细的解释
════════════════
3.1 Emacs中所有命令均可undo
─────────────
所有命令均可undo, 包括undo本身,所有命令emacs都一视同仁,所以:
undo+undo=redo
┌────
│ emacs 把相同类型的操作,合并为一个事件。比如说往缓冲区里打字,也就是 self-insert-command,如果每次 undo ,只是撤消掉一个字符,那就太僵硬了,所以 self-insert-command 的操作,每20次合并为一个事件,一次 undo ,撤消掉20个字符。
│ 而 undo 的猥琐之处在于,只要连续的 undo ,无论多少个,都是一个事件……当然,这也是必需的,不然你 undo 了20次之后,又突然开始 redo ……而恰巧这时又是夜深人静的话……
└────
3.2 Emacs中撤销操作序列的表示方式
────────────────
┌────
│ undo 之后想要 redo ,就要进行一个其它类型的操作,随便输入一个字符或者移动一下光标都可以,不过标准答案是 C-g 。
│
│ s1--s2--s3--s4
│ )
│ s3 u3--u4
│ / | (
│ | \ s5--s6--s7--s8--s9
│ | \ )
│ | u5--u6--u7--u8--u9
│ \
│ s10----sn
│
│ 假设 u3 表示 undo s3 。从 s9 开始 undo,顺着 emacs 的“undo蛇”往回走,到了 u3 的时候,就是 undo undo s3,也就是 s3 了,而这一串 undo,也成了“undo贪吃蛇”的一部分。虽然 emacs 保留了全部的操作状态,但是从 s10 返回 s1 却要将近20步,而普通的编辑器只要两步。
│
│ 这个必需得动手实验后才能有一个直观的印象,按以下步骤操作: (g C-g) (u undo)
│
│ 1g2g3g4guu5g6g7g8g9guuuuuu10(可以把end-of-line绑到空格代替C-g)
└────
3.3 引入插件undo-tree来"改变"Emacs中的undo模式:
────────────────────────
┌────
│ 其实这种“undo蛇”完全可以表示成 undo tree。s10 到 s1 ,两步;再到 s4,四步(有一步是切换分支)……
│
│ s10----sn
│ /
│ s1--s2--s3--s4
│ \
│ s5--s6--s7--s8--s9
│
│ 不知道 emacs 为什么没有使用这种方式,可能是因为选择分支之类的操作很难描述吧。
│
│ 好了,不提这么伤感的事,现在有一个扩展叫作 undo-tree ,基本解决了这个问题。 undo-tree 安装使用都很简单:
│
│ ;放到load-path中,配置文件中添加
│ (require 'undo-tree)
│ (global-undo-tree-mode)
│
│ 由于篇幅所限,就不截图了
│
│ C-x u 进入 undo-tree-visualizer-mode , p n 上下移动,在分支之前 b f 左右切换,t 显示时间戳,选定需要的状态后, q 退出。这是主要的操作,其它的自己摸索好了……
└────
参考:[emacs 新手必看: undo-tree]
[emacs 新手必看: undo-tree]
4 官方文档
══════════
查阅Emacs `C-h i' 信息中有关Undo的内容,如下:
┌────
│ Any command other than an undo command breaks the sequence of undo commands. Starting from that moment, the entire sequence of undo commands that you have just performed are themselves placed into the undo record, as a single set of changes. Therefore, to re-apply changes you have undone, type C-f or any other command that harmlessly breaks the sequence of undoing; then type C-/ to undo the undo command.
└────
亦可参考:
[http://www.cnblogs.com/wendellyi/archive/2013/08/29/3290366.html]
5 总结
══════
其实redo就是对undo的undo,undo会将本身当作被redo的对象,但是连续的undo
之间不会被打断,(当然其中的每次undo仍然会视为一个change),通过 `C-g'
打断连续的Undo操作,再 `C-/' 就实现了对上次的undo 进行 undo,其实感觉上,
Emacs将一切操作线性化,即简化了设计,又符合人的思维次序,而通过
undo-tree却将这个undo变成了树状结果,便于理解,但是实践上未必更实用。目
前暂时不用相关的插件。
Author: QuietHeart
Email: quiet_heart000@126.com
Created: 2015-12-10 三 17:15
阅读(10100) | 评论(0) | 转发(0) |