Skip to content

Commit

Permalink
Add View::apply for adjusting jumplist ranges
Browse files Browse the repository at this point in the history
Applying a transaction to a View adjusts the ranges in the jumplist
to ensure that they remain within the text of the document and follow
regular selection invariants (for example, must be have a width of at
least one).
  • Loading branch information
the-mikedavis authored and archseer committed Oct 11, 2022
1 parent a85e386 commit d418f07
Showing 1 changed file with 27 additions and 1 deletion.
28 changes: 27 additions & 1 deletion helix-view/src/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ use crate::{
gutter::{self, Gutter},
Document, DocumentId, ViewId,
};
use helix_core::{pos_at_visual_coords, visual_coords_at_pos, Position, RopeSlice, Selection};
use helix_core::{
pos_at_visual_coords, visual_coords_at_pos, Position, RopeSlice, Selection, Transaction,
};

use std::fmt;

Expand Down Expand Up @@ -62,6 +64,22 @@ impl JumpList {
pub fn get(&self) -> &[Jump] {
&self.jumps
}

/// Applies a [`Transaction`] of changes to the jumplist.
/// This is necessary to ensure that changes to documents do not leave jump-list
/// selections pointing to parts of the text which no longer exist.
fn apply(&mut self, transaction: &Transaction, doc: &Document) {
let text = doc.text().slice(..);

for (doc_id, selection) in &mut self.jumps {
if doc.id() == *doc_id {
*selection = selection
.clone()
.map(transaction.changes())
.ensure_invariants(text);
}
}
}
}

#[derive(Clone)]
Expand Down Expand Up @@ -334,6 +352,14 @@ impl View {
// (None, None) => return,
// }
// }

/// Applies a [`Transaction`] to the view.
/// Instead of calling this function directly, use [crate::apply_transaction]
/// which applies a transaction to the [`Document`] and view together.
pub fn apply(&mut self, transaction: &Transaction, doc: &Document) -> bool {
self.jumps.apply(transaction, doc);
true
}
}

#[cfg(test)]
Expand Down

0 comments on commit d418f07

Please sign in to comment.