关于emacs中的undo操作的一点疑惑

我们知道emacs中的undo操作, 是按照操作的先后顺序由后向前进行的, 比如有如下操作序列:

a1->a2->a3->…->an

那么在undo时,第一次将undo an, 第二次将undo a(n-1), …, 依次类推. 现在的我有个疑问是:

能否不按照操作的先后顺序, 直接undo 操作流中的某次操作呢? 比如说, 能否跨过(即不undo)an, a(n-1), a(n-2)…,a3 这些操作, 而仅仅undo a2这一个操作呢? 不知当前有没有插件能实现该功能?

ps: undo tree那个插件我试用过, 感觉仅仅是将undo可视化了一下, 貌似无法实现以上所说的功能.

undotree可以直接用鼠标点击节点,实现你所说的仅仅

我试了不行啊, 无法点击某个节点, 只能选中某个节点然后按q键退出. 这样的话,该节点后续的那些操作一样会被undo掉 . 在undo tree中点击某个节点, 和选中该节点然后再按’q’键有什么区别么?

undo tree应该做不到.

哦,我理解错你的意思了,可是你这样undo的话conflict了怎么办

觉得这功能在 undotree 基础上实现不合适。提交次数太密集了,还要解决可能存在的冲突问题。

你需要的是 git rebase 功能。

magit 那么方便,经常随手 commit 一下,需要某个 diff 的时候就 cherry-pick,最终改好了之后,再 squash/rebase,就没有这么纠结的问题了

用版本控制方式实现的, 感觉都太重量级了…,

我只是日常编辑的时候会经常遇到这种场景: 突然发现前面某个地方修改的有问题, 需要undo掉. 然而, 为了undo该点的操作, 不得不将该点之后的所有改动都undo掉, 然后才能undo掉该点的操作, 最后还得把该点之后的改动再redo回来, 感觉比较麻烦. 如果能直接undo掉该点的操作就方便多了…

也许我这个需求在很多人看来都是多余的, 可是我们大emacs教的宗旨就是没有做不到只有想不到, 将一切编辑操作都做到极致. 哈哈~

選中region然後用undo-tree-undo 需要undo-tree-enable-undo-in-region設置爲non-nil。

不建議頻繁使用,否則undo-tree的undo鏈容易被污染而破壞,然後你可能會卡在某些特定的節點回不去了。

使用版本管理纔是終極解決方案

试了你提供的方法, 确实能部分解决我的问题, 还让我get到了一个新技能, 非常感谢!

只是在使用特定region undo的时候, emacs有时会卡死…

C-gESC ESC ESC看看?

我想楼主的需求大概是像上图那样吧,我也特意来复现了一下,但是遇到了一些问题。想请教下层主。我的过程是:

  1. magit-checkout 1
  2. magit-cherry-pick 4

到这里好像就要自己手动编辑一下了:

--->
<<<<<<< HEAD
111
=======
222333444
>>>>>>> 63df37a... complete

我把上面的改成了

111333444

然后我用 magit-status 把 unstaged 的都 staged 了后 commit 了一下,commit message 是 5。

最后我在 5 这里 magit-rebase 到了 master 那里。

虽然最后内容是对的了,但是我 rebase 后 magit-status 查看了没有 commit message 5 的信息(如下图),请问一下是这个过程么?

image

git 是按行来处理变更的。你这种所有变更都在一行之内的情况 git 是没办法自动处理的,必须手工编辑

unrecognized entry in undo-tree-canary

我都背出来了 :astonished:

今天花了些时间按 @Ynjxsjmh 的方式琢磨下这个问题。当然,不过是以 为单位。

branch1

branch1 分支(说好的千秋万载(master),结果二世而亡?)

节点 2 和节点 5 比较重要,此处显然出现了时空撕裂。节点 2 “弑君”后(干掉1)取而代之,节点 5 则秉持如一。

main

main分支(默认 undo/redo 仅能在各自分支跳转)

现在重点是我们希望“弑君”事件从未发生,但期间节点 3、4 则要嫁接到 master 分支上?!merge 冲突不可避免。

使用 git rebase 的话,直接 drop 掉节点 2,然后 edit 节点 3、4 解决冲突。实际操作中:仅需 edit 节点 3。因为 3、4 均在同一分支,可以顺利合并。

而使用 undotree 的话,则是 drop (undo) 掉 2、3、4 节点。接下来,因为编辑器并不提供 merge 功能,只能手动把 3、4 节点的操作照录一遍。

到这里可以大概回答下楼主的问题:能不能仅仅 undo a2 这一个操作,而不 undo a(n-1),a(n-2)…a(3) 这些操作呢?答案是:倒是可以,但前提是先 merge 冲突。因为 undo 回去修改必然产生新分支。而 merge 这一操作代价还真不小。

一个避免 merge 操作的方法是:使用宏录制操作,undo 后把宏播放一遍;还有就是把节点 3、4 的快照复制一下,undo 后再粘贴上。

另一个结论就是: undotree 和 git 分支的工作原理真的很相像。

1 个赞