Estou usando o recurso undofile no Vim há um tempo. É um recurso muito bom.
No entanto, um aborrecimento é que é muito fácil desfazer acidentalmente as alterações que fiz na última vez em que abri o arquivo; que pode ser de 2 minutos atrás, uma hora atrás, na semana passada ou um mês atrás.
Por exemplo, digamos que eu abro um arquivo, faça algumas alterações, desative e altere alguns outros arquivos e descubra que minhas alterações não foram necessárias ou talvez sejam apenas algumas instruções de depuração temporárias.
Anteriormente, eu podia apenas segurar a utecla até Vim dizer "Já está na mudança mais antiga" :wq
, e estar pronto. Mas agora tenho que ter muito cuidado para não desfazer as alterações que fiz da última vez que abri o arquivo. Não há uma maneira óbvia de ver quando você está fazendo isso.
Existe alguma maneira de tornar isso mais explícito? Por exemplo, mostrando em algum lugar, emitindo um aviso ou até solicitando uma confirmação.
fonte
Respostas:
Eu tive esse problema exato. Aqui está o que eu adicionei ao meu vimrc para corrigi-lo:
Observe que você não define a
undofile
opção; você precisa remover o seu vimrc, se o tiver.Desfazer agora funciona como "normal". Mas nós não escrever manualmente para o arquivo de desfazer com o
wundo
comandoBufWritePost
.A
ReadUndo()
função lê manualmente o arquivo de desfazerrundo
e define aundofile
opção. Agora podemos usar upara voltar à história. Eu mapeei isso para<Leader>u
.Provavelmente isso poderia ser melhor. Ele substitui as informações de desfazer anteriores, para que você não possa voltar para a hora anterior anterior em que editou o arquivo. Mas eu não precisava disso.
fonte
Oooh, ooh, finalmente a chance de mostrar esse comando bacana!
Vim pode "voltar no tempo". Tem um
:earlier
comando ...... que pode reverter o arquivo para um estado anterior. Isso pode ser usado de várias maneiras.
Se você puder fazer uma estimativa aproximada de quanto tempo você levou para fazer essas alterações, poderá fornecer um tempo para esse comando. Ou, por exemplo, se você souber que não alterou o arquivo (exceto as alterações que deseja desfazer) no dia anterior, poderá usar
Se você tiver gravado (salvo) o arquivo apenas uma vez desde as alterações que deseja desfazer ou se não tiver salvo o arquivo, poderá usar
Conforme descrito no
:help
texto, isso reverterá para a versão escrita anteriormente, se você acabou de escrever o arquivo, ou para a última vez que ele foi salvo, se você não tiver nenhuma alteração salva.Isso não responde à sua pergunta com precisão, mas parece um pouco de um problema XY.
fonte
u
e, acidentalmente, passo além das alterações que fiz agora ... Não sei ao certo qual poderia ser o "problema X" original?:earlier
a propósito, mas ainda preciso adivinhar ; assim como eu preciso adivinhar ao usar ou
... Nos casos, provavelmente um pouco melhor, mas eu preferiria algo mais explícito (se possível).:ea 5d
. Você também pode usar a:ea 1f
abordagem. De qualquer forma, é muito menos granular.Atualização 28-06-2015 : Corrigi um pequeno bug e o liberei como um plug-in . O código do plugin é um pouco melhor, pois avisa novamente depois de mover o cursor; Eu recomendo que você use o plugin.
A resposta do superjer funciona muito bem, mas tem o efeito colateral infeliz de que você só pode desfazer alterações da última sessão do Vim, e nem todas as sessões anteriores do Vim.
Isso ocorre porque
wundo
substitui o arquivo de desfazer; não é mesclado. Tanto quanto eu sei, não há como corrigir isso.Portanto, aqui está minha solução alternativa: ela exibirá uma grande mensagem de aviso em vermelho quando você estiver desfazendo alterações no arquivo de desfazer.
Isso é semelhante à resposta de Ingo Karkat , mas não requer um plug-in externo e possui algumas diferenças sutis (exibe aviso em vez de bipe, não é necessário pressionar
u
duas vezes).Nota que este apenas modifica o
u
e<C-r>
se liga, e não oU
,:undo
e:redo
comandos.fonte
Eu tenho o seguinte, que para e emite um bipe quando desfazer atinge o conteúdo persistente do buffer.
Isso se integra ao plugin repeat.vim; requer meu plugin ingo-library .
fonte
Eu realmente gostei da idéia citada, então tomei o
:Revert
comando. Espero que você ache relevante para sua pergunta.As funções auxiliares
Get_seq
eReal_seq
, com base em não- árvore , são necessárias porqueundotree()['seq_cur']
às vezes não é suficiente para identificar a posição atual na árvore de desfazer. Você pode ler mais sobre isso aqui .fonte
au
. o vimrc lá é o culpado. Simplesmente deixe de fora