diff options
author | KunMing Xie <qqzz014@gmail.com> | 2017-08-08 09:32:47 +0800 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2017-08-08 03:32:47 +0200 |
commit | e13b4a21cac9d173885249034fe20fb209b157df (patch) | |
tree | 058839fa07d78d6b26ec605421b67e521272ab23 /src/nvim/undo.c | |
parent | 2753d61e4cb037323d78ed3fd978a10694c902c6 (diff) | |
download | rneovim-e13b4a21cac9d173885249034fe20fb209b157df.tar.gz rneovim-e13b4a21cac9d173885249034fe20fb209b157df.tar.bz2 rneovim-e13b4a21cac9d173885249034fe20fb209b157df.zip |
vim-patch:8.0.0149 (#7127)
Problem: ":earlier" and ":later" do not work after startup or reading the
undo file.
Solution: Use absolute time stamps instead of relative to the Vim start
time. (Christian Brabandt, Pavel Juhas, closes vim/vim#1300, closes
vim/vim#1254)
https://github.com/vim/vim/commit/cbd4de44e8d08fba3c09eb40ad6e36e83faf020a
Diffstat (limited to 'src/nvim/undo.c')
-rw-r--r-- | src/nvim/undo.c | 29 |
1 files changed, 15 insertions, 14 deletions
diff --git a/src/nvim/undo.c b/src/nvim/undo.c index 81af3bfda9..3d7ebc8837 100644 --- a/src/nvim/undo.c +++ b/src/nvim/undo.c @@ -1838,11 +1838,9 @@ void undo_time(long step, int sec, int file, int absolute) } closest = -1; } else { - /* When doing computations with time_t subtract starttime, because - * time_t converted to a long may result in a wrong number. */ - if (dosec) - target = (long)(curbuf->b_u_time_cur - starttime) + step; - else if (dofile) { + if (dosec) { + target = (long)(curbuf->b_u_time_cur) + step; + } else if (dofile) { if (step < 0) { /* Going back to a previous write. If there were changes after * the last write, count that as moving one file-write, so @@ -1880,14 +1878,16 @@ void undo_time(long step, int sec, int file, int absolute) target = 0; closest = -1; } else { - if (dosec) - closest = (long)(time(NULL) - starttime + 1); - else if (dofile) + if (dosec) { + closest = (long)(os_time() + 1); + } else if (dofile) { closest = curbuf->b_u_save_nr_last + 2; - else + } else { closest = curbuf->b_u_seq_last + 2; - if (target >= closest) + } + if (target >= closest) { target = closest - 1; + } } } closest_start = closest; @@ -1916,12 +1916,13 @@ void undo_time(long step, int sec, int file, int absolute) while (uhp != NULL) { uhp->uh_walk = mark; - if (dosec) - val = (long)(uhp->uh_time - starttime); - else if (dofile) + if (dosec) { + val = (long)(uhp->uh_time); + } else if (dofile) { val = uhp->uh_save_nr; - else + } else { val = uhp->uh_seq; + } if (round == 1 && !(dofile && val == 0)) { /* Remember the header that is closest to the target. |