Add last modified file (gm) (#1093)

pull/1220/head
Ivan Tham 3 years ago committed by GitHub
parent 418b833d2b
commit e2b428cc2d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -165,13 +165,14 @@ Jumps to various locations.
| `l` | Go to the end of the line | `goto_line_end` | | `l` | Go to the end of the line | `goto_line_end` |
| `s` | Go to first non-whitespace character of the line | `goto_first_nonwhitespace` | | `s` | Go to first non-whitespace character of the line | `goto_first_nonwhitespace` |
| `t` | Go to the top of the screen | `goto_window_top` | | `t` | Go to the top of the screen | `goto_window_top` |
| `m` | Go to the middle of the screen | `goto_window_middle` | | `c` | Go to the middle of the screen | `goto_window_center` |
| `b` | Go to the bottom of the screen | `goto_window_bottom` | | `b` | Go to the bottom of the screen | `goto_window_bottom` |
| `d` | Go to definition (**LSP**) | `goto_definition` | | `d` | Go to definition (**LSP**) | `goto_definition` |
| `y` | Go to type definition (**LSP**) | `goto_type_definition` | | `y` | Go to type definition (**LSP**) | `goto_type_definition` |
| `r` | Go to references (**LSP**) | `goto_reference` | | `r` | Go to references (**LSP**) | `goto_reference` |
| `i` | Go to implementation (**LSP**) | `goto_implementation` | | `i` | Go to implementation (**LSP**) | `goto_implementation` |
| `a` | Go to the last accessed/alternate file | `goto_last_accessed_file` | | `a` | Go to the last accessed/alternate file | `goto_last_accessed_file` |
| `m` | Go to the last modified/alternate file | `goto_last_modified_file` |
| `n` | Go to next buffer | `goto_next_buffer` | | `n` | Go to next buffer | `goto_next_buffer` |
| `p` | Go to previous buffer | `goto_previous_buffer` | | `p` | Go to previous buffer | `goto_previous_buffer` |
| `.` | Go to last modification in current file | `goto_last_modification` | | `.` | Go to last modification in current file | `goto_last_modification` |

@ -264,9 +264,10 @@ impl Command {
goto_file_vsplit, "Goto files in the selection in vertical splits", goto_file_vsplit, "Goto files in the selection in vertical splits",
goto_reference, "Goto references", goto_reference, "Goto references",
goto_window_top, "Goto window top", goto_window_top, "Goto window top",
goto_window_middle, "Goto window middle", goto_window_center, "Goto window center",
goto_window_bottom, "Goto window bottom", goto_window_bottom, "Goto window bottom",
goto_last_accessed_file, "Goto last accessed file", goto_last_accessed_file, "Goto last accessed file",
goto_last_modified_file, "Goto last modified file",
goto_last_modification, "Goto last modification", goto_last_modification, "Goto last modification",
goto_line, "Goto line", goto_line, "Goto line",
goto_last_line, "Goto last line", goto_last_line, "Goto last line",
@ -763,7 +764,7 @@ fn goto_window_top(cx: &mut Context) {
goto_window(cx, Align::Top) goto_window(cx, Align::Top)
} }
fn goto_window_middle(cx: &mut Context) { fn goto_window_center(cx: &mut Context) {
goto_window(cx, Align::Center) goto_window(cx, Align::Center)
} }
@ -3610,6 +3611,20 @@ fn goto_last_modification(cx: &mut Context) {
} }
} }
fn goto_last_modified_file(cx: &mut Context) {
let view = view!(cx.editor);
let alternate_file = view
.last_modified_docs
.into_iter()
.flatten()
.find(|&id| id != view.doc);
if let Some(alt) = alternate_file {
cx.editor.switch(alt, Action::Replace);
} else {
cx.editor.set_error("no last modified buffer".to_owned())
}
}
fn select_mode(cx: &mut Context) { fn select_mode(cx: &mut Context) {
let (view, doc) = current!(cx.editor); let (view, doc) = current!(cx.editor);
let text = doc.text().slice(..); let text = doc.text().slice(..);

@ -521,9 +521,10 @@ impl Default for Keymaps {
"r" => goto_reference, "r" => goto_reference,
"i" => goto_implementation, "i" => goto_implementation,
"t" => goto_window_top, "t" => goto_window_top,
"m" => goto_window_middle, "c" => goto_window_center,
"b" => goto_window_bottom, "b" => goto_window_bottom,
"a" => goto_last_accessed_file, "a" => goto_last_accessed_file,
"m" => goto_last_modified_file,
"n" => goto_next_buffer, "n" => goto_next_buffer,
"p" => goto_previous_buffer, "p" => goto_previous_buffer,
"." => goto_last_modification, "." => goto_last_modification,

@ -104,6 +104,7 @@ pub struct Document {
last_saved_revision: usize, last_saved_revision: usize,
version: i32, // should be usize? version: i32, // should be usize?
pub(crate) modified_since_accessed: bool,
diagnostics: Vec<Diagnostic>, diagnostics: Vec<Diagnostic>,
language_server: Option<Arc<helix_lsp::Client>>, language_server: Option<Arc<helix_lsp::Client>>,
@ -127,6 +128,7 @@ impl fmt::Debug for Document {
// .field("history", &self.history) // .field("history", &self.history)
.field("last_saved_revision", &self.last_saved_revision) .field("last_saved_revision", &self.last_saved_revision)
.field("version", &self.version) .field("version", &self.version)
.field("modified_since_accessed", &self.modified_since_accessed)
.field("diagnostics", &self.diagnostics) .field("diagnostics", &self.diagnostics)
// .field("language_server", &self.language_server) // .field("language_server", &self.language_server)
.finish() .finish()
@ -344,6 +346,7 @@ impl Document {
history: Cell::new(History::default()), history: Cell::new(History::default()),
savepoint: None, savepoint: None,
last_saved_revision: 0, last_saved_revision: 0,
modified_since_accessed: false,
language_server: None, language_server: None,
} }
} }
@ -639,6 +642,9 @@ impl Document {
selection.clone().ensure_invariants(self.text.slice(..)), selection.clone().ensure_invariants(self.text.slice(..)),
); );
} }
// set modified since accessed
self.modified_since_accessed = true;
} }
if !transaction.changes().is_empty() { if !transaction.changes().is_empty() {

@ -369,7 +369,8 @@ impl Editor {
.tree .tree
.traverse() .traverse()
.any(|(_, v)| v.doc == doc.id && v.id != view.id); .any(|(_, v)| v.doc == doc.id && v.id != view.id);
let view = view_mut!(self);
let (view, doc) = current!(self);
if remove_empty_scratch { if remove_empty_scratch {
// Copy `doc.id` into a variable before calling `self.documents.remove`, which requires a mutable // Copy `doc.id` into a variable before calling `self.documents.remove`, which requires a mutable
// borrow, invalidating direct access to `doc.id`. // borrow, invalidating direct access to `doc.id`.
@ -378,7 +379,16 @@ impl Editor {
} else { } else {
let jump = (view.doc, doc.selection(view.id).clone()); let jump = (view.doc, doc.selection(view.id).clone());
view.jumps.push(jump); view.jumps.push(jump);
// Set last accessed doc if it is a different document
if doc.id != id {
view.last_accessed_doc = Some(view.doc); view.last_accessed_doc = Some(view.doc);
// Set last modified doc if modified and last modified doc is different
if std::mem::take(&mut doc.modified_since_accessed)
&& view.last_modified_docs[0] != Some(id)
{
view.last_modified_docs = [Some(view.doc), view.last_modified_docs[0]];
}
}
} }
let view_id = view.id; let view_id = view.id;

@ -75,6 +75,11 @@ pub struct View {
pub jumps: JumpList, pub jumps: JumpList,
/// the last accessed file before the current one /// the last accessed file before the current one
pub last_accessed_doc: Option<DocumentId>, pub last_accessed_doc: Option<DocumentId>,
/// the last modified files before the current one
/// ordered from most frequent to least frequent
// uses two docs because we want to be able to swap between the
// two last modified docs which we need to manually keep track of
pub last_modified_docs: [Option<DocumentId>; 2],
} }
impl View { impl View {
@ -86,6 +91,7 @@ impl View {
area: Rect::default(), // will get calculated upon inserting into tree area: Rect::default(), // will get calculated upon inserting into tree
jumps: JumpList::new((doc, Selection::point(0))), // TODO: use actual sel jumps: JumpList::new((doc, Selection::point(0))), // TODO: use actual sel
last_accessed_doc: None, last_accessed_doc: None,
last_modified_docs: [None, None],
} }
} }

Loading…
Cancel
Save