File tree Expand file tree Collapse file tree 3 files changed +1169
-4
lines changed Expand file tree Collapse file tree 3 files changed +1169
-4
lines changed Original file line number Diff line number Diff line change @@ -1398,15 +1398,29 @@ fn debug_remote(
1398
1398
1399
1399
fn tutor (
1400
1400
cx : & mut compositor:: Context ,
1401
- _args : & [ Cow < str > ] ,
1401
+ args : & [ Cow < str > ] ,
1402
1402
event : PromptEvent ,
1403
1403
) -> anyhow:: Result < ( ) > {
1404
1404
if event != PromptEvent :: Validate {
1405
1405
return Ok ( ( ) ) ;
1406
1406
}
1407
1407
1408
- let path = helix_loader:: runtime_dir ( ) . join ( "tutor" ) ;
1409
- cx. editor . open ( & path, Action :: Replace ) ?;
1408
+ let default_tutor = helix_loader:: runtime_dir ( ) . join ( "tutor" ) ;
1409
+
1410
+ let path = if args. is_empty ( ) {
1411
+ None
1412
+ } else {
1413
+ let name = args[ 0 ] . to_lowercase ( ) ;
1414
+ if name. eq ( "default" ) {
1415
+ None
1416
+ } else {
1417
+ let p = helix_loader:: runtime_dir ( ) . join ( "tutors" ) . join ( & name) ;
1418
+ ( p. exists ( ) ) . then ( || p)
1419
+ }
1420
+ } ;
1421
+
1422
+ cx. editor
1423
+ . open ( & path. unwrap_or ( default_tutor) , Action :: Replace ) ?;
1410
1424
// Unset path to prevent accidentally saving to the original tutor file.
1411
1425
doc_mut ! ( cx. editor) . set_path ( None ) ?;
1412
1426
Ok ( ( ) )
@@ -2225,7 +2239,7 @@ pub const TYPABLE_COMMAND_LIST: &[TypableCommand] = &[
2225
2239
aliases : & [ ] ,
2226
2240
doc : "Open the tutorial." ,
2227
2241
fun : tutor,
2228
- completer : None ,
2242
+ completer : Some ( completers :: tutor ) ,
2229
2243
} ,
2230
2244
TypableCommand {
2231
2245
name : "goto" ,
Original file line number Diff line number Diff line change @@ -280,6 +280,52 @@ pub mod completers {
280
280
names
281
281
}
282
282
283
+ pub fn tutor ( _editor : & Editor , input : & str ) -> Vec < Completion > {
284
+ let mut names: Vec < String > = std:: fs:: read_dir ( & helix_loader:: runtime_dir ( ) . join ( "tutors" ) )
285
+ . map ( |entries| {
286
+ entries
287
+ . filter_map ( |entry| {
288
+ entry. ok ( ) . and_then ( |entry| {
289
+ Some (
290
+ entry
291
+ . path ( )
292
+ . file_stem ( )
293
+ . unwrap ( )
294
+ . to_string_lossy ( )
295
+ . into_owned ( ) ,
296
+ )
297
+ } )
298
+ } )
299
+ . collect ( )
300
+ } )
301
+ . unwrap_or_default ( ) ;
302
+
303
+ names. push ( "default" . into ( ) ) ;
304
+ names. sort ( ) ;
305
+ names. dedup ( ) ;
306
+
307
+ let mut names: Vec < _ > = names
308
+ . into_iter ( )
309
+ . map ( |name| ( ( 0 ..) , Cow :: from ( name) ) )
310
+ . collect ( ) ;
311
+
312
+ let matcher = Matcher :: default ( ) ;
313
+
314
+ let mut matches: Vec < _ > = names
315
+ . into_iter ( )
316
+ . filter_map ( |( _range, name) | {
317
+ matcher. fuzzy_match ( & name, input) . map ( |score| ( name, score) )
318
+ } )
319
+ . collect ( ) ;
320
+
321
+ matches. sort_unstable_by ( |( name1, score1) , ( name2, score2) | {
322
+ ( Reverse ( * score1) , name1) . cmp ( & ( Reverse ( * score2) , name2) )
323
+ } ) ;
324
+ names = matches. into_iter ( ) . map ( |( name, _) | ( ( 0 ..) , name) ) . collect ( ) ;
325
+
326
+ names
327
+ }
328
+
283
329
pub fn theme ( _editor : & Editor , input : & str ) -> Vec < Completion > {
284
330
let mut names = theme:: Loader :: read_names ( & helix_loader:: runtime_dir ( ) . join ( "themes" ) ) ;
285
331
names. extend ( theme:: Loader :: read_names (
You can’t perform that action at this time.
0 commit comments