]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1306: completion menu rendering can be improved v9.1.1306
authorglepnir <glephunter@gmail.com>
Tue, 15 Apr 2025 17:06:58 +0000 (19:06 +0200)
committerChristian Brabandt <cb@256bit.org>
Tue, 15 Apr 2025 17:06:58 +0000 (19:06 +0200)
Problem:  Parts of the popup menu were rendered twice when the popup was
          at maximum width because the truncation flag was being set too
          liberally.
Solution: Make the truncation condition more precise by only setting it
          when there's exactly one character of space remaining
          (glepnir).

closes: #17108

Signed-off-by: glepnir <glephunter@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/popupmenu.c
src/version.c

index 07c99f052bab311cb0c6d2395a3c6b4bfc4c34bd..38ab24bcece5c01b243d504bf7e9c76b53e5d6b5 100644 (file)
@@ -691,6 +691,10 @@ pum_redraw(void)
            width = 0;
            s = NULL;
            p = pum_get_item(idx, item_type);
+
+           if (j + 1 < 3)
+               next_isempty = pum_get_item(idx, order[j + 1]) == NULL;
+
            if (p != NULL)
                for ( ; ; MB_PTR_ADV(p))
                {
@@ -731,15 +735,13 @@ pum_redraw(void)
                                int         cells;
                                int         over_cell = 0;
                                int         truncated = FALSE;
+                               int         pad = next_isempty ? 0 : 2;
 
                                cells = mb_string2cells(rt , -1);
                                truncated = pum_width == p_pmw
-                                               && pum_width - totwidth < cells;
-
-                               if (pum_width == p_pmw && !truncated
-                                       && (j + 1 < 3 && pum_get_item(idx, order[j + 1]) != NULL))
-                                   truncated = TRUE;
+                                           && pum_width - totwidth < cells + pad;
 
+                               // only draw the text that fits
                                if (cells > pum_width)
                                {
                                    do
@@ -816,12 +818,9 @@ pum_redraw(void)
                            int         cells = (*mb_string2cells)(st, size);
                            char_u      *st_end = NULL;
                            int         over_cell = 0;
+                           int         pad = next_isempty ? 0 : 2;
                            int         truncated = pum_width == p_pmw
-                                               && pum_width - totwidth < cells;
-
-                           if (pum_width == p_pmw && !truncated
-                                   && (j + 1 < 3 && pum_get_item(idx, order[j + 1]) != NULL))
-                               truncated = TRUE;
+                                           && pum_width - totwidth < cells + pad;
 
                            // only draw the text that fits
                            while (size > 0
@@ -910,9 +909,6 @@ pum_redraw(void)
            else
                n = order[j] == CPT_ABBR ? 1 : 0;
 
-           if (j + 1 < 3)
-               next_isempty = pum_get_item(idx, order[j + 1]) == NULL;
-
            // Stop when there is nothing more to display.
            if (j == 2
                    || (next_isempty && (j == 1 || (j == 0
index 7bd2bb6b7b29ad13529bf31d6a5ce15e66df15d5..166c76da620471ea4abe2c67fed148b7910aadfa 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1306,
 /**/
     1305,
 /**/