Como posso desfazer um comportamento no Evil semelhante ao do Vim?

17

O comportamento padrão de desfazer no Evil é muito granular, porque considera qualquer coisa entre o modo de inserção e o de saída como uma operação de edição. Quando você insere um parágrafo inteiro do texto durante uma inserção e executa desfazer, o parágrafo inteiro é removido. Por outro lado, o Vim inicia uma nova unidade de desfazer sempre que você move o cursor no modo de inserção por outros meios que não sejam a inserção de texto.

O Evil possui uma variável de personalização que pode ser usada para obter um histórico de desfazer mais refinado:

(setq evil-want-fine-undo t)

Com essa configuração, o Evil inicia uma nova unidade de desfazer quando o cursor é movido no modo de inserção, assim como o Vim. No entanto, essa configuração também interfere na maneira como a operação de substituição é manipulada: se você substituir uma palavra usando cw, precisará desfazer duas vezes para restaurar a palavra original: uma para remover a nova palavra e outra para reinserir a palavra original. Isso é inconsistente com o Vim e não faz muito sentido, pois a substituição deve ser atômica.

A pergunta: como posso configurar o mal e desfazer a árvore para obter o comportamento de desfazer do Vim?

Tmalsburg
fonte
Registre um problema aqui: bitbucket.org/lyro/evil/issues?status=new&status=open (O Evil geralmente considera divergências do vim como bugs).
Shosti
@shosti, você está certo, mas a existência da variável de personalização sugere que eles decidiram fazer uma exceção a essa regra no presente caso. Vou arquivar um bug de qualquer maneira. Vamos ver o que acontece.
tmalsburg
Eu acho que a variável de personalização é realmente obter um comportamento de desfazer mais semelhante ao Emacs (o Emacs não faz operações atômicas da mesma maneira que o vim).
Shosti
Aqui está a nova edição: bitbucket.org/lyro/evil/issue/444/…
tmalsburg 11/11/14

Respostas:

10

Como @shosti apontou que o Evil considera o desvio do comportamento do Vim um bug, arquivei um bug e um dos autores do Evil acrescentou um novo valor possível para evil-want-fine-undo:

(setq evil-want-fine-undo 'fine)

Com essa configuração, você obtém novas unidades de desfazer ao mover o cursor no modo de inserção, mas as operações de substituição são desfeitas em uma única etapa. Até onde eu sei, isso é consistente com o Vim. Veja aqui para detalhes.

Tmalsburg
fonte
2
Esta solução não é mais recomendada porque a 'fineconfiguração foi descontinuada.
tmalsburg
1

De acordo com a descrição da variável (consulte C-h v evil-want-fine-undo), o valor finenão é mais suportado devido a um comportamento inconsistente.

Como uso desfazer para desfazer erros de digitação ou a configuração mencionada ajudou a distribuir.

(setq evil-want-fine-undo t) 

Ocorreu um problema ao desfazer erros na edição da fórmula da tabela organizacional, pois você não precisa sair do modo de inserção se quiser mudar para *Edit Forumlas*with C-'.

Jörn Reimerdes
fonte
Obrigado pela atualização. Solicitei que o problema no Bitbucket fosse reaberto.
tmalsburg