diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index bf8229441..f384612bf 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -2427,7 +2427,6 @@ fn jumplist_picker(cx: &mut Context) { .views() .flat_map(|(view, _)| { view.jumps - .get() .iter() .map(|(doc_id, selection)| new_meta(view, *doc_id, selection.clone())) }) diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs index 6da4df1f0..8aa4760dc 100644 --- a/helix-view/src/view.rs +++ b/helix-view/src/view.rs @@ -3,29 +3,35 @@ use helix_core::{ pos_at_visual_coords, visual_coords_at_pos, Position, RopeSlice, Selection, Transaction, }; -use std::fmt; +use std::{collections::VecDeque, fmt}; + +const JUMP_LIST_CAPACITY: usize = 30; type Jump = (DocumentId, Selection); #[derive(Debug, Clone)] pub struct JumpList { - jumps: Vec, + jumps: VecDeque, current: usize, } impl JumpList { pub fn new(initial: Jump) -> Self { - Self { - jumps: vec![initial], - current: 0, - } + let mut jumps = VecDeque::with_capacity(JUMP_LIST_CAPACITY); + jumps.push_back(initial); + Self { jumps, current: 0 } } pub fn push(&mut self, jump: Jump) { self.jumps.truncate(self.current); // don't push duplicates - if self.jumps.last() != Some(&jump) { - self.jumps.push(jump); + if self.jumps.back() != Some(&jump) { + // If the jumplist is full, drop the oldest item. + while self.jumps.len() >= JUMP_LIST_CAPACITY { + self.jumps.pop_front(); + } + + self.jumps.push_back(jump); self.current = self.jumps.len(); } } @@ -57,8 +63,8 @@ impl JumpList { self.jumps.retain(|(other_id, _)| other_id != doc_id); } - pub fn get(&self) -> &[Jump] { - &self.jumps + pub fn iter(&self) -> impl Iterator { + self.jumps.iter() } /// Applies a [`Transaction`] of changes to the jumplist.