HOWTO · Linux

Como realizar operações de Desfazer e Refazer em Vim e Vi

Saiba como desfazer e refazer alterações no Vim e no Vi, usar `:undolist` e `:earlier` para navegar pelo histórico de desfazer e compreender o agrupamento de desfazer.

Nesta página

No Vim, volte ao modo Normal com Esc e, em seguida, pressione u para desfazer a alteração mais recente ou Ctrl-R para refazer uma alteração que acabou de desfazer. Estas são teclas do modo Normal. Os comandos Ex, como :undo e :redo, são inseridos na linha de comandos do Vim depois de :.

Desfazer alterações no Vim e no Vi

Pressione Esc para entrar no modo Normal e, em seguida, pressione u. Para desfazer várias alterações, use uma contagem como 3u ou pressione u repetidamente. As formas Ex :u e :undo também desfazem uma alteração; digite os dois-pontos como parte do comando.

Por exemplo, comece com Hello World. No modo de Inserção, adicione Beautiful entre as palavras e, em seguida, pressione Esc; a linha se torna Hello Beautiful World. Pressione u no modo Normal para restaurar Hello World. Os grupos de desfazer dependem das regras de edição e do contexto do Vim, portanto, não há garantia de que um trecho de digitação forme uma única etapa de desfazer em todas as situações.

O pequeno exemplo de shell abaixo modela os mesmos estados de texto: antes, editado, desfeito e refeito. Ele ilustra a sequência de texto; as teclas do Vim acima são executadas no editor.

before='Hello World'
edited='Hello Beautiful World'
current=$edited
printf 'Edited: %s\n' "$current"
current=$before
printf 'After u: %s\n' "$current"
current=$edited
printf 'After Ctrl-R: %s\n' "$current"
Edited: Hello Beautiful World
After u: Hello World
After Ctrl-R: Hello Beautiful World

Refazer alterações no Vim e no Vi

Depois de desfazer, pressione Ctrl-R no modo Normal para refazer a alteração. Uma contagem como 3<C-R> refaz até três alterações desfeitas. Você também pode inserir :redo na linha de comandos. No exemplo acima, Ctrl-R restaura Hello Beautiful World.

O refazer segue o histórico de desfazer atual. Se você desfizer e depois fizer uma nova edição, o Vim altera esse histórico; não espere que Ctrl-R restaure um ramo de edições abandonado.

Use :undolist para exibir as informações da sequência de desfazer. Para ir para um estado numerado, use :undo {N}; {N} é um número de sequência de desfazer, não um ID de alteração arbitrário. Por exemplo, :undo 3 vai para o número de sequência 3.

Use :earlier {N} para voltar {N} alterações; por exemplo, :earlier 3 volta três alterações. O comando do modo Normal g- vai para estados de texto mais antigos, enquanto g+ avança para estados mais recentes. Esses comandos navegam pelo histórico de desfazer do Vim; eles não selecionam entradas pelos números impressos por :undolist.

Entender os blocos de desfazer e o comando U

O u minúsculo desfaz uma alteração no histórico de desfazer. O U maiúsculo tem um comportamento diferente, focado na linha: no Vim, ele restaura a linha atual para o seu estado anterior de acordo com as regras de desfazer do Vim. Não é outra grafia de u e não significa “desfazer todas as alterações na linha” em todos os contextos de edição. O agrupamento de desfazer pode variar com os comandos usados e com o momento em que o Vim registra uma alteração.

As implementações do Vi diferem, portanto, verifique a ajuda do editor que você está usando se um comando se comportar de forma diferente. O histórico de desfazer do Vim normalmente fica disponível enquanto a sessão de edição permanece aberta. Entre sessões, a persistência depende da configuração do arquivo de desfazer do Vim; salvar com :w grava o buffer, mas por si só não garante que o histórico de desfazer persista.

Perguntas frequentes

Como desfazer várias alterações? Volte ao modo Normal e use uma contagem como 3u, ou repita u.

Qual é a tecla de refazer? Pressione Ctrl-R no modo Normal ou insira :redo na linha de comandos do Vim.

Como posso inspecionar ou navegar pelo histórico de desfazer? :undolist lista as informações da sequência; :undo {N} tem como alvo um número de sequência. :earlier 3 volta três alterações, enquanto g- e g+ se movem entre estados mais antigos e mais recentes.

O Vim mantém o histórico de desfazer depois de fechar? Ele pode manter quando o desfazer persistente está configurado e o arquivo de desfazer está disponível. Sem essa configuração, não presuma que o histórico da sessão sobreviverá ao fechamento do Vim. :w salva o conteúdo do arquivo, não é uma promessa de histórico de desfazer persistente.