diff src/insexpand.c @ 35405:9a52a7b13fc5 v9.1.0484

patch 9.1.0484: Sorting of completeopt+=fuzzy is not stable Commit: https://github.com/vim/vim/commit/8e56747fd26b3b040b6fcbfb6be41b7d5922c6b5 Author: zeertzjq <zeertzjq@outlook.com> Date: Fri Jun 14 20:04:42 2024 +0200 patch 9.1.0484: Sorting of completeopt+=fuzzy is not stable Problem: Sorting of completeopt+=fuzzy is not stable. Solution: Compare original indexes when scores are the same. (zeertzjq) closes: #14988 Signed-off-by: zeertzjq <zeertzjq@outlook.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Fri, 14 Jun 2024 20:15:06 +0200
parents 76f1a20420fd
children 3f686877921c
line wrap: on
line diff
--- a/src/insexpand.c
+++ b/src/insexpand.c
@@ -1203,11 +1203,13 @@ trigger_complete_changed_event(int cur)
  * pumitem qsort compare func
  */
     static int
-ins_compl_fuzzy_sort(const void *a, const void *b)
+ins_compl_fuzzy_cmp(const void *a, const void *b)
 {
     const int sa = (*(pumitem_T *)a).pum_score;
     const int sb = (*(pumitem_T *)b).pum_score;
-    return sa == sb ? 0 : sa < sb ? 1 : -1;
+    const int ia = (*(pumitem_T *)a).pum_idx;
+    const int ib = (*(pumitem_T *)b).pum_idx;
+    return sa == sb ? (ia == ib ? 0 : (ia < ib ? -1 : 1)) : (sa < sb ? 1 : -1);
 }
 
 /*
@@ -1355,8 +1357,13 @@ ins_compl_build_pum(void)
     } while (compl != NULL && !is_first_match(compl));
 
     if (compl_fuzzy_match && compl_leader != NULL && lead_len > 0)
+    {
+	for (i = 0; i < compl_match_arraysize; i++)
+	    compl_match_array[i].pum_idx = i;
 	// sort by the largest score of fuzzy match
-	qsort(compl_match_array, (size_t)compl_match_arraysize, sizeof(pumitem_T), ins_compl_fuzzy_sort);
+	qsort(compl_match_array, (size_t)compl_match_arraysize,
+				       sizeof(pumitem_T), ins_compl_fuzzy_cmp);
+    }
 
     if (!shown_match_ok)    // no displayed match at all
 	cur = -1;