Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix jump_backwards behaviour when jumplist is at capacity #10968

Merged
26 changes: 18 additions & 8 deletions helix-view/src/view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,16 @@ impl JumpList {
self.jumps.truncate(self.current);
// don't push duplicates
if self.jumps.back() != Some(&jump) {
// If the jumplist is full, drop the oldest item.
// If the jumplist is full, drop the oldest items until we have space for another addition.
while self.jumps.len() >= JUMP_LIST_CAPACITY {
self.jumps.pop_front();
if self.jumps.pop_front().is_some() {
the-mikedavis marked this conversation as resolved.
Show resolved Hide resolved
self.current = self.current.saturating_sub(1);
}
}

self.jumps.push_back(jump);
self.current = self.jumps.len();
}
self.current = self.jumps.len();
}

pub fn forward(&mut self, count: usize) -> Option<&Jump> {
Expand All @@ -63,13 +65,21 @@ impl JumpList {

// Taking view and doc to prevent unnecessary cloning when jump is not required.
pub fn backward(&mut self, view_id: ViewId, doc: &mut Document, count: usize) -> Option<&Jump> {
if let Some(current) = self.current.checked_sub(count) {
if self.current.checked_sub(count).is_some() {
let cur_jump = (doc.id(), doc.selection(view_id).clone());
if self.current == self.jumps.len() {
let jump = (doc.id(), doc.selection(view_id).clone());
self.push(jump);
self.push(cur_jump.clone());
}
self.current = current;
self.jumps.get(self.current)
// We need to do this separately from checked_sub above as pushing to the jumplist might change the position of self.current
self.current = self.current.saturating_sub(count);
self.jumps.get(self.current).and_then(|next_jump| {
if next_jump == &cur_jump {
self.current -= 1;
self.jumps.get(self.current)
} else {
Some(next_jump)
}
})
} else {
None
}
Expand Down
Loading