From 2eb6aa9e20901c53ec7c288d47592043649b1bbd Mon Sep 17 00:00:00 2001 From: Philipp Jungkamp Date: Sat, 5 Jul 2025 00:24:54 +0200 Subject: Introduce `history_since_` value expansion The `history_since_` value expansion allows incremental parsing of a buffer's history. declare-option int my_last_history_id define-command my-process-history ... # process the initial buffer history my-process-history %val{bufname} 0 %val{history} set-option buffer my_last_history_id 0 # only process new history changes on idle hook buffer NormalIdle %{ evaluate-commands %exp{ my-process-history \ %%val{bufname} \ %%opt{my_last_history_id} \ %%val{history_since_%opt{my_last_history_id}} } set-option buffer my_last_history_id %val{history_id} } --- doc/pages/expansions.asciidoc | 5 +++++ src/buffer_utils.cc | 2 +- src/buffer_utils.hh | 2 +- src/main.cc | 7 +++++++ 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/doc/pages/expansions.asciidoc b/doc/pages/expansions.asciidoc index cf55902f..37e5811c 100644 --- a/doc/pages/expansions.asciidoc +++ b/doc/pages/expansions.asciidoc @@ -305,6 +305,11 @@ The following expansions are supported (with required context _in italics_): history), and each _modification_ is presented as in `%val{uncommitted_modifications}`. +*%val{history_since_id}*:: + _in buffer, window scope_ + + a partial history of the buffer in the same format as `%val{history}` + starting after entry _id_ + *%val{history_id}*:: _in buffer, window scope_ + history id of the current buffer, an integer value which refers to a diff --git a/src/buffer_utils.cc b/src/buffer_utils.cc index a2d2e709..994dbd23 100644 --- a/src/buffer_utils.cc +++ b/src/buffer_utils.cc @@ -392,7 +392,7 @@ static String modification_as_string(const Buffer::Modification& modification) modification.content->strview()); } -Vector history_as_strings(const Vector& history) +Vector history_as_strings(ConstArrayView history) { Vector res; for (auto& node : history) diff --git a/src/buffer_utils.hh b/src/buffer_utils.hh index 96e89743..f677c34e 100644 --- a/src/buffer_utils.hh +++ b/src/buffer_utils.hh @@ -97,7 +97,7 @@ void write_buffer_to_backup_file(Buffer& buffer); void write_to_debug_buffer(StringView str); -Vector history_as_strings(const Vector& history); +Vector history_as_strings(ConstArrayView history); Vector undo_group_as_strings(const Buffer::UndoGroup& undo_group); String generate_buffer_name(StringView pattern); diff --git a/src/main.cc b/src/main.cc index bf382dd2..fb78669d 100644 --- a/src/main.cc +++ b/src/main.cc @@ -412,6 +412,13 @@ static const EnvVarDesc builtin_env_vars[] = { { "history", false, [](StringView name, const Context& context) -> Vector { return history_as_strings(context.buffer().history()); } + }, { + "history_since_", true, + [](StringView name, const Context& context) -> Vector + { return history_as_strings( + ArrayView(context.buffer().history()) + .subrange(str_to_int(name.substr(14_byte)) + 1) + ); } }, { "uncommitted_modifications", false, [](StringView name, const Context& context) -> Vector -- cgit v1.2.3