开发者

Vim: Maintain the history of a file after it has been changed and reloaded

If I'm editing a file in Vim, then some external program changes the file, Vim tells me:

W11: Warning: File "test.erl" has changed since editing started
See ":help W11" for more info.
[O]K, (L)oad File: 

If I Load the file, though, all the undo history is lost.

Is th开发者_JAVA技巧ere any way to avoid that?


Update: it appears that this is one of the new features in Vim 7.3: https://groups.google.com/group/vim_announce/browse_thread/thread/66c02efd1523554b


I don't believe this is possible.

There is a very useful patch available for the vim source code available here that keeps the undo history after exiting vim and restarting. However, I've just tried it and it seems to fail when the file is edited externally. It might be worth contacting the author or reporting a bug on the patch website to see if this can be overcome.


G'day,

I'm not sure but does setting autoread, i.e. entering :set autoread leave the undo history for the file when it changes?

Hmmmm. I'm thinking probably not because the change history is maintained as line numbers and vim doesn't know if those line numbers are still relevant to the changed file.

BTW WTF are you editing a file that is being changed by external forces anyway? Sounds dangerous to me. (-:


This is a workaround I used before Vim 7.3:

" :e usually clears undo history, so we don't really do :e any more.
" Instead we delete the contents of the buffer, then read the file in, which
" is an operation we can undo.  We must delete the top (empty) line also.

:map :e<Enter> :%d<Enter>:r<Enter>:0<Enter>dd

When you see the warning prompt, you would have to hit ok instead of load, and then perform the load yourself: :e<Enter>

There are two disadvantages (although I found the tradeoff acceptable):

  • You lose the line you were on. Your cursor is left sitting at the top of the file.
  • Vim still thinks the buffer is out of sync with the file, so when you next save, you may need to do :w! instead of the normal :w, and you will need to hit y to confirm the overwrite.

Edit: There might be a workaround for the second problem.

Edit: The first problem could be addressed with a bit more scripting (see :h line.)


I don't see how vim could keep track of something it didn't do.

So, as to the question, I would suggest - source control ... but that's probably not the answer you're looking for.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜