From af43549eb3a6add4c9ae5ac86f30fc2bd0325ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sat, 27 Jun 2015 15:19:10 +0200 Subject: Make :earlier and :later accept arguments similar to vim Currently the following arguments are accepted: {count} Go to older text state {count} times. {N}s Go to older text state about {N} seconds before. {N}m Go to older text state about {N} minutes before. {N}h Go to older text state about {N} hours before. {N}d Go to older text state about {N} days before --- text.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'text.c') diff --git a/text.c b/text.c index cb7e1c7..f19d5cb 100644 --- a/text.c +++ b/text.c @@ -647,14 +647,36 @@ static size_t history_traverse_to(Text *txt, Action *a) { return pos; } -size_t text_earlier(Text *txt) { - Action *earlier = txt->history->earlier; - return history_traverse_to(txt, earlier); -} - -size_t text_later(Text *txt) { - Action *later = txt->history->later; - return history_traverse_to(txt, later); +size_t text_earlier(Text *txt, int count) { + Action *a = txt->history; + while (count-- > 0 && a->earlier) + a = a->earlier; + return history_traverse_to(txt, a); +} + +size_t text_later(Text *txt, int count) { + Action *a = txt->history; + while (count-- > 0 && a->later) + a = a->later; + return history_traverse_to(txt, a); +} + +size_t text_restore(Text *txt, time_t time) { + Action *a = txt->history; + while (time < a->time && a->earlier) + a = a->earlier; + while (time > a->time && a->later) + a = a->later; + time_t diff = labs(a->time - time); + if (a->earlier && a->earlier != txt->history && labs(a->earlier->time - time) < diff) + a = a->earlier; + if (a->later && a->later != txt->history && labs(a->later->time - time) < diff) + a = a->earlier; + return history_traverse_to(txt, a); +} + +time_t text_state(Text *txt) { + return txt->history->time; } bool text_save(Text *txt, const char *filename) { -- cgit v1.2.3