diff --git a/book/src/keymap.md b/book/src/keymap.md index 2ff8bfe6b80c4..bb2641de3ac81 100644 --- a/book/src/keymap.md +++ b/book/src/keymap.md @@ -161,6 +161,8 @@ Jumps to various locations. | `r` | Go to references | `goto_reference` | | `i` | Go to implementation | `goto_implementation` | | `a` | Go to the last accessed/alternate file | `goto_last_accessed_file` | +| `n` | Go to next buffer | `goto_next_buffer` | +| `p` | Go to previous buffer | `goto_previous_buffer` | #### Match mode diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 28657865b580b..f1e8712ec084c 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -262,6 +262,8 @@ impl Command { goto_prev_diag, "Goto previous diagnostic", goto_line_start, "Goto line start", goto_line_end, "Goto line end", + goto_next_buffer, "Goto next buffer", + goto_previous_buffer, "Goto previous buffer", // TODO: different description ? goto_line_end_newline, "Goto line end", goto_first_nonwhitespace, "Goto first non-blank in line", @@ -519,6 +521,41 @@ fn goto_line_start(cx: &mut Context) { ) } +fn goto_next_buffer(cx: &mut Context) { + goto_buffer(cx, Direction::Forward); +} + +fn goto_previous_buffer(cx: &mut Context) { + goto_buffer(cx, Direction::Backward); +} + +fn goto_buffer(cx: &mut Context, direction: Direction) { + let buf_cur = current!(cx.editor).1.id(); + let buf_count = cx.editor.documents.iter().count(); + + if buf_count > 1 { + if let Some(pos) = cx + .editor + .documents + .iter() + .position(|(_, x)| x.id() == buf_cur) + { + let goto_id = if direction == Direction::Forward { + if pos < buf_count - 1 { + cx.editor.documents.iter().nth(pos + 1).unwrap().0 + } else { + cx.editor.documents.iter().next().unwrap().0 + } + } else if pos > 0 { + cx.editor.documents.iter().nth(pos - 1).unwrap().0 + } else { + cx.editor.documents.iter().last().unwrap().0 + }; + cx.editor.switch(goto_id, Action::Replace); + } + } +} + fn extend_to_line_start(cx: &mut Context) { let (view, doc) = current!(cx.editor); goto_line_start_impl(view, doc, Movement::Extend) diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs index 5453020ec634f..839419da05f6c 100644 --- a/helix-term/src/keymap.rs +++ b/helix-term/src/keymap.rs @@ -444,6 +444,8 @@ impl Default for Keymaps { "m" => goto_window_middle, "b" => goto_window_bottom, "a" => goto_last_accessed_file, + "n" => goto_next_buffer, + "p" => goto_previous_buffer, }, ":" => command_mode,