@@ -1196,18 +1196,41 @@ pub(super) fn goto_line_number(
1196 args: &[Cow<str>],
1196 args: &[Cow<str>],
1197 event: PromptEvent,
1197 event: PromptEvent,
1198) -> anyhow::Result<()> {
1198) -> anyhow::Result<()> {
1200+ PromptEvent::Abort => {
1201+ if let Some(line_number) = cx.editor.last_line_number {
1202+ goto_line_impl(cx.editor, NonZeroUsize::new(line_number));
1203+ let (view, doc) = current!(cx.editor);
1204+ view.ensure_cursor_in_view(doc, line_number);
1205+ cx.editor.last_line_number = None;
1199− if event != PromptEvent::Validate {
1209+ PromptEvent::Validate => {
1210+ ensure!(!args.is_empty(), "Line number required");
1211+ cx.editor.last_line_number = None;
1213+ PromptEvent::Update => {
1214+ if args.is_empty() {
1215+ if let Some(line_number) = cx.editor.last_line_number {
1216+ // When a user hits backspace and there are no numbers left,
1217+ // we can bring them back to their original line
1218+ goto_line_impl(cx.editor, NonZeroUsize::new(line_number));
1219+ let (view, doc) = current!(cx.editor);
1220+ view.ensure_cursor_in_view(doc, line_number);
1221+ cx.editor.last_line_number = None;
1200− return Ok(());
1223+ return Ok(());
1225+ let (view, doc) = current!(cx.editor);
1226+ let text = doc.text().slice(..);
1227+ let line = doc.selection(view.id).primary().cursor_line(text);
1228+ cx.editor.last_line_number.get_or_insert(line + 1);
1203− ensure!(!args.is_empty(), "Line number required");
1205 let line = args[0].parse::<usize>()?;
1231 let line = args[0].parse::<usize>()?;
1207 goto_line_impl(cx.editor, NonZeroUsize::new(line));
1232 goto_line_impl(cx.editor, NonZeroUsize::new(line));
1209 let (view, doc) = current!(cx.editor);
1233 let (view, doc) = current!(cx.editor);
1211 view.ensure_cursor_in_view(doc, line);
1234 view.ensure_cursor_in_view(doc, line);