aboutsummaryrefslogtreecommitdiff
path: root/helix-term/src/ui
diff options
context:
space:
mode:
authorMichael Davis2022-11-23 03:28:49 +0000
committerGitHub2022-11-23 03:28:49 +0000
commit42e37a571e75aaf4feb1717dfebe8cf215e535dd (patch)
tree385e494b1d10ce6d40b59162dae0b059d4eeb583 /helix-term/src/ui
parent642a961c032b2a7e7fa67bfc3da54588d0ae8c5b (diff)
Apply transactions to all views (#4733)
* Add a test case for updating jumplists across windows * Apply transactions to all views on history changes This ensures that jumplist selections follow changes in documents, even when there are multiple views (for example a split where both windows edit the same document). * Leave TODOs for cleaning up View::apply * Use Iterator::reduce to compose history transactions Co-authored-by: Blaž Hrastnik <blaz@mxxn.io> Co-authored-by: Blaž Hrastnik <blaz@mxxn.io>
Diffstat (limited to 'helix-term/src/ui')
-rw-r--r--helix-term/src/ui/editor.rs26
1 files changed, 23 insertions, 3 deletions
diff --git a/helix-term/src/ui/editor.rs b/helix-term/src/ui/editor.rs
index 6c8ee2d9..44f89b77 100644
--- a/helix-term/src/ui/editor.rs
+++ b/helix-term/src/ui/editor.rs
@@ -1337,7 +1337,9 @@ impl Component for EditorView {
cx.editor.status_msg = None;
let mode = cx.editor.mode();
- let (view, _) = current!(cx.editor);
+ let (view, doc) = current!(cx.editor);
+ let original_doc_id = doc.id();
+ let original_doc_revision = doc.get_current_revision();
let focus = view.id;
if let Some(on_next_key) = self.on_next_key.take() {
@@ -1413,13 +1415,31 @@ impl Component for EditorView {
let view = view_mut!(cx.editor, focus);
let doc = doc_mut!(cx.editor, &view.doc);
- view.ensure_cursor_in_view(doc, config.scrolloff);
-
// Store a history state if not in insert mode. This also takes care of
// committing changes when leaving insert mode.
if mode != Mode::Insert {
doc.append_changes_to_history(view.id);
}
+
+ // If the current document has been changed, apply the changes to all views.
+ // This ensures that selections in jumplists follow changes.
+ if doc.id() == original_doc_id
+ && doc.get_current_revision() > original_doc_revision
+ {
+ if let Some(transaction) =
+ doc.history.get_mut().changes_since(original_doc_revision)
+ {
+ let doc = doc!(cx.editor, &original_doc_id);
+ for (view, _focused) in cx.editor.tree.views_mut() {
+ view.apply(&transaction, doc);
+ }
+ }
+ }
+
+ let view = view_mut!(cx.editor, focus);
+ let doc = doc_mut!(cx.editor, &view.doc);
+
+ view.ensure_cursor_in_view(doc, config.scrolloff);
}
EventResult::Consumed(callback)