Como posso desfazer com segurança as alterações que posso ou não ter feito?

12

Com demasiada frequência cometi o erro de digitar com a janela errada focada (e já o fiz algumas vezes com um autenticador USB). Em programas com muitas teclas de atalho ativadas (Gmail, VLC, Vim), isso geralmente tem a consequência não intencional de fazer modificações indesejadas.

Às vezes, consigo rastrear minhas etapas e lembrar o que eu digitei para reparar quaisquer alterações ou reverter as configurações que eu aprimorei se me recuperar cedo. Infelizmente, esse nem sempre é o caso.

No Vim, eu poderia ter algo tão inócuo e aparente quanto alterar uma linha de texto que é facilmente desfeita. Ou, eu poderia, sem saber, modificar algo não tão facilmente identificado. Se digitar acidentalmente uma sequência de comandos indesejados no Vim, como posso verificar e desfazer edições ou alterações nas configurações?

JohnB
fonte
1
Você está procurando uma ação "reverter"? :e!faria isso
Jasper
1
Eu acho :e!que seria ruim se você não salvou desde o último estado correto e upode ser insuficiente se você digitar várias coisas. (Se você digitou date month, por exemplo, então você teria eliminado uma tag, definir uma marca, e realizou uma pesquisa, que seria muito confuso para desfazer via u.)
wchargin
1
@WChargin Não estou falando de ufazer parte da sequência, realizando algumas desfazer no meio.
yo '

Respostas:

14

Invocar

:undolist

para ver quando você fez o último conjunto de alterações. Se indicar que foram feitas algumas alterações, por exemplo, "3 segundos atrás" e você souber que apenas a alterou intencionalmente , digamos, um minuto atrás, execute

:earlier 10s

para reverter para o estado desejado. Caso contrário, se não houver alterações recentes, você não precisará fazer nada.


Além disso referência: :help undo-tree .

wchargin
fonte
4

Para reformular a pergunta, você está procurando uma maneira de ver ou ser notificado sobre as alterações feitas em um arquivo e, em seguida, usar um recurso de desfazer. Talvez haja outra maneira ou até plugins que suportem isso. Mas vou explicar o que tenho usado para o mesmo propósito.

Você combina o recurso vim existente para fazer isso. Por exemplo, você pode definir uma função como:

" Function: View changes after the last save
function! s:DiffSinceSave()
  let filetype=&ft
  diffthis
  vnew | r # | normal! 1Gdd
  diffthis
  exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype
  exe "normal! ]c"
endfunction
com! DiffSaved call s:DiffSinceSave()

Você pode chamá-lo mais tarde e até mapear uma tecla de atalho.

" Map key to function: View changes after the last save
nnoremap <leader>? :DiffSaved<CR>

Isso abrirá uma exibição diferencial baseada em janela dividida, que mostrará as alterações feitas desde o último salvamento. Depois de identificar as alterações feitas, é possível sair dessa visualização e usar outros recursos do vim, como desfazer e desfazer árvore, etc. ou até plugins para voltar aos estados anteriores.

Percebo que isso não é ideal porque você precisa ter um certo tipo de fluxo de trabalho para que isso seja útil. Mas isso funciona razoavelmente bem. E do lado positivo, não estamos mudando o funcionamento do vim ou contando com algo externo.

Espero que você ache isso útil. Adaptei esta solução há algum tempo a partir de trechos encontrados na Internet, incluindo o vim Wikia. Então é aí que qualquer crédito é devido.

cedido
fonte
3

Parece-me que a resposta simples é pressionar uaté você desfazer uma alteração que desejava manter e pressionar Ctrl-R.

superjer
fonte
0

Como @superjer, continuo pressionando uaté o [+]marcador vermelho na minha linha de status desaparecer.

set statusline=%f\ %#Error#%m%##
joeytwiddle
fonte
Pode ser bom ter uma chave para desfazer automaticamente o último estado não modificado. Mas :e!também é uma boa solução; hoje em dia, o Vim mantém suas alterações "descartadas" no histórico de desfazer.
Joeytwiddle
5
Esse comando é :earlier 1f. Os 1fmeios "1 anterior estado salvo", por isso vai voltar para o tempo anterior que você salvou o arquivo. Se o buffer for modificado, isso desfaz todas as modificações. Se o buffer não for modificado (ou seja, ele está atualmente no estado salvo), ele será transferido para a hora anterior em que você salvou o arquivo.
jamessan