Como faço para refazer (ou seja, "desfazer desfazer") no Vim?

697

No Vim, eu desfiz muitas coisas. Como desfazer isso (ou seja, refazer)?

flybywire
fonte
106
como eu já colecionei 2 votos, acho que isso pertence aqui, pois o vim é o editor de um programador.
22139 flybywire
28
Eu concordo, isso é relacionado à programação e é uma pergunta real.
DigitalRoss
41
Alguém por aqui anda por aí e marca todas as perguntas do Vim como "pertencem ao SU", apesar de a comunidade ter decidido há muito tempo que o Vim pertence ao SO, sendo uma ferramenta de programação.
22430 Brian Carper
@ Brian: Você tem um link para o documento em que esse consenso foi alcançado?
demasiado php
12
meta.stackexchange.com/questions/20251/…, mas eu lembro disso chegando no ano passado. Vim / Emacs são IDEs. Além disso, as linguagens usadas nos arquivos de configuração para ambas são linguagens de script completas de Turing, portanto, o ato de configurar o Vim é, por si só, uma programação.
22430 Brian Carper

Respostas:

907

Ctrl+r

John Millikin
fonte
2
Gostaria apenas de lançar o plugin undoTree por aí, super impressionante para as vezes em que você aparentemente se ferrou com uma enxurrada de desfazer e refazer.
Vendedores Jake
3
Se estou lendo sobre o vi, então meus dedos agem por conta própria. Os comandos vi não funcionam no stackoverflow. :-)
ciscogambo
2
Nota para usuários de Mac: Ctrl + r em um terminal Mac estragará seu dia no vim. Não conheço a combinação adequada de teclas no terminal Mac para desfazer, mas definitivamente NÃO é Ctrl + r!
Novidade
@tpartee Acabei de usar Ctrl + r no vim no aplicativo Terminal do macOS - sem problemas aqui.
Jase
3
Talvez @tpartee significasse bagunçar as Cmd + rcoisas? Certamente faz algo estranho; mas Ctrl + rapenas funcionou bem para mim (Mac + tmux + vim)
dwanderson
133

Verifique também :undolist, que oferece vários caminhos ao longo do histórico de desfazer. Isso é útil se você digitar algo acidentalmente depois de desfazer muito.

Pedro
fonte
22
@amindfv: pegue o número de :undoliste digite :undo 178(digamos) para retroceder para a etapa 178.
Peter
existe alguma maneira de mostrar exatamente o que será desfeito :undolist?
precisa saber é o seguinte
2
@csharpfolk Use o plug-in undotree ( github.com/mbbill/undotree )
54

Use :earlier/ :later. Para refazer tudo o que você precisa fazer

later 9999999d

(supondo que você editado pela primeira vez o arquivo, no máximo 9999999 dias atrás), ou, se você se lembrar a diferença entre estado atual desfazer e precisava de um, uso Nh, Nmou Nspor horas, minutos e segundos, respectivamente. + :later N<CR><=> Ng+e :later Nfpara gravações de arquivo.

ZyX
fonte
1
:latertrabalhou para mim em vi(não vim - procurou por "vi" no google, mas todos os resultados são para "vim"), obrigado!
Luc
@ Luc Em quase todos os lugares onde você vicomanda, há um link simbólico para um executável do vim ou uma cópia dele. Não completamente em toda parte embora.
Zyx
@ZyX Eu gostaria que isso fosse verdade. Eu só uso o vi após o bash lança a vim: command not found. A próxima coisa que faço é alias vim=viporque eu o digito automaticamente, mas, mesmo assim, é o velho e simples vi. Além disso, refazer (ctrl + r) teria funcionado corretamente se vi fosse um alias para o vim.
Luc
2
9999999d é 27395 anos atrás. Presumo que o recurso desfazer não foi implementado no vi naquela época. Você pode economizar um esforço exaustivo de digitação e usar um número razoável. O 9999d corresponde a cerca de 27 anos, 999d a 2,7 anos. Eu acho que na maioria dos casos isso é suficiente ...
ChristophK
45

Documentação do Vim

<Undo>      or                  *undo* *<Undo>* *u*
u           Undo [count] changes.  {Vi: only one level}

                            *:u* *:un* *:undo*
:u[ndo]         Undo one change.  {Vi: only one level}

                            *CTRL-R*
CTRL-R          Redo [count] changes which were undone.  {Vi: redraw screen}

                            *:red* *:redo* *redo*
:red[o]         Redo one change which was undone.  {Vi: no redo}

                            *U*
U           Undo all latest changes on one line.  {Vi: while not
            moved off of it}
geowa4
fonte
30

No modo de comando, use a Utecla para desfazer e Ctrl+ rpara refazer. Dê uma olhada em http://www.vim.org/htmldoc/undo.html .

Xinus
fonte
Que tal no modo de inserção?
YuFeng Shen 02/02/19
1
Quando o poder do vim está no modo de comando. Nós não precisamos refazer no modo de inserção
Tomas Hrubovcak
O link está (efetivamente) quebrado.
Peter Mortensen
14

Primeiro, pressione a Esctecla para sair do modo de edição.

Então,

Para desfazer , use a utecla quantas vezes quiser desfazer.

Para refazer , use a tecla Ctrl+r

Amol Udage
fonte
11

Consulte a parte "desfazer" e "refazer" do documento Vim .

: red [o] (refazer uma alteração desfeita) e {count} Ctrl+ r(refazer {contagem} alterações desfeitas) estão ok.

Além disso, o {count} anterior (vá para o estado do texto mais antigo {count} vezes) sempre pode ser um substituto para desfazer e refazer.

wangxinalex
fonte
5

CTRL+r

O "r" é minúsculo.

mimetnet
fonte
9
Na verdade, isso não deveria importar - os consoles tradicionais não fazem distinção entre ^re ^R, e Vim segue isso.
ephemient
@ ephemient: concordou. No MS-DOS, você não pode nem digitar uma letra minúscula ^X(onde Xpode haver qualquer letra).
usar o seguinte código
No Vim, Ctrl-shift-R (ctrl com R maiúsculo) é o modo de substituição.
Paul Stelian
5

Usando o VsVim para Visual Studio?

Me deparei com isso ao experimentar o VsVim, que fornece ligações para comandos do Vim no Visual Studio .

Eu sei sobre Ctrlr próprio Vim, mas essa ligação específica não funciona no VsVim (pelo menos não na minha instalação?).

O que funciona, no entanto, é o comando :red. Isso é um pouco mais complicado do que o descrito acima, mas ainda é bom quando você realmente precisa.

Kjartan
fonte
Voto negativo porque a pergunta está perguntando especificamente sobre o vim, não o Visual Studio.
John Von Neumann
3
@JohnVonNeumann Isso está relacionado ao Vim, ou pelo menos às ligações do vim, apenas no contexto do VS. Foi isso que me levou a essa pergunta, afinal. Punir alguém por adicionar um pouco mais de informação parece um pouco duro e desnecessário, você não acha, mesmo que isso talvez se expanda um pouco além do escopo do OP?
Kjartan #
2

Na prática, :undolisté difícil usar o Vim :earliere o :latercontrole de tempo das alterações, que só podem ser utilizados para correções de grãos do curso.

Dado isso, recorro a um plug-in que combina esses recursos para fornecer uma árvore visual de desfazer navegáveis, chamada "Gundo".

Obviamente, isso é algo a ser usado somente quando você precisar de uma correção refinada ou não tiver certeza do estado exato do documento ao qual deseja retornar. Veja: Gundo. Faça um gráfico da sua árvore de desfazer do Vim com estilo

gregory
fonte