Possível não usar desfazer árvore no modo maligno?


12

De vez em quando eu me deparo com bugs na desfazer árvore, onde não consigo refazer, com o seguinte bug conhecido , outro relatório e thread do reddit .

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

Isso é muito ruim e pode causar perda de trabalho se você não salvar a versão mais recente do arquivo.


Como nunca uso a funcionalidade de desfazer árvore ramificada, é possível usar o desfazer linear do emacs com o modo maligno?


Nota: Tentei definir (global-undo-tree-mode -1)diretamente após o (evil-mode 1)que desabilita a desfazer a árvore, mas refazer (Ctrl-R) não funciona depois de fazer isso.


2
O Emacs não possui comando 'refazer' (você interrompe a sequência de desfazer e depois desfaz a sequência anterior dos comandos de desfazer). Parece que o que você fez funcionou corretamente.
— Phillip #

1
Se seu objetivo é corrigir o desfazer a árvore, entre em contato com o autor e escreva um e-mail. Reclamar no emacs-devel não vai consertar as coisas. Da mesma forma, se seu objetivo é permitir que o Evil use desfazer baunilha, abra um ticket no rastreador de erros. Lembre-se de que o desfazer baunilha é apenas desfazer, não há refazer, apenas desfazendo o desfazer, portanto, porque desfazer a árvore é usada em primeiro lugar.
— wasamasa

1
Meu objetivo é ter o trabalho desfazer / refazer. Eu não sou tão preocupada exatamente como. Como não uso a funcionalidade de árvore de desfazer a árvore, pensei que seria mais simples usar o desfazer incorporado do emacs. Mesmo assim, relatei o bug ao autor da árvore de desfazer.
— ideasman42

Eu tenho exatamente o mesmo problema, isso acontece cerca de uma vez por dia e é muito frustrante
— cjohansson

Respostas:


7

O autor de undo-tree.elToby Cubitt está atualmente muito ocupado para corrigir esse bug em particular. Se ele tiver tempo no futuro, poderá investigar mais a questão. O autor indicou que ele tem dificuldade em reproduzir o erro de forma confiável e recentemente não conseguiu reproduzi-lo usando a ramificação principal. Isso ocorre apenas ao usar desfazer / refazer na região. O autor sugere apenas desativar o recurso desfazer / refazer na região enquanto isso.

Eu encorajaria fortemente qualquer pessoa motivada a criar uma maneira confiável de reproduzir o problema, começando com o emacs -quso da versão estável atual do Emacs (por exemplo, 25.2.1) e também com a versão mais recente do ramo principal e, em seguida, envie essas receitas para o número de rastreamento de erros 16377 com cópias em carbono para os participantes (Stefan, Toby, Barry e Keith).

O número de rastreamento principal é 16377 e existe um número de rastreamento relacionado 16523:

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

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

Aqui está a solução alternativa que desativa o undo/redo-in-regionrecurso:

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

1
Esta solução alternativa não funciona - eu tentei e, às vezes, ainda consigo refazer a recuperação.
— precisa saber é o seguinte

@ ideasman42 - Até onde eu sei, Toby Cubitt atualmente não sabe que o erro pode ocorrer quando o undo-tree-enable-undo-in-regioné nil; e também nunca vi isso acontecer fora do uso de desfazer na região. Se você conseguir criar uma receita para reproduzir o erro, informe-a à equipe do Emacs - uma cópia em carbono para o Dr. Cubitt também seria útil, e se não houver muitos problemas, eu certamente apreciaria o receita se você conseguir criar uma que seja confiável. Lamento que você esteja tendo problemas ...
— lawlist

Enviei um relatório de erro sem resposta (alguns meses atrás). Projetos como este, dos quais muitas pessoas dependem, realmente devem ter um rastreador de erros público.
— usar o seguinte código

16377 e 16523 são de fato números públicos de rastreamento de bugs do Emacs e undo-treeoficialmente fazem parte dos elparepositórios. Você pode usar o relatório padrão Emacs bug; no entanto, o resultado final pode ser o mesmo - isto é, aguardar o Dr. Cubitt encontrar algum tempo livre em sua agenda lotada ... Em algum momento, outro desfazer guru pode aparecer e ajudar na manutenção do pacote. Passei muito tempo criando um fork personalizado de desfazer árvore que pode desfazer / refazer de maneira semi-linear, e ainda tenho apenas um entendimento básico de como tudo funciona ...
— lawlist

1

Aparentemente, você pode editar evil-pkg.el em ~ / .emacs.d / elpa / evil-xxxxxxx / dir e excluir undo-tree como requisito:

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

fonte


Isso irá desfazer / refazer, o que não é o que o OP deseja.
— wasamasa

1
O autor do blog que eu vinculei disse que permitia que ele usasse a baunilha desfazer do emacs, que parece ser o que o OP queria quando disse "desativar desfazer árvore".
— DaftWooly

1
Isso deve ser realmente um último recurso, porque na próxima vez que você atualizar pacotes, essa personalização será substituída. Seria melhor encontrar uma maneira de obter o comportamento desejado, configurando seu arquivo init.
— Zck

Concordo, infelizmente, parece ser a única maneira de desativar o desfazer a árvore no mal.
— DaftWooly 17/07

Não funciona para mim. Comentei o requisito e undo-treetirei o pacote do caminho para que ele não fosse carregado. Agora, o uso de "refazer" falha com Wrong type argument: commandp, redo.
— Hi-Angel

1

Edit, este é agora um pacote que pode ser usado para desfazer / refazer com o modo maligno - desfazer-fu .


Adicionando resposta à própria pergunta desde que eu estou usando o mal sem desfazer a árvore há algum tempo.

Isso funciona surpreendentemente bem para desfazer / refazer, que envolve o emacs desfazer sem nada pesado como undo-treeou 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))
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.