Customize 'evil-undo-system' for redo functionality 怎么解决

最近突然发现evil下的C-r恢复操作功能不正常了,按下的时候会提示Customize 'evil-undo-system' for redo functionality。然后顺便撤销树好像也不正确了,无法恢复之前的操作。这个问题有没有朋友遇到?怎么解决?

evil最近有个更新,不强依赖undo-tree了。同时引入了evil-undo-system来配置用什么undo包(好象是支持undo-tree以及28引入的undo-redo),默认值是一个placeholder,会输出这个提示。

所以,配置下evil-undo-system就好了。

多谢回复,但是还是有点小问题,应该是emacs或者evil的bug。总之,直接在init.el中设置

(setq evil-undo-system 'undo-tree)

是不行的,还是会提示 Customize 'evil-undo-system' for redo functionality。翻看evil中对应代码,是这样的

(defun evil-set-undo-system (system)
  "Set `evil-undo-function' and `evil-redo-function` by SYSTEM."
  (cond
   ((not system)
    (setq evil-undo-function 'undo
          evil-redo-function 'evil--redo-placeholder))
   ((eq system 'undo-redo)
    (setq evil-undo-function 'undo-only
          evil-redo-function 'undo-redo))
   ((eq system 'undo-tree)
    (setq evil-undo-function 'undo-tree-undo
          evil-redo-function 'undo-tree-redo))
   ((eq system 'undo-fu)
    (setq evil-undo-function 'undo-fu-only-undo
          evil-redo-function 'undo-fu-only-redo))
   (t
    (error "Unknown undo system %s" system))))

(defcustom evil-undo-system nil
  "Undo system Evil should use.  If equal to `undo-tree' or
`undo-fu', those packages must be installed.  If equal to
`undo-tree', `undo-tree-mode' must also be activated.  If equal
to `undo-redo', Evil uses commands natively available in Emacs 28."
  :type '(choice (const :tag "Vanilla undo" nil)
                 (const undo-redo)
                 (const undo-tree)
                 (const undo-fu))
  :group 'evil
  :set #'(lambda (sym value)
           (evil-set-undo-system value)
           (set-default sym value)))

猜测是defcustom中那个set指令还不支持或其它什么原因。于是直接在init.el中写

(global-undo-tree-mode)
(evil-set-undo-system 'undo-tree)

问题解决。

emacs版本 27.1 evil版本 20201014.2043

2 个赞

我也遇到了同样的问题,感谢啊

我也试试,我也遇到了,正愁呢