@@ -1196,18 +1196,41 @@ pub(super) fn goto_line_number(
1196
1196
args : & [ Cow < str > ] ,
1197
1197
event : PromptEvent ,
1198
1198
) -> anyhow:: Result < ( ) > {
1199
- if event != PromptEvent :: Validate {
1200
- return Ok ( ( ) ) ;
1199
+ match event {
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 ;
1206
+ }
1207
+ return Ok ( ( ) ) ;
1208
+ }
1209
+ PromptEvent :: Validate => {
1210
+ ensure ! ( !args. is_empty( ) , "Line number required" ) ;
1211
+ cx. editor . last_line_number = None ;
1212
+ }
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 ;
1222
+ }
1223
+ return Ok ( ( ) ) ;
1224
+ }
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 ) ;
1229
+ }
1201
1230
}
1202
-
1203
- ensure ! ( !args. is_empty( ) , "Line number required" ) ;
1204
-
1205
1231
let line = args[ 0 ] . parse :: < usize > ( ) ?;
1206
-
1207
1232
goto_line_impl ( cx. editor , NonZeroUsize :: new ( line) ) ;
1208
-
1209
1233
let ( view, doc) = current ! ( cx. editor) ;
1210
-
1211
1234
view. ensure_cursor_in_view ( doc, line) ;
1212
1235
Ok ( ( ) )
1213
1236
}
0 commit comments