mirror of
https://github.com/ilyakooo0/helix.git
synced 2024-09-20 12:37:32 +03:00
Add last modified file (gm) (#1093)
This commit is contained in:
parent
418b833d2b
commit
e2b428cc2d
@ -165,13 +165,14 @@ #### Goto mode
|
|||||||
| `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 @@ pub fn doc(&self) -> &'static str {
|
|||||||
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 @@ fn default() -> 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 @@ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|||||||
// .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 @@ pub fn from(text: Rope, encoding: Option<&'static encoding_rs::Encoding>) -> Sel
|
|||||||
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 @@ fn apply_impl(&mut self, transaction: &Transaction, view_id: ViewId) -> bool {
|
|||||||
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 @@ pub fn switch(&mut self, id: DocumentId, action: Action) {
|
|||||||
.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 @@ pub fn switch(&mut self, id: DocumentId, action: Action) {
|
|||||||
} 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);
|
||||||
view.last_accessed_doc = Some(view.doc);
|
// Set last accessed doc if it is a different document
|
||||||
|
if doc.id != id {
|
||||||
|
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 @@ pub fn new(doc: DocumentId) -> Self {
|
|||||||
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…
Reference in New Issue
Block a user