aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe2022-10-03 14:33:20 +0000
committerGitHub2022-10-03 14:33:20 +0000
commitbcba5d67f9b8650936c391f6c113945291941f51 (patch)
tree6bb230847afae685da97c50214f4515e91d0be50
parent18f6ec7a8eb9ff7d46d4ec1bba52f48364e9c9d7 (diff)
Add goto preview (#2982)
-rw-r--r--helix-term/src/commands/typed.rs39
-rw-r--r--helix-view/src/editor.rs3
2 files changed, 33 insertions, 9 deletions
diff --git a/helix-term/src/commands/typed.rs b/helix-term/src/commands/typed.rs
index 6d0ced65..d5a368a2 100644
--- a/helix-term/src/commands/typed.rs
+++ b/helix-term/src/commands/typed.rs
@@ -1196,18 +1196,41 @@ pub(super) fn goto_line_number(
args: &[Cow<str>],
event: PromptEvent,
) -> anyhow::Result<()> {
- if event != PromptEvent::Validate {
- return Ok(());
+ match event {
+ PromptEvent::Abort => {
+ if let Some(line_number) = cx.editor.last_line_number {
+ goto_line_impl(cx.editor, NonZeroUsize::new(line_number));
+ let (view, doc) = current!(cx.editor);
+ view.ensure_cursor_in_view(doc, line_number);
+ cx.editor.last_line_number = None;
+ }
+ return Ok(());
+ }
+ PromptEvent::Validate => {
+ ensure!(!args.is_empty(), "Line number required");
+ cx.editor.last_line_number = None;
+ }
+ PromptEvent::Update => {
+ if args.is_empty() {
+ if let Some(line_number) = cx.editor.last_line_number {
+ // When a user hits backspace and there are no numbers left,
+ // we can bring them back to their original line
+ goto_line_impl(cx.editor, NonZeroUsize::new(line_number));
+ let (view, doc) = current!(cx.editor);
+ view.ensure_cursor_in_view(doc, line_number);
+ cx.editor.last_line_number = None;
+ }
+ return Ok(());
+ }
+ let (view, doc) = current!(cx.editor);
+ let text = doc.text().slice(..);
+ let line = doc.selection(view.id).primary().cursor_line(text);
+ cx.editor.last_line_number.get_or_insert(line + 1);
+ }
}
-
- ensure!(!args.is_empty(), "Line number required");
-
let line = args[0].parse::<usize>()?;
-
goto_line_impl(cx.editor, NonZeroUsize::new(line));
-
let (view, doc) = current!(cx.editor);
-
view.ensure_cursor_in_view(doc, line);
Ok(())
}
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index 5eff9983..e804a864 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -643,7 +643,7 @@ pub struct Editor {
/// The currently applied editor theme. While previewing a theme, the previewed theme
/// is set here.
pub theme: Theme,
-
+ pub last_line_number: Option<usize>,
pub status_msg: Option<(Cow<'static, str>, Severity)>,
pub autoinfo: Option<Info>,
@@ -717,6 +717,7 @@ impl Editor {
syn_loader,
theme_loader,
last_theme: None,
+ last_line_number: None,
registers: Registers::default(),
clipboard_provider: get_clipboard_provider(),
status_msg: None,