@@ -407,18 +407,19 @@ fn trim_array_to_length(lua: &Lua, (arr, n): (LuaTable, i32)) -> Result<LuaTable
407407}
408408
409409// https://crates.io/crates/sublime_fuzzy
410- // 废弃:vim 原生matchfuzzypos速度最快,rust 涉及到跨语言,2~8ms,原生0.2ms
411410fn matchfuzzypos ( lua : & Lua , ( list, word, opt) : ( LuaTable , String , LuaTable ) ) -> Result < LuaTable , LuaError > {
412411
413412 let mut matchfuzzy = lua. create_table ( ) ?;
414413 let mut positions = lua. create_table ( ) ?;
415414 let mut scores = lua. create_table ( ) ?;
415+ let key: String = opt. get ( "key" ) ?;
416+ let limit: i32 = opt. get ( "limit" ) ?;
416417
417- let mut iter = list. sequence_values :: < Table > ( ) ;
418+ let mut list_iter = list. sequence_values :: < Table > ( ) ;
418419 let mut i: usize = 1 ;
419- while let Some ( every_item) = iter . next ( ) {
420- let item = every_item?;
421- let t_word: String = item. get ( "word" ) ?;
420+ while let Some ( every_item) = list_iter . next ( ) {
421+ let mut item = every_item?;
422+ let t_word: String = item. get ( key . clone ( ) ) ?;
422423 let mut position: LuaTable = lua. create_table ( ) ?;
423424 let mut score: i32 ;
424425 // let m = best_match(&word, &t_word).expect("No match");
@@ -431,23 +432,49 @@ fn matchfuzzypos(lua: &Lua, (list, word, opt): (LuaTable, String, LuaTable)) ->
431432 position. push ( * p as i32 ) ;
432433 }
433434 score = m. score ( ) as i32 ;
435+
436+ item. set ( "score" , score. clone ( ) ) ;
437+ item. set ( "position" , position. clone ( ) ) ;
434438 matchfuzzy. push ( item. clone ( ) ) ;
435- positions. push ( position. clone ( ) ) ;
436- scores. push ( score. clone ( ) ) ;
437439 }
438440 }
439441 None => {
440442 // catch 异常情况
443+ // do nothing and continue
441444 }
442445 }
443446 i += 1 ;
444447 }
445448
449+ let mut matchfuzzy_vec: Vec < Table > = matchfuzzy
450+ . sequence_values :: < Table > ( )
451+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
452+
453+ matchfuzzy_vec. sort_by ( |a, b| {
454+ let score_a = a. get :: < i32 > ( "score" ) . unwrap_or_default ( ) ;
455+ let score_b = b. get :: < i32 > ( "score" ) . unwrap_or_default ( ) ;
456+ score_b. cmp ( & score_a)
457+ } ) ;
458+
459+ let mut new_matchfuzzy = lua. create_table ( ) ?;
460+ let max: usize = limit as usize ;
461+
462+ // 4. 写回排序后的结果
463+ for ( i, item) in matchfuzzy_vec. into_iter ( ) . enumerate ( ) {
464+ let mut p: LuaTable = item. get ( "position" ) ?;
465+ let mut s: i32 = item. get ( "score" ) ?;
466+ new_matchfuzzy. set ( i+1 , item) ?; // Lua 索引从 1 开始
467+ positions. set ( i+1 , p. clone ( ) ) ?;
468+ scores. set ( i+1 , s. clone ( ) ) ?;
469+ if i > max {
470+ break ;
471+ }
472+ }
473+
446474 let mut result = lua. create_table ( ) ?;
447- result. push ( matchfuzzy ) ;
475+ result. push ( new_matchfuzzy ) ;
448476 result. push ( positions) ;
449477 result. push ( scores) ;
450- // TODO 根据 Score 进行排序
451478 Ok ( result)
452479}
453480
0 commit comments