From 44cc0d8eb0743101724fca8787217a9d0aa01bd4 Mon Sep 17 00:00:00 2001 From: Robin Date: Sat, 12 Jun 2021 14:21:06 +0200 Subject: [PATCH] add alternate file (#223) * add alternate file inspired by vim ctrl-6/kak ga commands. the alternate file is kept per view * apply feedback from #223 * rename to last_accessed * add ga doc * add fail message for ga --- book/src/keymap.md | 1 + helix-term/src/commands.rs | 14 ++++++++++++++ helix-view/src/editor.rs | 7 +++++++ helix-view/src/view.rs | 3 +++ 4 files changed, 25 insertions(+) diff --git a/book/src/keymap.md b/book/src/keymap.md index 65d01b86a..cba89896f 100644 --- a/book/src/keymap.md +++ b/book/src/keymap.md @@ -141,6 +141,7 @@ Jumps to various locations. | y | Go to type definition | | r | Go to references | | i | Go to implementation | +| a | Go to the last accessed/alternate file | ## Object mode diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index f9db55819..0ae2186b1 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -1317,6 +1317,15 @@ fn push_jump(editor: &mut Editor) { view.jumps.push(jump); } +fn switch_to_last_accessed_file(cx: &mut Context) { + let alternate_file = cx.view().last_accessed_doc; + if let Some(alt) = alternate_file { + cx.editor.switch(alt, Action::Replace); + } else { + cx.editor.set_error("no last buffer".to_owned()) + } +} + pub fn goto_mode(cx: &mut Context) { if let Some(count) = cx._count { push_jump(cx.editor); @@ -1338,6 +1347,7 @@ pub fn goto_mode(cx: &mut Context) { match (cx.doc().mode, ch) { (_, 'g') => move_file_start(cx), (_, 'e') => move_file_end(cx), + (_, 'a') => switch_to_last_accessed_file(cx), (Mode::Normal, 'h') => move_line_start(cx), (Mode::Normal, 'l') => move_line_end(cx), (Mode::Select, 'h') => extend_line_start(cx), @@ -2449,6 +2459,10 @@ pub fn jump_backward(cx: &mut Context) { let (view, doc) = cx.current(); if let Some((id, selection)) = view.jumps.backward(view.id, doc, count) { + // manually set the alternate_file as we cannot use the Editor::switch function here. + if view.doc != *id { + view.last_accessed_doc = Some(view.doc) + } view.doc = *id; let selection = selection.clone(); let (view, doc) = cx.current(); // refetch doc diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index bd53c53bb..ef0d8213f 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -88,6 +88,12 @@ impl Editor { pub fn switch(&mut self, id: DocumentId, action: Action) { use crate::tree::Layout; use helix_core::Selection; + + if !self.documents.contains_key(id) { + log::error!("cannot switch to document that does not exist (anymore)"); + return; + } + match action { Action::Replace => { let view = self.view(); @@ -98,6 +104,7 @@ impl Editor { let view = self.view_mut(); view.jumps.push(jump); + view.last_accessed_doc = Some(view.doc); view.doc = id; view.first_line = 0; diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs index 5d2d27fdb..c0a72c78a 100644 --- a/helix-view/src/view.rs +++ b/helix-view/src/view.rs @@ -67,6 +67,8 @@ pub struct View { pub first_col: usize, pub area: Rect, pub jumps: JumpList, + /// the last accessed file before the current one + pub last_accessed_doc: Option, } impl View { @@ -78,6 +80,7 @@ impl View { first_col: 0, area: Rect::default(), // will get calculated upon inserting into tree jumps: JumpList::new((doc, Selection::point(0))), // TODO: use actual sel + last_accessed_doc: None, } }