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