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

undo-tree在连续undo/redo多了之后可能会出bug丢东西,但是一般重要内容要么注释而非删除,要么存在kill-ring/evil-register里,试验性的“试试这种做法,等下再试那种”的代码会用git保存,所以即使bug了也就是多花一点点时间找回来(而不能通过undo/redo快速恢复),影响不大。

git stash

1 个赞

就是那个 kill ring? :rofl:

kill ring和undo/redo不是一码事

可以考虑使用evil模块,然后用vim下的撤销命令进行撤销操作。

我undo/redo最多用的是一两步的,多的话,因为大块代码的删除都是kill的,所以从kill-ring找,counsel-yank-pop挺方便的。这算是个小技巧?不过不能算是解决办法。

我现在用的组合感觉很舒服:Evil+ undohist+ @casouriVundo

效果是 Normal/Visual模式下按u/U进入Undo/Redo的选择中,Vundo也同样设置u/U来选择,按键体验是连贯的,Vundo很好用的。

;; save history
(require undohist)
(setq undohist-ignored-files '("\\.git/COMMIT_EDITMSG$"))
(undohist-initialize)

;; display history
(require vundo)
(setq vundo--window-max-height 5)
(setq vundo-roll-back-on-quit t) ;是否需要回车确认

;; evil keybindings
(require 'evil)
(setq evil-undo-system 'undo-redo)
(evil-define-key '(normal visual) 'global
  "u" (lambda ()
        (interactive)
        (if (not (fboundp 'vundo))
            (evil-undo 1)
          (vundo)
          (vundo-backward 1)))

  ;; replace redo with "U"
  (kbd "C-r") nil
  "U" (lambda ()
        (interactive)
        (if (not (fboundp 'vundo))
            (evil-redo 1)
          (vundo)
          (vundo-forward 1))))

(evil-define-key nil vundo--mode-map
  "u" 'vundo-backward
  "U" 'vundo-forward
  (kbd "<escape>") 'vundo-quit)

2 个赞

undo-tree 还行吧,需要简单配置下。undo-tree-auto-save-history 设置为t也能保存历史。undo-fu-session 也能满足楼主的需求。至于抽风问题,我用最新的undo-tree感觉还好。

2 个赞

老哥这个组合很好用,但是怎么设置保存的历史撤销记录长度呢,看我这个截图,就太长了。

你不想要完整的 undo history 嘛?你编辑的时间够久,自然就很长啊。undohist里面好像没有选项设置长度,可能需要自己去魔改。我倒没觉得这是一个问题。

找了下,好像自带有限制,测试了下也确实,undohist目录下的文件大小有限制,超过之后会清空

那你试一试吧,我也没用过这个选项

主要是做大幅修改的话,undohist下的文件大小膨胀得很快。已经测试过默认就可以了不用管

你应该和 git 搭配使用,任何大幅度的修改过后都应该 stage, 我觉得 undo 设计出来其实主要还是为了回溯前几步的撤销历史,所以你理论上完全可以把size设置的非常小,只保留最新的几个历史节点,这样就不会有过长的问题,看你的使用习惯吧。

1 个赞