@@ -66,6 +66,15 @@ pum_compute_size(void)
6666 }
6767}
6868
69+ /*
70+ * Return the minimum width of the popup menu.
71+ */
72+ static int
73+ pum_get_width (void )
74+ {
75+ return p_pw == 0 ? PUM_DEF_WIDTH : p_pw ;
76+ }
77+
6978/*
7079 * Show the popup menu with items "array[size]".
7180 * "array" must remain valid until pum_undisplay() is called!
@@ -93,7 +102,7 @@ pum_display(
93102
94103 do
95104 {
96- def_width = PUM_DEF_WIDTH ;
105+ def_width = pum_get_width () ;
97106 above_row = 0 ;
98107 below_row = cmdline_row ;
99108
@@ -216,16 +225,17 @@ pum_display(
216225 if (def_width < max_width )
217226 def_width = max_width ;
218227
219- if (((col < Columns - PUM_DEF_WIDTH || col < Columns - max_width )
228+ if (((col < Columns - pum_get_width () || col < Columns - max_width )
220229#ifdef FEAT_RIGHTLEFT
221230 && !curwin -> w_p_rl )
222- || (curwin -> w_p_rl && (col > PUM_DEF_WIDTH || col > max_width )
231+ || (curwin -> w_p_rl && (col > pum_get_width () || col > max_width )
223232#endif
224233 ))
225234 {
226235 /* align pum column with "col" */
227236 pum_col = col ;
228237
238+ /* start with the maximum space available */
229239#ifdef FEAT_RIGHTLEFT
230240 if (curwin -> w_p_rl )
231241 pum_width = pum_col - pum_scrollbar + 1 ;
@@ -234,12 +244,71 @@ pum_display(
234244 pum_width = Columns - pum_col - pum_scrollbar ;
235245
236246 if (pum_width > max_width + pum_kind_width + pum_extra_width + 1
237- && pum_width > PUM_DEF_WIDTH )
247+ && pum_width > pum_get_width () )
238248 {
249+ /* the width is too much, make it narrower */
239250 pum_width = max_width + pum_kind_width + pum_extra_width + 1 ;
240- if (pum_width < PUM_DEF_WIDTH )
241- pum_width = PUM_DEF_WIDTH ;
251+ if (pum_width < pum_get_width () )
252+ pum_width = pum_get_width () ;
242253 }
254+ else if (((col > pum_get_width () || col > max_width )
255+ #ifdef FEAT_RIGHTLEFT
256+ && !curwin -> w_p_rl )
257+ || (curwin -> w_p_rl && (col < Columns - pum_get_width ()
258+ || col < Columns - max_width )
259+ #endif
260+ ))
261+ {
262+ /* align right pum edge with "col" */
263+ #ifdef FEAT_RIGHTLEFT
264+ if (curwin -> w_p_rl )
265+ {
266+ pum_col = col + max_width + pum_scrollbar + 1 ;
267+ if (pum_col >= Columns )
268+ pum_col = Columns - 1 ;
269+ }
270+ else
271+ #endif
272+ {
273+ pum_col = col - max_width - pum_scrollbar ;
274+ if (pum_col < 0 )
275+ pum_col = 0 ;
276+ }
277+
278+ #ifdef FEAT_RIGHTLEFT
279+ if (curwin -> w_p_rl )
280+ pum_width = W_ENDCOL (curwin ) - pum_col - pum_scrollbar + 1 ;
281+ else
282+ #endif
283+ pum_width = pum_col - pum_scrollbar ;
284+
285+ if (pum_width < pum_get_width ())
286+ {
287+ pum_width = pum_get_width ();
288+ #ifdef FEAT_RIGHTLEFT
289+ if (curwin -> w_p_rl )
290+ {
291+ if (pum_width > pum_col )
292+ pum_width = pum_col ;
293+ }
294+ else
295+ #endif
296+ {
297+ if (pum_width >= Columns - pum_col )
298+ pum_width = Columns - pum_col - 1 ;
299+ }
300+ }
301+ else if (pum_width > max_width + pum_kind_width
302+ + pum_extra_width + 1
303+ && pum_width > pum_get_width ())
304+ {
305+ pum_width = max_width + pum_kind_width
306+ + pum_extra_width + 1 ;
307+ if (pum_width < pum_get_width ())
308+ pum_width = pum_get_width ();
309+ }
310+ }
311+
243312 }
244313 else if (Columns < def_width )
245314 {
@@ -254,8 +323,8 @@ pum_display(
254323 }
255324 else
256325 {
257- if (max_width > PUM_DEF_WIDTH )
258- max_width = PUM_DEF_WIDTH ; /* truncate */
326+ if (max_width > pum_get_width () )
327+ max_width = pum_get_width () ; /* truncate */
259328#ifdef FEAT_RIGHTLEFT
260329 if (curwin -> w_p_rl )
261330 pum_col = max_width - 1 ;
@@ -1005,4 +1074,5 @@ ui_may_remove_balloon(void)
10051074 ui_remove_balloon ();
10061075}
10071076# endif
1077+
10081078#endif
0 commit comments