Como você 'refaz' as alterações após 'desfazer' com o Emacs?

268

Este artigo diz que "o Emacs refez porque você pode reverter a direção ao desfazer, desfazendo o desfazer".

O que isto significa? Como um usuário pode "refazer" o Emacs?

prosseek
fonte
3
A resposta abaixo da resposta aceita informa como , se é por isso que você está olhando para essa resposta, que, dada a forma como está escrita, eu esperaria que a maioria das pessoas estivesse realmente procurando por ela.
Aaron Hall
Eu apenas bato na barra de espaço e, depois disso, desfaz o espaço e refaz os desfazeres que você fez até o fim e depois começa a voltar novamente ... Eu sei que existem maneiras muito mais complicadas, mas isso é rápido e rápido. fácil, e é assim que eu rolo.
Nroose 22/10

Respostas:

294

Versão curta: desfazendo o desfazer. Se você desfazer e executar um comando de não edição, como C-f, o próximo desfazer desfará o desfazer, resultando em um refazer.

Versão mais longa:

Você pode desfazer como operar em uma pilha de operações. Se você executar algum comando (mesmo um comando de navegação como C-f) após uma sequência de operações de desfazer, todas as ações serão enviadas para a pilha de operações. Portanto, o próximo desfazer desfaz o último comando. Suponha que você tenha uma sequência de operações assim:

  1. Inserir "foo"
  2. Inserir "barra"
  3. Inserir "Adoro spam"

Agora, você desfaz. Desfaz a última ação, resultando na seguinte lista:

  1. Inserir "foo"
  2. Inserir "barra"

Se você fizer algo diferente de desfazer neste momento - por exemplo C-f, a pilha de operações será assim:

  1. Inserir "foo"
  2. Inserir "barra"
  3. Inserir "Adoro spam"
  4. Desfazer inserção "Adoro spam"

Agora, quando você desfaz, a primeira coisa que é desfeita é a desfazer. Resultando em sua pilha original (e estado do documento):

  1. Inserir "foo"
  2. Inserir "barra"
  3. Inserir "Adoro spam"

Se você executar um comando de modificação para interromper a sequência de desfazer, esse comando será adicionado após a desfazer e, portanto, será a primeira coisa a ser desfeita posteriormente. Suponha que você salte sobre a "barra" em vez de bater C-f. Então você teria

  1. Inserir "foo"
  2. Inserir "barra"
  3. Inserir "Adoro spam"
  4. Desfazer inserção "Adoro spam"
  5. Excluir "barra"

Essa adição / re-adição acontece ad infinitum. Demora um pouco para se acostumar, mas realmente dá ao Emacs um mecanismo de desfazer / refazer altamente flexível e poderoso.

Michael Ekstrand
fonte
117
Caso isso pareça irritante, a grande vantagem é que você sempre pode voltar a um estado anterior. Na maioria dos editores, desfazer várias alterações e digitar acidentalmente um personagem deixaria você "preso" sem nenhuma maneira de refazer o que você desfez. O Emacs torna isso trivial.
phils
3
Suponho que, em sua construção, se uma pessoa quisesse fazer isso no papel, você precisaria de duas pilhas. Porque, por exemplo, no ponto em que você escreveu "Agora, você desfaz. Desfaz a última ação, resultando nas seguintes list: "você (compreensivelmente) não mostrou o desfazer, e se ele tivesse feito muitos desfazer, você não os mostraria até que algo fosse feito para interromper a sequência de desfazer, então você os adicionaria. Outra maneira de mostrar isso seria ter uma lista e adicionar anulações à lista antes mesmo de serem quebradas, mas anotar onde o cursor está na lista, para que possamos saber de onde as anulações estão trabalhando para trás
barlop
25
Parece irritante.
Felipe
13
Não sei por que essa resposta foi aceita quando nem sequer lhe diz COMO .
Aaron Hall
8
Infelizmente, esta resposta não diz nada sobre o comando refazer que é Cg C- /.
Vishnuprasanth
211

Desfazer: C-_

Para refazer depois de desfazer: C-g C-_

Digite várias vezes C-_ para refazer o que foi desfeito C-_ Para refazer um comando do emacs várias vezes, execute seu comando, digite C-xze digite várias vezes na ztecla para repetir o comando (interessante quando você deseja executar várias vezes uma macro)

Jérôme Radix
fonte
4
Para repetir coisas, você também pode usar C-u, por exemplo C-u 8 *(insere oito * onde está o cursor). Então você pode usar C-u x C-_para desfazer x etapas.
Patrick
10
Isso não tem nada a ver com a pergunta original, mas logo após executar uma macro do teclado (com C-x e), basta pressionar equantas vezes for necessário para executá-la novamente.
Christian Berg
7
Além disso, C-/e C-x usão alternativas para desfazer ligações de teclas, equivalentes a C-_. Eu prefiro, C-/pois é mais fácil de acertar.
Rory O'Kane
8
Aviso: quando esta resposta diz que C-g C-_"refazerá depois de desfazer", isso se aplica somente na primeira vez que você clicar na combinação. Depois disso, repita a tecla Desfazer sem C-g. Então, para refazer três vezes logo após desfazer, digite C-g C-_ C-_ C-_. Se você digitar C-g C-_ C-g C-_ C-g C-_, você só vai andar em círculos, desfazendo seu redo do seu desfazer ...
Rory O'Kane
@ RoryO'Kane Eu não sei muito sobre o emacs, então, por favor, corrija-me onde estou errado, mas, como o Cg C-_ não tem efeito após uma refazer, pode ser que seja porque ele só funciona depois desfazer (como sua descrição "refazer após desfazer" sugere. Portanto, não é tanto o fato de andar em círculos refazendo um desfazer ou refazer etc. não está fazendo nada porque um desfazer não foi feito apenas antes. _ Cg C-_ não está indo em um círculo após o primeiro, é literalmente fazer nada.
barlop
56
  • Para desfazer uma vez:C-/
  • Para desfazer duas vezes: C-/ C-/
  • Para refazer uma vez, imediatamente após desfazer:C-g C-/
  • Para refazer duas vezes, imediatamente depois de desfazer: C-g C-/ C-/. Observe que C-gnão é repetido.
  • Para desfazer imediatamente novamente , uma vez:C-g C-/
  • Para desfazer imediatamente novamente, duas vezes: C-g C-/ C-/
  • Para refazer novamente , o mesmo…

Se você pressionou alguma tecla (digitando caracteres ou apenas movendo o cursor) desde o último comando de desfazer, não é necessário digitar C-gantes do próximo desfazer / refazer. C-gé apenas uma chave segura a ser atingida que não faz nada por si só, mas conta como uma chave que não desfaz para sinalizar o fim de sua sequência de desfazer. Pressionar outro comando como C-ftambém funcionaria; é só que ele moveria o cursor de onde você o tinha.

Se você pressionar C-gou outro comando quando não pretendia, e agora estiver desfazendo na direção errada, basta pressionar C-gpara inverter sua direção novamente. Você terá que desfazer todo o caminho através de refazer e desfazer acidentalmente antes de conseguir desfazer o que deseja, mas, se continuar batendo C-/, acabará atingindo o estado desejado. De fato, todos os estados em que o buffer já esteve estão acessíveis, se você pressionar C-guma vez e pressionar o C-/suficiente.

Atalhos alternativos para undo, diferentes C-/, são C-_, C-x u, e M-x undo.

Consulte Desfazer no manual do Emacs para obter mais detalhes sobre o sistema de desfazer do Emacs.

Rory O'Kane
fonte
38

Para aqueles que desejam ter a funcionalidade mais comum de desfazer / refazer, alguém escreveu undo-tree.el. Ele fornece a aparência de desfazer não-Emacs, mas fornece acesso a toda a "árvore" do histórico de desfazer.

Gosto do sistema de desfazer interno do Emacs, mas acho este pacote muito intuitivo.

Aqui está o comentário do próprio arquivo:

O Emacs possui um poderoso sistema de desfazer. Ao contrário do sistema padrão de desfazer / refazer na maioria dos softwares, ele permite recuperar qualquer estado passado de um buffer (enquanto o sistema padrão de desfazer / refazer pode perder estados passados ​​assim que você refaz). No entanto, esse poder tem um preço: muitas pessoas acham o sistema de desfazer do Emacs confuso e difícil de usar, gerando vários pacotes que o substituem pelo sistema de desfazer / refazer menos poderoso, mas mais intuitivo.

Tanto a perda de dados com o desfazer / refazer padrão quanto a confusão do desfazer do Emacs decorrem da tentativa de tratar o desfazer histórico como uma sequência linear de alterações. Não é. O `desfazer-modo de árvore 'fornecido por este pacote substitui o sistema de desfazer do Emacs por um sistema que trata de desfazer o histórico como ele é: uma árvore de mudanças de ramificação. Essa idéia simples permite que o comportamento mais intuitivo do sistema de desfazer / refazer padrão seja combinado com o poder de nunca perder nenhum histórico. Um bônus adicional adicional é que, em alguns casos, o desfazer histórico pode ser armazenado com mais eficiência, permitindo que mais alterações sejam acumuladas antes que o Emacs comece a descartar o histórico.

Trey Jackson
fonte
3
Fantástico! Quem disse que o emacs undo era insondável? :-)
Peter.O
Surpreendente! conceitualmente som e usuário intuitivo. Isso deve estar nos pacotes padrão. Um comentário: desejo que também seja exibida uma mensagem de alerta ao refazer a partir de um ponto de ramificação, não apenas ao reverter para ele. Por exemplo, quando o usuário chama um refazer: 'Refazendo de um ponto de ramificação' ou 'Ramificação padrão de refazer usada' - apenas para alertar o usuário de que há mais de um ramo.
Basel Shishani
1
Outra abordagem para esse problema, que é muito mais simples de implementar e não requer um visualizador, é manter SOMENTE o último ponto de ramificação e fornecer três comandos: desfazer, refazer, alternar ramificação. Desfazer / refazer alertará quando o ramo for atingido, e switch-branch apenas alternará se em um ramo apenas emitir uma mensagem 'não em um ramo'. Se a ramificação ocorrer a qualquer momento, o ponto de ramificação anterior será perdido. Isso resolveria o problema de perda de estado razoavelmente bem e com complexidade mínima.
Basel Shishani
1
Cuidado com isso tem um bug de longa data em refazer o que pode falhar aleatoriamente: github.com/syl20bnr/spacemacs/issues/9903 - conhecida desde 2014
ideasman42
@ ideasman42 Aparentemente, este é um "não bug": dr-qubit.org/Lost_undo-tree_history.html
Dalker
19

Cuidado com uma manobra de desfazer árvore para refazer !

Muitos "kits iniciais" populares (prelude, purcell, spacemacs) vêm com desfazer a árvore. A maioria (todos?) Até a habilita automaticamente. Como mencionado, desfazer a árvore é uma maneira útil de visualizar e percorrer a árvore de desfazer / refazer. O prelúdio até fornece um acorde-chave ( uu) e também C-x u.

O problema é: desfazer-árvore parece destruir padrão Emacs' e bem conhecido vinculativo para refazer :C-g C-/ .

Em vez disso, você pode usar estas chaves simétricas para desfazer / refazer :

C-/     undo
C-S-/   redo

Isso é útil, pois às vezes você deseja refazer rapidamente sem abrir o visualizador.

Micah Elliott
fonte
Este. Estou usando o Spacemacs e não conseguia descobrir por que não estava funcionando para mim. Obrigado!
mghaoui
11

Acho redo.elextremamente útil para desfazer / refazer "normal" e costumo associá-lo ao CSz e desfazer ao Cz, assim:

(when (require 'redo nil 'noerror)
    (global-set-key (kbd "C-S-z") 'redo))

(global-set-key (kbd "C-z") 'undo)

Basta baixar o arquivo, colocá-lo no seu caminho lisp e colar o acima no seu .emacs.

monotux
fonte
Os comentários no cabeçalho de redo.el dizem que são feitos para o XEmacs. Existe algum problema em usá-lo no GNU Emacs e em outros Emacsen relacionados?
A. Levy
Eu não tive quaisquer problemas ainda, e eu tenho usado por pelo menos 6 meses :)
monotux
4
De emacswiki.org/emacs/RedoMode : No entanto, redo.el está desatualizado e frequentemente destrói o conteúdo do "buffer" porque o comportamento de 'desfazer primitivo' foi ligeiramente diferente do antigo desde o Emacs 22. O RedoPlus é um fork do redo.el e corretamente funciona na versão mais recente do Emacs Você pode obter RedoPlus aqui:. emacswiki.org/emacs/redo+.el
rofrol
2

O Emacs 28 adiciona um comando refazer (chamado undo-redo).

Se você deseja desfazer / refazer mais típico, os seguintes comandos podem ser usados.

(global-set-key (kbd "C-z") 'undo-only)
(global-set-key (kbd "C-S-z") 'undo-redo)
ideasman42
fonte
1

Se você deseja refazer a última operação, faça o seguinte.

  1. ESC
  2. Faça outro desfazer ( C + /)
vineeshvs
fonte
0

Por padrão, refazer no Emacs requer pressionar Cg e desfazer.

No entanto, é possível usar o desfazer interno do Emacs para implementar também um comando refazer.

O pacote desfazer-fu , usa a funcionalidade de desfazer interna do Emacs para expor desfazer e refazer.

ideasman42
fonte