请问emacs怎么获得可靠的撤销功能?

对emacs的撤销插件真的很失望。undo-tree新版还是有问题,换成undo-fu也会出问题。vim那样的persistent undo就不指望了,现在连一个session里面的撤销都不好用,天知道什么时候会抽风。是不是只能放弃所有插件用vanillar emacs的undo命令才可靠?

@yangsheng6810 有一个patch版的undo-tree,可以试试

另外 persistent undo 是最简单的,为啥不指望呢……?直接用 undohist 就行了。

多谢。不想试了,不想做小白鼠了,老是丢东西,受不了。我要的只是一个可靠的撤销功能而已。

在一个session里undo没办法回退,跨session还能行?不可靠的撤销功能再强大也没啊。

另外,是不是有git大家都不用undo了?

undo-tree确实是乱丢数据,吃了亏后一直用emacs自己的undo功能(+undohist +undo-propose),感觉也没有多大不便。

我的配置

(use-package undohist)
(use-package undo-propose)
(global-set-key (kbd "C-?") #'undo-only)
(global-set-key (kbd "C-x u") #'undo-propose)
(add-hook 'after-init-hook
          '(lambda ()
             (require 'undohist)
             (undohist-initialize)

             ;; Patch to make undohist silent
             (define-advice undohist-recover-1 (:override ())
               (let* ((buffer (current-buffer))
                      (file (buffer-file-name buffer))
                      (undo-file (make-undohist-file-name file))
                      undo-list)
                 (when (and (undohist-recover-file-p file)
                            (file-exists-p undo-file)
                            (null buffer-undo-list))
                   (with-temp-buffer
                     (insert-file-contents undo-file)
                     (goto-char (point-min))
                     (let ((alist (undohist-decode (read (current-buffer)))))
                       (if (string= (md5 buffer) (assoc-default 'digest alist))
                           (setq undo-list (assoc-default 'undo-list alist))
                         (message "File digest doesn't match, so undo history will be discarded."))))
                   (when (consp undo-list)
                     (setq buffer-undo-list undo-list)))))))
(setq undohist-directory (no-littering-expand-var-file-name "undohist"))
(setq undohist-ignored-files '("\\.git/COMMIT_EDITMSG$"))

现在官方有了undo-redo,应该会好不少。然后undo-tree的作者最近几个月又忽然开始更新了,据他说修复了一些bug,而且把undo-limit之类的默认值调大了。在不用undo-in-region的前提下,应该基本能用了。

@yangsheng6810 你指的是1月份的更新?那个版本还是有问题,4月份的时候doom已经放弃undo-tree了,默认使用undo-fu。https://github.com/hlissner/doom-emacs/commit/8ab0cd66a71adcce6d9db01fb46e3bd14d3eb304

这个方案可靠性怎么样?用了多久了?出过意外没?

用Emacs自带undo即可。

确实,有version control之后对undo没什么需求

undo-tree 有好多forked版本,一直不知道哪个才是官方的版本,有链接吗?。
我还用的很老的版本,原来还有那么多问题,看来是我用的还不够多。

用的就是emacs自带的undo,没出过问题。undohist 单纯是 save/load,undo-propose 是弹出一个 buffer 让你修改到想要的状态后再把状态应用到原来的 buffer 里。这两个都不像undo-tree一样激进。

@ksqsf 没用过undohist。能不能解释一下?save和load什么

undo-propose倒是用过,不太适应,想法不错。

更新

我看过代码,已经知道是怎么回事了。

另外发现undo-fu-session和undohist功能重合,前者一直在维护。

很多时候反反复复修改,commit的时机你是怎么掌握的?

你的fork要是能够解决undo-tree的问题,那就太好了。evil依赖undo-tree。好多人都在要求干掉这个依赖。你要是能把它弄得稳定些,evil用户肯定都会感谢你。

你不觉得 vanilla emacs 的撤消超级好用吗?

段位不够,之前没用过 :joy:研究研究去

之前换成undo-fu,结果发现也有问题,换回undo-tree了。新版本还行,基本没出现什么数据丢失。

我的undo-tree到现在还没出过问题,不懂

undo-tree真的是一坨…………恶心得一塌糊涂

undo redo穿插的话超麻烦啊,感觉没啥人用自带undo

@casouri 李杀说他用自带的undo