Como descartar meu histórico de desfazer no vim?

23

Desfazer é bom ter no Vim. Mas, às vezes, em um ponto conhecido, quero apagar meu histórico de desfazer - para poder udesfazer alterações individuais, mas apenas voltando a um determinado ponto. (Por exemplo, isso pode ser quando eu cometi a última vez.)

Uma maneira de conseguir isso seria fechar e reabrir o arquivo - o histórico de desfazer começa limpo nesse momento. Mas isso é um aborrecimento.

No passado, eu consegui isso com :edit!. Mas no Vim 7.3, isso não descarta a história de desfazer.

Existe outra maneira de fazer isso, além de fechar o arquivo?

Nathan Long
fonte
então você só quer restaurar o estado do arquivo como estava no seu último commit? você quer essencialmente remapear a tecla 'u' para algo como git checkout -f fileou hg rollback file?
Akira
@akira - não, quero poder usar upara desfazer alterações individuais, mas não além do ponto em que cometi pela última vez. Exatamente como se, toda vez que eu comprometesse, fechasse o arquivo e o reabrisse. O que :edit!costumava fazer - era como fechar o arquivo e reabri-lo. Isso não precisa estar vinculado a um ponto de confirmação, é exatamente o momento em que eu o desejaria com mais frequência.
Nathan Long
ah, isso torna o problema muito mais claro. você deve mudar um pouco sua pergunta.
Akira

Respostas:

11
:set undoreload=0 | edit

deve fazer o que você está pedindo.

Steven
fonte
1
Ha! Apenas desligue esse recurso, não é? :) Não sei por que demorei tanto para perceber isso.
Nathan Long
7

O velho: editar! comportamento em uma linha:

:exe "set ul=-1 | e! | set ul=" . &ul
Aldrik
fonte
Isso funciona. Você se importaria de explicar isso?
Nathan Long
Concatene o valor da configuração de níveis reduzidos no final da sequência de comandos (para que possa ser restaurada) e os execute. Para mais informações consulte a documentação: :h :exe, :h :bar, :h :set-args, :h 'ul'e :h :edit!.
Aldrik
6

A função de Benoit não funcionou para mim, mas eu encontrei algo semelhante no manual do vim, aqui:

http://www.polarhome.com/vim/manual/v73/undo.html#undo-remarks

Coloquei-o em uma função, adicionado ao meu vimrc e ele parece estar funcionando bem no vim 7.3:

" A function to clear the undo history
function! <SID>ForgetUndo()
    let old_undolevels = &undolevels
    set undolevels=-1
    exe "normal a \<BS>\<Esc>"
    let &undolevels = old_undolevels
    unlet old_undolevels
endfunction
command -nargs=0 ClearUndo call <SID>ForgetUndo()

Isso pode ser usado com :ClearUndo.

Nycto
fonte
1
Trabalhando normalmente com o plug-in Gundo e desfaz o recarregamento de arquivos, isso é realmente útil para mim. No entanto, mudei duas coisas: em vez do comando de edição normal (que por si só deixa algum histórico de edição na versão 7.4), eu simplesmente uso uma edição! (e sempre escreva antes de apagar o histórico de desfazer). Parece que algumas listas internas não estão atualizadas corretamente; portanto, se você quiser usá-lo com o plug-in Gundo, faça uma edição adicional! no final das funções, evitará erros mais tarde.
PlasmaHH
@PlasmaHH Você poderia postar a função para limpar o histórico de desfazer, porque eu não entendi o que você mudou ... (talvez você possa publicá-la como resposta para aqueles que usam o gundu). Obrigado
Ben
5

Provavelmente:

:let old_ul=&ul
:set ul=-1
:let &ul=old_ul
:unlet old_ul

( 'ul'é alias para 'undolevels').

Benoit
fonte
Isso funciona! Agora estou tentando fazer um único comando fazer isso - de preferência :edit!. Para começar, criei uma função chamada ClearUndos () com os comandos que você listou, mas chamá-la não parece fazer nada, ao passo que executar os comandos individualmente faz ...
Nathan Long
3
:command -nargs=0 Reset let old_ul=&ul | set ul=-1 | e! | let &ul = old_ul | unlet old_ul
Benoit
isso significa que é o conteúdo da função? Não está funcionando para mim, mas talvez eu tenha entendido errado. Além disso - talvez mova isso para sua própria resposta?
Nathan Long
Talvez você não possa colocar matérias-primas |em um conteúdo de comando. Em seguida, crie uma função que faz o que eu disse na minha resposta, e definir o comando para call thefunction().
Benoit
3

"Limpar histórico de desfazer (: w para limpar o arquivo de desfazer, se apresentado)
command! -bar UndoClear exe "set ul=-1 | m-1 | let &ul=" . &ul

  • Quando você define 'undolevels' como -1, as informações de desfazer não são imediatamente apagadas, isso acontece na próxima alteração, ou seja m-1, que na verdade não altera o seu texto.
  • Quando 'undofile'estiver ativado, :wlimpe o arquivo de desfazer ou faça o encadeamento UndoClear|w.
Bohr
fonte
1

Em um script:

function! <SID>ForgetUndo
     let old_ul = &ul
     set ul=-1
     let &ul = old_ul
     unlet old_ul
endfunction
command -nargs=0 Reset call <SID>ForgetUndo()

Em seguida, use :Resetpara chamá-lo.

Benoit
fonte
Sua linha de definição de função precisa () no final.
Nathan Long
Isso é estranho - a execução desses comandos individualmente funciona bem e o eco dos valores em toda a função mostra que eles estão definidos e desabilitados adequadamente. Mas executar a função não redefine meu histórico de desfazer - depois, ainda posso desfazer várias vezes. Talvez o set ul=comando afete apenas uma variável local até a saída do script e, como a alteramos antes da saída do script, isso nunca afeta o ambiente? Você testou esta função e a fez funcionar - ou seja, há algo estranho na minha configuração?
Nathan Long