可能在邪恶模式下不使用撤消树吗?


12

我每隔一段时间就会在undo-tree中遇到错误,无法通过以下已知错误另一个报告reddit线程来重做。

primitive-undo: Unrecognized entry in undo list undo-tree-canary

确实很糟糕,并且如果您没有保存该文件的最新版本,可能会导致工作丢失。


由于我从未使用过分支撤消树功能,是否可以在邪恶模式下使用emacs线性撤消?


注意:我尝试过(global-undo-tree-mode -1)直接设置,(evil-mode 1)然后禁用撤消树,但是重做(Ctrl-R)在执行此操作后不起作用。


2
Emacs没有“ redo”命令(您可以中断撤消序列,然后撤消前面的撤消命令序列)。听起来您所做的工作正常。
菲尔斯(Philips)

1
如果您的目标是修复撤消树,请联系其作者并给他们写一封电子邮件。抱怨emacs-devel不会解决问题。同样,如果您的目标是允许Evil使用香草撤消,请在其Bug跟踪器上打开故障单。请记住,尽管原始撤消仅是撤消,但根本没有重做,只能撤消撤消,因此为什么要首先使用撤消树。
wasamasa

1
我的目标是进行撤消/重做。我不是那么大惊小怪。由于我不使用undo-tree 的功能,所以我认为使用emacs内置的undo最简单。即使这样,我已经向撤消树作者报告了该错误。
ideaman42 '17

我有完全相同的问题,它每天大约发生一次,非常令人沮丧
cjohansson

Answers:


7

undo-tree.elToby Cubitt 的作者目前很忙,无法修复此特定错误。如果将来有时间,他可能会进一步调查该问题。作者表示,他很难可靠地重现该错误,并且最近无法使用master分支重现该错误。它仅在使用撤消/重做区域时发生。作者建议同时关闭撤消/重做区域功能。

我强烈鼓励任何有志于emacs -q通过使用当前稳定发行版的Emacs(例如25.2.1)以及最新版本的master分支,再提出一个可靠的方法来重现此问题的人,然后将这些方案提交给错误跟踪编号16377,并抄送给参与者(Stefan,Toby,Barry和Keith)。

主跟踪号是16377,并且有一个相关的跟踪号16523:

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=16377

https://debbugs.gnu.org/cgi/bugreport.cgi?bug=16523

这是关闭undo/redo-in-region功能的解决方法:

(setq undo-tree-enable-undo-in-region nil)

1
此解决方法不起作用-我尝试过,有时仍会重做。
ideaman42

@ ideasman42-据我所知,Toby Cubitt目前不知道当undo-tree-enable-undo-in-regionis 时可能发生错误nil;而且,我也从未见过它发生在使用区域内撤消之外。如果您能够提出重现此错误的方法,请向Emacs小组报告-向Cubitt博士提供复本也将有所帮助,并且如果操作不太麻烦,我肯定会感激如果您能够提出一种可靠的配方。抱歉,您遇到了问题...
法律列表

我确实邮寄了一个错误报告,但没有任何答复(几个月前)。许多人所依赖的这样的项目实际上应该有一个公共的错误跟踪器。
ideaman42

16377和16523确实是Emacs的公共bug跟踪编号,undo-tree并且正式是elpa存储库的一部分。您可以使用标准报告Emacs错误;但是,最终结果可能是相同的-例如,等待Cubitt博士在繁忙的工作日程中找到一些空闲时间...在某个时候,另一个撤消专家可能会来帮助您维护软件包。我花了很多时间来创建一个自定义的undo-tree分支,该分支可以半线性方式进行undo / redo,但我仍然
对这

1

显然,您可以在〜/ .emacs.d / elpa / evil-xxxxxxx / dir中编辑evil-pkg.el并根据需要删除undo-tree:

(define-package "evil" "20140109.605" "Extensible Vi layer for Emacs." '((goto-chg "1.6")))

资源


这将破坏撤消/重做,这不是OP想要的。
wasamasa

1
我链接的博客的作者说,它允许他使用emacs的香草撤消,这似乎是OP在他说“禁用撤消树”时想要的。
DaftWooly

1
这确实应该是最后解决的方法,因为下次您更新软件包时,此自定义设置将被覆盖。最好找到一种通过配置init文件来获得所需行为的方法。
zck

我同意,不幸的是,这似乎是在邪恶中禁用撤消树的唯一方法。
DaftWooly

对我不起作用。我注释掉了需求,然后将undo-tree软件包移开,以免加载。现在,使用“ redo”失败Wrong type argument: commandp, redo
Hi-Angel

1

编辑,这是一个现在可以使用邪恶模式-undo-fu进行撤消/重做的软件包。


自从我已经使用邪恶的w / o undo-tree一段时间以来,为自己的问题添加了答案。

这对撤消/重做非常有效,它可以打包emacs撤消而不会像undo-treeor 那样繁重redo+

(global-undo-tree-mode -1)

(defun simple-redo ()
  (interactive)
  (let
    (
      (last-command
        (cond
          ;; Break undo chain, avoid having to press Ctrl-G.
          ((string= last-command 'simple-undo) 'ignore)
          ;; Emacs undo uses this to detect successive undo calls.
          ((string= last-command 'simple-redo) 'undo)
          (t last-command))))
    (condition-case err
      (progn
        (undo) t)
      (user-error
        (message "%s" (error-message-string err)))))
  (setq this-command 'simple-redo))

(defun simple-undo ()
  (interactive)
  (let
    (
      (last-command
        (cond
          ;; Emacs undo uses this to detect successive undo calls.
          ((string= last-command 'simple-undo) 'undo)
          ((string= last-command 'simple-redo) 'undo)
          (t last-command))))
    (condition-case err
      (progn
        (undo-only) t)
      (user-error
        (message "%s" (error-message-string err)))))
  (setq this-command 'simple-undo))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.