rikki
rikki

Reputation: 441

Redo after reopening a file in Vim

I am using vim editor. I was writing a program and did some of the changes in the file after which I "undo" all the changes and by mistake closed the file. Later I realized that the approach that I was doing in the code is right, So I again opened the file and tried to do "redo" operation,but as I have closed the session I think I have lost all the history. Can somebody please tell me if I can do redo by some means as retyping the whole thing again is quite tedious. Is there some way in which I can redo changes after opening a new session of Vim file

Upvotes: 2

Views: 1541

Answers (2)

SergioAraujo
SergioAraujo

Reputation: 11800

Another approach, in case you have executed some commands, is recovering your command history by redirecting it into a register.

:redir @h
:history
:redir END
:set paste
"hp


:redir @h ............. start redirecting output to register "h"
:history .............. outputs all commands history
:redir END ............ stops redirecting 
:set paste ............ to avoid wrong indentation
"hp ................... puts the "h" register in the current position

you can control where to put it by doing...

 0put h  .............. pastes the `h` register at the line zero

Once you have a series of commands into a file or register it makes easier to build a function like:

function! Helo()
         echo "hello world"
endfunction

If by any change you have used a macro, let's say q, you can retrive it or even edite it, because macros are regular registers that you can reassign as you want. For example, on insert mode you can type:

 Ctrl-r q .................... pastes register q 

 :let @q=  ................... starts reassingning macro q
 :let @q=  ctrl-r q .......... pastes the q register on its reassignment

setting register q to "hello vim"

 :let @q = "ihello\<Return>vim\<Esc>"

OBS: Using double quotes you can use control keys as seen above

Any complex command can be saved into the clipboard

 :let @+ = @:   .............. places last command on the clipboard
 :@+ ......................... uses clipboard as command

Upvotes: 0

Ingo Karkat
Ingo Karkat

Reputation: 172570

For that you need to have :help persistent-undo enabled:

When unloading a buffer Vim normally destroys the tree of undos created for that buffer. By setting the 'undofile' option, Vim will automatically save your undo history when you write a file and restore undo history when you edit the file again.

Unfortunately, 'undofile' is off by default, so unless you've configured it (and if you've tried redo and failed, that looks like it's off), it's of no use for your current problem.

If the swap-file is still lying around (unlikely as there was a clean exit of Vim), you might be able to grab small incoherent bits of your edits from it.

soap box

To preempt the typical comments: You probably have to accept the loss right now, but take this as an opportunity to rethink your approach. Persistent undo is a really nice feature. With a modern revision control systems (like Git or Mercurial), you can commit often and only locally, and revising your edits is easy to do. Even if that's not an option, there are plugins for Vim (like my writebackup plugin) that make it very easy to frequently save "snapshots" of important editing states. Any of these could save you from the data loss next time!

Upvotes: 5

Related Questions