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.

ideasman42
fonte
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)
lista de leis
fonte
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

DaftWooly
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))
ideasman42
fonte