on master help sign in
Fix jump behavior, goto_implementation now jump
6b3c9d8Ivan Tham
helix-term/src/commands.rs+2−2
@@ -1308,7 +1308,7 @@ pub fn normal_mode(cx: &mut Context) {
1308// Store a jump on the jumplist.
1308// Store a jump on the jumplist.
1309fn push_jump(editor: &mut Editor) {
1309fn push_jump(editor: &mut Editor) {
1310 let (view, doc) = editor.current();
1310 let (view, doc) = editor.current();
1311− let jump = { (doc.id(), doc.selection(view.id).clone()) };
1311+ let jump = (doc.id(), doc.selection(view.id).clone());
1312 view.jumps.push(jump);
1312 view.jumps.push(jump);
1313}
1313}
1314
1314
@@ -2446,7 +2446,7 @@ pub fn jump_backward(cx: &mut Context) {
2446 let count = cx.count();
2446 let count = cx.count();
2447 let (view, doc) = cx.current();
2447 let (view, doc) = cx.current();
2448
2448
2449− if let Some((id, selection)) = view.jumps.backward(count) {
2449+ if let Some((id, selection)) = view.jumps.backward(view.id, doc, count) {
2450 view.doc = *id;
2450 view.doc = *id;
2451 let selection = selection.clone();
2451 let selection = selection.clone();
2452 let (view, doc) = cx.current(); // refetch doc
2452 let (view, doc) = cx.current(); // refetch doc
helix-term/src/keymap.rs+4−1
@@ -280,7 +280,10 @@ pub fn default() -> Keymaps {
280
280
281 // z family for save/restore/combine from/to sels from register
281 // z family for save/restore/combine from/to sels from register
282
282
283+ KeyEvent { // supposedly ctrl!('i') but did not work
284+ code: KeyCode::Tab,
285+ modifiers: KeyModifiers::NONE,
283− ctrl!('i') => commands::jump_forward, // TODO: ctrl-i conflicts tab
286+ } => commands::jump_forward,
284 ctrl!('o') => commands::jump_backward,
287 ctrl!('o') => commands::jump_backward,
285 // ctrl!('s') => commands::save_selection,
288 // ctrl!('s') => commands::save_selection,
286
289
helix-view/src/view.rs+14−7
@@ -37,17 +37,24 @@ impl JumpList {
37 pub fn forward(&mut self, count: usize) -> Option<&Jump> {
37 pub fn forward(&mut self, count: usize) -> Option<&Jump> {
38 if self.current + count < self.jumps.len() {
38 if self.current + count < self.jumps.len() {
39 self.current += count;
39 self.current += count;
40− return self.jumps.get(self.current);
40+ self.jumps.get(self.current)
41+ } else {
42+ None
41 }
43 }
42− None
43 }
44 }
44
45
46+ // Taking view and doc to prevent unnecessary cloning when jump is not required.
45− pub fn backward(&mut self, count: usize) -> Option<&Jump> {
47+ pub fn backward(&mut self, view_id: ViewId, doc: &mut Document, count: usize) -> Option<&Jump> {
46− if self.current.checked_sub(count).is_some() {
48+ if let Some(current) = self.current.checked_sub(count) {
49+ if self.current == self.jumps.len() {
50+ let jump = (doc.id(), doc.selection(view_id).clone());
51+ self.push(jump);
52+ }
47− self.current -= count;
53+ self.current = current;
48− return self.jumps.get(self.current);
54+ self.jumps.get(self.current)
55+ } else {
56+ None
49 }
57 }
50− None
51 }
58 }
52}
59}
53
60